其他分享
首页 > 其他分享> > Feign 与 OpenFeign

Feign 与 OpenFeign

作者:互联网

Feign 与 OpenFeign

2022-08-03 21:51·BUG弄潮儿

1. 什么是Feign

Netflix Feign 是 Netflix 公司发布的一种实现负载均衡和服务调用的开源组件。Spring Cloud 将其与 Netflix 中的其他开源服务组件(例如 Eureka、Ribbon 以及 Hystrix 等)一起整合进 Spring Cloud Netflix 模块中,整合后全称为 Spring Cloud Netflix Feign Feign 对 Ribbon (
http://c.biancheng.net/springcloud/ribbon.html)进行了集成,利用 Ribbon 维护了一份可用服务清单,并通过 Ribbon 实现了客户端的负载均衡。Feign 是一种声明式服务调用组件,它在 RestTemplate 的基础上做了进一步的封装。通过 Feign,我们只需要声明一个接口并通过注解进行简单的配置(类似于 Dao 接口上面的 Mapper 注解一样)即可实现对 HTTP 接口的绑定。通过 Feign,我们可以像调用本地方法一样来调用远程服务,而完全感觉不到这是在进行远程调用。Feign 支持多种注解,例如 Feign 自带的注解以及 JAX-RS 注解等,但遗憾的是 Feign 本身并不支持 Spring MVC 注解,这无疑会给广大 Spring 用户带来不便。

2. 什么是openFeign

2019 年 Netflix 公司宣布 Feign 组件正式进入停更维护状态,于是 Spring 官方便推出了一个名为 OpenFeign 的组件作为 Feign 的替代方案。

OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign。OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持,例如 @RequestMapping、@GetMapping 和 @PostMapping 等。

常用注解

注解

说明

@FeignClient

该注解用于通知 OpenFeign 组件对 @RequestMapping 注解下的接口进行解析,并通过动态代理的方式产生实现类,实现负载均衡和服务调用。

@EnableFeignClients

该注解用于开启 OpenFeign 功能,当 Spring Cloud 应用启动时,OpenFeign 会扫描标有 @FeignClient 注解的接口,生成代理并注册到 Spring 容器中。

@RequestMapping

Spring MVC 注解,在 Spring MVC 中使用该注解映射请求,通过它来指定控制器(Controller)可以处理哪些 URL 请求,相当于 Servlet 中 web.xml 的配置。

@GetMapping

Spring MVC 注解,用来映射 GET 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.GET) 。

@PostMapping

Spring MVC 注解,用来映射 POST 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.POST) 。

3. Feign与OpenFeign的对比

相同点

不同点

4. openFeign使用

引入依赖

<!-- openfeign依赖 --><dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- openfeign优化请求连接池依赖 --><dependency>     <groupId>io.github.openfeign</groupId>     <artifactId>feign-httpclient</artifactId></dependency>

定义远程调用接口

@Component@FeignClient(value = "service5")public interface FeignService {        @GetMapping("/api/v1/service5")     List<Integer> get();   }

启动类添加注解@EnableFeignClients

@EnableFeignClients@EnableEurekaClient@SpringBootApplicationpublic class Service3Application {     public static void main(String[] args) {        SpringApplication.run(Service3Application.class, args);    }}

Controller引入调用

@RestController@RequestMapping("api/v1/service3")public class Controller {  @Resource  private FeignService feignService;  @GetMapping  public List<Integer> get() {      return feignService.get();  }}

5. OpenFeign超时处理

openFeign 客户端的默认超时时间为 1 秒钟,如果服务端处理请求的时间超过 1 秒就会报错。为了避免这样的情况,我们需要对 OpenFeign 客户端的超时时间进行控制。

yml添加如下进行配置

ribbon:  ReadTimeout: 6000 #建立连接所用的时间,适用于网络状况正常的情况下,两端两端连接所用的时间  ConnectionTimeout: 6000 #建立连接后,服[[=务器读取到可用资源的时间feign:  client:     httpclient:       enabled: true # 开启 HttpClient优化连接池  compression:     request:       enabled: true # 开启请求数据的压缩功能       mime-types: text/xml,application/xml, application/json # 压缩类型       min-request-size: 1024 # 最小压缩值标准,当数据大于 1024 才会进行压缩     response:       enabled: true # 开启响应数据压缩功能

6. OpenFeign日志增强

yml添加日志级别声明

logging:  level:    com.ftc.service3.FeignService: debug     #feign日志以什么样的级别监控该接口

说明:

创建日志配置类

@Configurationpublic class ConfigBean {  /**    * OpenFeign 日志增强    * 配置 OpenFeign 记录哪些内容    */  @Bean  Logger.Level feginLoggerLevel() {      return Logger.Level.FULL;  }}

该配置的作用是通过配置的 Logger.Level 对象告诉 OpenFeign 记录哪些日志内容。Logger.Level 的具体级别如下:

FULL级别如图:

 

 

标签:Feign,调用,OpenFeign,Spring,接口,注解
来源: https://www.cnblogs.com/caicz/p/16597698.html