问题

:::tips 在实际的项目中,多个服务都会远程调用某个服务,按照之前的方法,就需要在多个服务都创建这个服务的FeignClient,这么一来代码就重复了

可以将所有的FeignClient抽取为独立模块,把所有的实体类、Feign的配置都可以放到这个模块中,提供给所有服务使用 :::

实现

创建模块

:::tips 在父工程下创建一个子工程,命名为feign-api
image.png :::

引入依赖

:::tips 在feign-api工程中引入Feign的依赖 :::

  1. <!-- OpenFeign依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>

编写代码

:::tips 在feign-api工程中创建一个client包,在client包中创建XxxClient接口,在接口上打上@FeignClient注解,并指定其value属性为需要调用的服务的名称

如果需要在此接口中所有的请求路径前再加一层路径,可以通过@FeignClient注解的path属性指定路径

然后在接口中编写抽象方法,指定我们需要调用的微服务的请求方式、请求路径、请求体等参数,也就是将服务提供者Controller类中需要调用的方法(带上@GetMapping、@PostMapping等注解,注意保持完整的请求路径)复制过来改造为抽象方法

注意:

  • 如果是Get请求,需要使用@RequestParam注解来绑定普通参数(注意非必传的参数配置@RequestParam注解的required属性为false),并指定@RequestParam注解的value属性为参数名称
  • 不管是什么请求方式,都需要使用绑定参数的注解来设置参数名称 ::: ```java @FeignClient(value = “服务提供者的名称”) public interface XxxClient {

    @GetMapping(“请求路径”) public 返回值 方法名(@注解(绑定参数名) 请求参数);

}

  1. <a name="Ee6xg"></a>
  2. ### 引入依赖
  3. :::tips
  4. 然后在服务消费者的pom文件中引入feign-api工程的依赖
  5. :::
  6. <a name="nroNx"></a>
  7. ### 启动类注解
  8. :::tips
  9. 在服务消费者的启动类上需要打上@EnableFeignClients注解,用来扫描打上了@FeignClient注解的接口
  10. 注意如果接口不在启动类所在的包及其子包下,需要指定注解的basePackages或clients属性来扫描到我们编写的XxxClient:
  11. - 方式一:指定Feign扫描的包(推荐)
  12. - @EnableFeignClients(basePackages = "com.xujiahao.client")
  13. - 方式二:指定需要加载的Client接口
  14. - @EnableFeignClients(clients = {XxxClient.class})
  15. :::
  16. ```java
  17. //扫描打上了@FeignClient注解的接口
  18. @EnableFeignClients(basePackages = "com.xujiahao.client")
  19. @SpringBootApplication
  20. public class XxxApplication{
  21. public static void main(String[] args){
  22. SpringApplication.run(XxxApplication.class,args);
  23. }
  24. }

调用

:::tips 在服务消费者中需要调用服务提供者API的类中注入我们编写的接口,然后在方法中调用注入对象的方法 :::

  1. @SpringBootTest
  2. public class MyTest{
  3. //注入我们编写的接口
  4. @Autowired
  5. private XxxClient xxxClient;
  6. @Test
  7. public void test(){
  8. //没有返回值就不用接收
  9. 返回值 对象名 = xxxClient.方法名(请求参数);
  10. }
  11. }