Feign 与 OpenFeign

简介: Feign 与 OpenFeign

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的对比

相同点

  • Feign 和 OpenFeign 都是 Spring Cloud 下的远程调用和负载均衡组件。
  • Feign 和 OpenFeign 作用一样,都可以实现服务的远程调用和负载均衡。
  • Feign 和 OpenFeign 都对 Ribbon 进行了集成,都利用 Ribbon 维护了可用服务清单,并通过 Ribbon 实现了客户端的负载均衡。
  • Feign 和 OpenFeign 都是在服务消费者(客户端)定义服务绑定接口并通过注解的方式进行配置,以实现远程服务的调用。

不同点

  • Feign 和 OpenFeign 的依赖项不同,Feign 的依赖为 spring-cloud-starter-feign,而 OpenFeign 的依赖为 spring-cloud-starter-openfeign。
  • Feign 和 OpenFeign 支持的注解不同,Feign 支持 Feign 注解和 JAX-RS 注解,但不支持 Spring MVC 注解;OpenFeign 除了支持 Feign 注解和 JAX-RS 注解外,还支持 Spring MVC 注解。

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>

定义远程调用接口

  • 在 @FeignClient 注解中,value 属性的取值为:服务提供者的服务名,即服务提供者配置文件(application.yml)中 spring.application.name 的取值。
  • 接口中定义的每个方法都与服务提供者中 Controller 定义的服务方法对应。
  • openfeign本身并不具备fallback降级属性,需要搭配降级框架如(hystrix或sentinel)。如果未引入降级框架,即使声明fallback降级服务类,在远程调用发生异常时,也不会触发
@Component
@FeignClient(value = "service5")
public interface FeignService {
     @GetMapping("/api/v1/service5")
     List<Integer> get();
}
启动类添加注解@EnableFeignClients
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public 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日志以什么样的级别监控该接口

说明:

  • com.ftc.service3.FeignService 是开启 @FeignClient 注解的接口(即服务绑定接口)的完整类名。也可以只配置部分路径,表示监控该路径下的所有服务绑定接口
  • debug:表示监听该接口的日志级别。

创建日志配置类

@Configuration

public class ConfigBean {

 /**

   * OpenFeign 日志增强

   * 配置 OpenFeign 记录哪些内容

   */

 @Bean

 Logger.Level feginLoggerLevel() {

     return Logger.Level.FULL;

 }

}

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

  • NONE:不记录任何信息。
  • BASIC:仅记录请求方法、URL 以及响应状态码和执行时间。
  • HEADERS:除了记录 BASIC 级别的信息外,还会记录请求和响应的头信息。
  • FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等等。

FULL级别如图:

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
4月前
|
负载均衡 Java Spring
Feign 和 OpenFeign 有什么区别?
Feign是Netflix开发的声明式HTTP客户端,简化Web服务调用。OpenFeign是Spring Cloud对其的扩展,集成负载均衡、服务发现等组件,提供自动配置,更适用于Spring生态。
391 1
|
负载均衡 Java API
SpringCloud之OpenFeign介绍案例+相关面试题
OpenFeign是一个声明式的WEB服务客户端,它使WEB服务客户端变得更加容易。具有可插拔的注解支持,SpringCloud中添加了SpringMVC注解的支持。SpringCloud中集成了Ribbon和Eureka,以及SpringCloud LoadBalance,以便在使用Feign时提供负载均衡的HTTP客户端Feign是一个远程调用的组件集成了Ribbon,默认的负载均衡策略是轮询
1306 0
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
24322 2
|
6月前
|
Java Nacos Sentinel
Spring Cloud Alibaba 深度实战:Nacos + Sentinel + Gateway 整合指南
本指南深入整合Spring Cloud Alibaba核心组件:Nacos实现服务注册与配置管理,Sentinel提供流量控制与熔断降级,Gateway构建统一API网关。涵盖环境搭建、动态配置、服务调用与监控,助你打造高可用微服务架构。(238字)
1777 10
|
2月前
|
JSON 监控 搜索推荐
SpringBoot 整合 ElasticSearch,给搜索插上“光速翅膀”
SpringBoot整合ElasticSearch,就像给程序装上了“谷歌大脑”,存得多、找得快、查得准。虽然配置过程像在组装乐高,偶尔会找不到零件,但一旦搭建完成,你就能享受到“秒级搜索”的快感。
196 1
|
4月前
|
负载均衡 Dubbo Java
Dubbo 和 Feign的区别是什么?
Dubbo是高性能RPC框架,支持多种协议与服务治理,适用于Java微服务架构;Feign是声明式HTTP客户端,简化Spring Cloud服务调用。两者定位不同,Dubbo强在性能与治理,Feign重在易用与集成。
580 0
|
6月前
|
消息中间件 Java Shell
RocketMQ集群部署与快速入门全解密:从原理到实战,万字干货吃透消息中间件
本文详解Apache RocketMQ核心概念、多Master多Slave集群部署及Java实战,涵盖NameServer、Broker配置、消息收发、事务消息与故障排查,助你掌握分布式消息系统搭建与应用。
889 3
|
负载均衡 Java Nacos
Spring Cloud五大组件
Spring Cloud五大组件
|
监控 负载均衡 Java
5 大 SpringCloud 核心组件详解,8 张图彻底弄懂
本文图文详解 Spring Cloud 的五大核心组件,帮助深入理解和掌握微服务架构。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
5 大 SpringCloud 核心组件详解,8 张图彻底弄懂
|
缓存 Java 数据库连接
Mybatis一级缓存、二级缓存详讲
本文介绍了MyBatis中的查询缓存机制,包括一级缓存和二级缓存。一级缓存基于同一个SqlSession对象,重复查询相同数据时可直接从缓存中获取,减少数据库访问。执行`commit`操作会清空SqlSession缓存。二级缓存作用于同一namespace下的Mapper对象,支持数据共享,需手动开启并实现序列化接口。二级缓存通过将数据存储到硬盘文件中实现持久化,为优化性能,通常在关闭Session时批量写入缓存。文章还说明了缓存的使用场景及注意事项。
944 7
Mybatis一级缓存、二级缓存详讲