当前位置: 首页 > news >正文

微服务demo(三)nacosfeign

一、feign使用

1、集成方法
1.1、pom

consumer添加依赖

 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency>
1.2、启动类

consumer启动类加上@EnableFeignClients注解,即开启feign;

1.3、consumer调用provider:

编写一个中间service,consumer调用service,service调用provider。这个service类头加@FeignClient注解:

@FeignClient(value = "my-service",path = "/myProvider")

(1)value:provider配置文件中的spring.application.name,

    注意这里的value值不分大小写,my-service和MY-SERVICE都可以。

(2)path:如果provider在配置文件里面配置了server.context-path,FeignClient就需要指明path。

2、调用方法

上面提到的service,关于service调用provider传参的问题:

2.1、无参调用

post、get请求都可以

2.2、非对象参数

如Integer、String等,适用于get请求。

service方法上需要加@RequestParam注解,且括号中一定要有值(参数的别名)和被调用方provider的参数名保持一致,被调用方可加@RequestParam也可不加;

2.3、对象参数

javaBean,map,list等,只适用于post请求。

被调用方provider加@RequestBody注解,调用方service的方法可加可不加;

2.4、header头部参数:

provider和service方法上都使用@RequestHeader注解,且value指明参数别名。

二、集成demo

1、初版

1.1、父pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.demo.nacos</groupId><artifactId>nacos-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>nacos-demo</name><packaging>pom</packaging><!-- springBoot --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version></parent><!-- 模块说明:这里声明多个子模块 --><modules><module>provider</module><module>consumer</module><module>nacos-common</module></modules><!-- 版本说明:这里统一管理依赖的版本号 --><dependencyManagement><dependencies><!-- SpringCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.RELEASE</version></dependency><!-- SpringCloud Alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.1.0.RELEASE</version></dependency><!--服务注册--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>0.2.2.RELEASE</version></dependency><!-- nacos 注册中心客户端 --><!--        <dependency>--><!--            <groupId>com.alibaba.cloud</groupId>--><!--            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>--><!--            <version>2.1.0.RELEASE</version>--><!--        </dependency>--><!--集中配置--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.1.0.RELEASE</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--nocas必须在web环境下--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
1.2、provider:

(1)pom:

 <parent><artifactId>nacos-demo</artifactId><groupId>com.demo.nacos</groupId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>com.demo.nacos</groupId><artifactId>nacos-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- SpringCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId></dependency><!-- SpringCloud Alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId></dependency><!--服务注册--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--集中配置--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency></dependencies>

(2)bootstrap:

spring:application:name: my-servicecloud:compatibility-verifier:enabled: falsenacos:#服务注册discovery:server-addr: xxx.xx.xxx:8848#配置中心config:server-addr: xxx.xx.xxx:8848group: wtyyprofiles:active: prod
server:port: 1111servlet:context-path: /myProvider

 (3)启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
}

(4)controller接口

import com.demo.nacos.common.dto.UserDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;@RestController
@RequestMapping("/configTest")
//刷新配置
@RefreshScope
public class ProviderTestController {@Value("${user.text}")private String userText;private static Logger logger = LoggerFactory.getLogger(ProviderTestController.class);/*** 1、无参 无返回* @param request* @return* @throws InterruptedException*/@GetMapping("/hanNoParam")public void getUserText(HttpServletRequest request) throws InterruptedException {logger.info("调用无参接口");}/*** 2、有参* @return* @throws InterruptedException*/@GetMapping("/hanParams")public String hanParams(String userName) throws InterruptedException {logger.info("调用有参接口");return userName+":"+userText;}/*** 3、有参,对象参数* @return* @throws InterruptedException*/@PostMapping("/hanObjParams")public UserDTO hanObjParams(@RequestBody UserDTO userDTO) throws InterruptedException {logger.info("调用对象参数接口");return userDTO;}/*** 4、参数加header* @return* @throws InterruptedException*/@PostMapping("/hanParamsAndHeader")public String hanParamsAndHeader(@RequestBody UserDTO userDTO,@RequestHeader("token") String token) throws InterruptedException {logger.info("调用参数和header接口");return userDTO.getUserName()+"的token:"+token;}
}
 1.3、consumer:

(1)pom:

<parent><artifactId>nacos-demo</artifactId><groupId>com.demo.nacos</groupId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>com.demo.nacos</groupId><artifactId>nacos-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- SpringCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId></dependency><!-- SpringCloud Alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId></dependency><!--服务注册--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--集中配置--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency></dependencies>

(2) bootstrap:

spring:application:name: my-consumercloud:compatibility-verifier:enabled: falsenacos:#服务注册discovery:server-addr: xxx.xx.xxx:8848#配置中心config:server-addr: xxx.xx.xxx:8848group: wtyy
server:port: 2222servlet:context-path: /myConsumer

(3) 启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}

(4) service:重点

import com.demo.nacos.common.dto.UserDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@FeignClient(value = "my-service",path = "/myProvider")
public interface NacosConfigTestService {@RequestMapping("/configTest/hanNoParam")void hanNoParam();@RequestMapping("/configTest/hanParams")String hanParams(@RequestParam("userName")String userName);@RequestMapping("/configTest/hanObjParams")UserDTO hanObjParams(@RequestBody UserDTO userDTO);@RequestMapping("/configTest/hanParamsAndHeader")String hanParamsAndHeader(@RequestBody UserDTO userDTO,@RequestHeader("token") String token);
}

(5) controler:

import com.demo.nacos.common.dto.UserDTO;
import com.demo.nacos.consumer.service.NacosConfigTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;@RestController
@RequestMapping("/consumerTest")
public class ConsumerTestController {@Autowiredprivate NacosConfigTestService nacosConfigTestService;@GetMapping("/hanNoParam")public void getTemp(HttpServletRequest request) throws InterruptedException {nacosConfigTestService.hanNoParam();}@GetMapping("/hanParams")public String hanParams(String userName) throws InterruptedException {return nacosConfigTestService.hanParams(userName);}@PostMapping("/hanObjParams")public UserDTO hanObjParams(@RequestBody UserDTO userDTO) throws InterruptedException {return nacosConfigTestService.hanObjParams(userDTO);}@PostMapping("/hanParamsAndHeader")public String hanParamsAndHeader(@RequestBody UserDTO userDTO,HttpServletRequest request) throws InterruptedException {String token = request.getHeader("token");return nacosConfigTestService.hanParamsAndHeader(userDTO,token);}
}
1.4、测试

分别启动provider、consumer,可以看到都注册到nacos上了:

(1)非对象参数

(2)对象参数

(3)对象参数&header

2、feign的继承特性

上面的代码有很多重复的地方,下面利用feign的继承特性进行抽取。

http://www.lryc.cn/news/327471.html

相关文章:

  • 学浪视频如何录屏保存?
  • c++中2种返回变量类型名称的方法
  • python仿真报告自动化——excite TD齿轮角加速度级计算
  • 如何系统的学习 C#
  • python爬虫----python列表高级
  • 目标检测的相关模型图:YOLO系列和RCNN系列
  • Linux基础命令2
  • IP组播基础
  • Pytorch的named_children, named_modules和named_children
  • 3.28总结
  • C# 命名空间的两种定义哦写法与区别
  • Rustdesk客户端编译后固定密码不稳定时好时坏
  • 小程序利用WebService跟asp.net交互过程发现的问题并处理
  • TitanIDE与传统 IDE 比较
  • 反序列化动态调用 [NPUCTF2020]ReadlezPHP1
  • Hadoop面试重点
  • 【ONE·基础算法 || 分治·快排并归】
  • Python 从0开始 一步步基于Django创建项目(11)注册新用户
  • 银行监管报送系统介绍(十二):非居民金融账户涉税信息报送
  • 土壤有机质空间分布数据
  • Unity图集编辑器
  • 【JS笔记】JavaScript语法 《基础+重点》 知识内容,快速上手(六)
  • hbase启动错误-local host is“master:XXXX“ destination is:master
  • 基于SpringBoot的“招生管理系统”的设计与实现(源码+数据库+文档+PPT)
  • Chinese-LLaMA-Alpaca-2模型量化部署测试
  • flutter 打包成web应用后怎么通过url跳转页面
  • 【设计模式】中介者模式的应用
  • 【微服务篇】分布式事务方案以及原理详解
  • String 类的常用方法都有那些?
  • 用XMLHttpRequest发送和接收JSON数据