OpenFegin介绍

Fegin是奈飞开发的声明式,模版化的HTTP客户端,其灵感来自Retrofit.Fegin可以帮助我们便捷,优雅的调用HTTP API。Fegin支持多种注解,Fegin使用在消费端。
Spring Cloud openfeign对Fegin进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Nacos,从而使得Fegin的使用更加方便
优势
Fegin可以做到使用HTTP请求远程服务时就像调用本地方法一样的体验。开发者完全感知不到这是远程方法,更感知不到这是个HTTP的请求。它像Dubbo一样,消费者直接调用接口方法调用provider,而不需要通过常规的HTTP客户端构造请求在解析返回数据。它解决了让开发者调用远程接口就像调用本地方法一样。无需关注与远程的交互细节,更无须关注分布式环境的开发

OpenFegin快速使用

  1. 引入依赖```xml
    1. <groupId>org.springframework.cloud</groupId>
    2. <artifactId>spring-cloud-starter-openfeign</artifactId>
    ```
  1. 编写调用接口+`@FeginClient注解````java package com.tuliingxueyuan.order.fegin;

import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping;

/**

  • @Author:Mr Wang
  • @QQ:1046065349
  • @CreateTime: 2021/10/30 13:55
  • @Descirption: 请求Stock服务端的接口,使用OpenFeign来实现
  • 使用 @FeignClient注解来表示这是一个调用的接口
  • name :指定要调用rest接口服务的名称
  • path: 指定要调用rest接口所在的controller的RequestMapping
  • 如果没有指定的requestmapping就不要去指定了 */

@FeignClient(name = “stock-service”,path = “/stock”) public interface StockFeignService { /**

  1. * 声明要调用rest接口对应的方法,方法直接从要调用的服务端的方法名就OK
  2. * 需要跟调用的方法注解对上就OK,这里不需要写实现类
  3. *
  4. * 然后就可以在客户端的controller中直接调用对应的方法
  5. */
  6. @RequestMapping("/reduce")
  7. String reduce();

}

  1. 3. 调用端在启动类上添加@EnableFeighClients注解```java
  2. package com.tuliingxueyuan.order;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.boot.web.client.RestTemplateBuilder;
  6. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  7. import org.springframework.cloud.openfeign.EnableFeignClients;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.web.client.RestTemplate;
  10. /**
  11. * @Author:Mr Wang
  12. * @QQ:1046065349
  13. * @CreateTime: 2021/10/29 09:53
  14. * @Descirption: 订单类的启动类
  15. */
  16. @SpringBootApplication
  17. @EnableFeignClients
  18. public class OrderApplication {
  19. public static void main(String[] args) {
  20. SpringApplication.run(OrderApplication.class,args);
  21. }
  22. @Bean
  23. @LoadBalanced //负载均衡器
  24. public RestTemplate restTemplate(RestTemplateBuilder builder){
  25. RestTemplate restTemplate = builder.build();
  26. return restTemplate;
  27. }
  28. }
  1. 发起调用,像在本地一样调用远程服务```java package com.tuliingxueyuan.order.contrller;

import com.tuliingxueyuan.order.fegin.StockFeignService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;

/**

  • @Author:Mr Wang
  • @QQ:1046065349
  • @CreateTime: 2021/10/29 09:46
  • @Descirption: */

@RestController @RequestMapping(“/order”) public class OrderController {

/ @Autowired RestTemplate restTemplate;/

  1. //注入OpenFeign的接口
  2. @Autowired
  3. StockFeignService stockFeignService;
  4. @RequestMapping("/add")
  5. public String add(){
  6. System.out.println("下单成功!");
  7. //使用远程工具进行调用
  8. // String message = restTemplate.getForObject("http://localhost:8011/stock/reduce", String.class);
  9. //使用nacos注册服务中心发现调用订单系统
  10. //String message = restTemplate.getForObject("http://stock-service/stock/reduce", String.class);
  11. String message = stockFeignService.reduce();
  12. System.out.println(message);
  13. return "Hello World"+message;
  14. }

}

  1. <a name="7450fb1f"></a>
  2. ## OpenFegin日志配置
  3. Fegin提供了很多的扩展机制,让用户可以更加灵活的使用
  4. <a name="34ed12bd"></a>
  5. ### 1. 日志配置
  6. 有时候我们遇到bug,比如接口调用失败,参数没收到等问题,或者想看看调用的性能,就需要配置Fegin的日志,以此让Fegin把请求信息书出来<br />
  7. **定义一个配置类,指定日志级别**
  8. ```java
  9. //此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置
  10. public class FeignConfig{
  11. @Bean
  12. public Logger.Level feignLoggerLevel(){
  13. return Logger.Level.FULL;
  14. }
  15. }

通过源码可以看到日志等级有四种,分别是

  • NONE:性能最佳,适用于生成,不记录任何日志
  • SASIC:适用于生产环境追踪问题,仅记录请求方法,URL、响应状态码以及执行时间
  • HEADERS:记录BASIC级别的基础上,记录请求和响应的header
  • FULL:比较适用于开发及测试环境定位问题,记录请求和响应的header、body和元数据

2.局部配置

Feign的配置类上去掉注解,在调用的服务上增加configuration的属性

  1. package com.tuliingxueyuan.order.fegin;
  2. import com.tuliingxueyuan.order.config.FeignConfig;
  3. import org.springframework.cloud.openfeign.FeignClient;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. /**
  6. * @Author:Mr Wang
  7. * @QQ:1046065349
  8. * @CreateTime: 2021/10/30 13:55
  9. * @Descirption: 请求Stock服务端的接口,使用OpenFeign来实现
  10. * 使用 @FeignClient注解来表示这是一个调用的接口
  11. * name :指定要调用rest接口服务的名称
  12. * path: 指定要调用rest接口所在的controller的RequestMapping
  13. * 如果没有指定的requestmapping就不要去指定了
  14. */
  15. @FeignClient(name = "stock-service",path = "/stock",configuration = FeignConfig.class)
  16. public interface StockFeignService {
  17. /**
  18. * 声明要调用rest接口对应的方法,方法直接从要调用的服务端的方法名就OK
  19. * 需要跟调用的方法注解对上就OK,这里不需要写实现类
  20. *
  21. * 然后就可以在客户端的controller中直接调用对应的方法
  22. */
  23. @RequestMapping("/reduce")
  24. String reduce();
  25. }

3.配置文件实现feign日志局部输出

  1. # 配置日志级别为debug,Springboot默认的日志是info,fegin默认的是debug
  2. logging:
  3. level:
  4. com.tuliingxueyuan.order.fegin: debug
  5. #使用配置文件配置Feign的局部日志文件
  6. feign:
  7. client:
  8. config:
  9. stock-service:#需要打印日志的服务名称
  10. loggerlevel: FULL

OpenFegin契约配置

Spring Cloud在Feign的基础上做了扩展,使用Spring MVC的注解来完成Feign的功能。原生的Feign是不支持Spring MVC的注解的。如果你想在Spring Cloud中使用原生的注解方式来定义客户端也是客户的。通过配置契约来改变这个配置,Spring Cloud中默认是SpringMvcContract

  1. 修改契约配置,支持Feign的原生注解```java /**
    • 修改契约的配置,支持Feign原生的注解 */ public Contract FeignContract(){ return new Contract.Default(); } ```

注意:修改了契约配置以后,StockFeignService不再支持springmvc的注解,需要使用原生的

  1. OrderFeignService中配置使用Feign的原生注解```java @FeignClient(value=”stock-service”,path=”/stock”) public interface StockFeignService{
    1. @RequestLine("GET /reduce")
    2. R reduce();
    } ```
  1. 补充,也可以通过yml的配置契约```yml feign:
    1. client:
    2. config:
    3. stock-service:#对应的微服务
    4. contract: feign.Contract.Default #指定Feign原生注解契约配置
    ```

OpenFegin超时时间配置

通过Options可以配置连接超时时间和读取超时时间。Options的第一个参数是连接的超时时间,默认值是2s;第二个是请求处理的时间,默认值是5s
全局配置

  1. @Configuration
  2. public class FeignConfig{
  3. @Bean
  4. public Request.Options options(){
  5. return new Request.Options(5000,10000)
  6. }
  7. }

yml中配置

  1. feign:
  2. client:
  3. config:
  4. stock-service:#对应微服务名称
  5. # 连接超时的时间
  6. connectTimeout: 5000
  7. # 请求处理超时时间
  8. readTimeout: 10000

补充说明:Feign的底层用的是Ribbon,但是超时时间以Feign为准

OpenFegin自定义拦截器

需要实现RequestInterceptor接口,重写apply的方法,然后在注册到Bean中去

其他

OpenFeign案例:密码: bqjp