Feign是声明式的服务调用工具,我们只需创建一个接口并用注解的方式来配置它,就可以实现对某个服务接口的调用,简化了直接使用RestTemplate来调用服务接口的开发量。Feign具备可插拔的注解支持,同时支持Feign注解、JAX-RS注解及SpringMvc注解。当使用Feign时,Spring Cloud集成了Ribbon和Eureka以提供负载均衡的服务调用及基于Hystrix的服务容错保护功能。

Echo演示

Echo 服务

项目结构

  1. ├── pom.xml
  2. └── src
  3. ├── main
  4. │ ├── java
  5. │ │ └── com
  6. │ │ └── example
  7. │ │ └── cloud
  8. │ │ └── nacos
  9. │ │ ├── NacosEchoApplication.java
  10. │ │ └── controller
  11. │ │ └── NacosEchoController.java
  12. │ └── resources
  13. │ └── application.yaml
  14. └── test
  15. └── java
  16. 11 directories, 4 files

maven

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <!-- 引入 Spring Cloud Alibaba Nacos Discovery 相关依赖,将 Nacos 作为注册中心,并实现对其的自动配置 -->
  6. <dependency>
  7. <groupId>com.alibaba.cloud</groupId>
  8. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  9. </dependency>

application.yaml

  1. server:
  2. port: 6688
  3. spring:
  4. application:
  5. name: nacos-echo-service # 应用名
  6. cloud:
  7. nacos:
  8. # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类
  9. discovery:
  10. server-addr: 127.0.0.1:8848 # Nacos 服务器地址

controller

  1. @RestController
  2. public class NacosEchoController {
  3. @Value("${server.port}")
  4. private Integer serverPort;
  5. @GetMapping("/echo")
  6. public String echo(String s) {
  7. return serverPort+" [echo]:" + s;
  8. }
  9. }

通过修改启动配置的server.port属性。启动两个echo 服务。端口分别是6688和6689
image.png

OpenFeign

maven 配置

  1. <dependencies>
  2. <!-- 引入 SpringMVC 相关依赖,并实现对其的自动配置 -->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-web</artifactId>
  6. </dependency>
  7. <!-- 引入 Spring Cloud Alibaba Nacos Discovery 相关依赖,将 Nacos 作为注册中心,并实现对其的自动配置 -->
  8. <dependency>
  9. <groupId>com.alibaba.cloud</groupId>
  10. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  11. </dependency>
  12. <!-- 引入 Spring Cloud OpenFeign 相关依赖,使用 OpenFeign 提供声明式调用,并实现对其的自动配置 -->
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-starter-openfeign</artifactId>
  16. </dependency>
  17. </dependencies>

由于OpenFeign内置了对Ribbon的支持,所以它包含了Ribbon的依赖引用

application.yaml

  1. server:
  2. port: 28080 # 服务器端口。默认为 8080
  3. spring:
  4. application:
  5. name: openfeign-echo-service # Spring 应用名
  6. cloud:
  7. nacos:
  8. # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类
  9. discovery:
  10. server-addr: 127.0.0.1:8848 # Nacos 服务器地址

service

  1. @FeignClient(name = "nacos-echo-service")
  2. public interface EchoOpenFeignService {
  3. @GetMapping("/echo")
  4. String echo(@RequestParam("s") String s);
  5. }

controller

  1. @RestController
  2. public class EchoOpenFeignController {
  3. @Autowired
  4. private EchoOpenFeignService echoOpenFeignService;
  5. @GetMapping("/echo")
  6. public String feignEcho(String s) {
  7. // 使用 Feign 调用接口
  8. String response = echoOpenFeignService.echo(s);
  9. // 返回结果
  10. return "openfeign:" + response;
  11. }
  12. }

在启动类增加 @EnableFeignClients 注解,声明开启 Feign 客户端的功能。

  1. @SpringBootApplication
  2. @EnableFeignClients
  3. public class OpenfeignEchoApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(OpenfeignEchoApplication.class,args);
  6. }
  7. }

验证服务 http://localhost:28080/echo?s=test

RequestParam.value() was empty on parameter 0)

https://github.com/spring-cloud/spring-cloud-openfeign/issues/178
https://blog.csdn.net/qq_38425719/article/details/104558938
https://stackoverflow.com/questions/44313482/feign-client-with-spring-boot-requestparam-value-was-empty-on-parameter-0

http://www.javashuo.com/article/p-wgqcolri-uo.html