OpenFeign Feign Ribbon

OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验。

OpenFeign的前身是Feign,OpenFeign是SpringCloud在Feign的基础上支持了Spring MVC的注解,并通过动态代理的方式产生实现类来做负载均衡并进行调用其他服务。

使用 Ribbon+RestTemplate 时,利用了RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用, 所以通常都会针对每个微服务自行封装成客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装, 由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它,简化了使用Spring Cloud Ribbon时,自动封装服务调用客户端的开发量。

Spring Cloud应用在启动时,Feign会扫描标有@FeignClient注解的接口,生成代理,并注册到Spring容器中。生成代理时Feign会为每个接口方法创建一个RequetTemplate对象,该对象封装了HTTP请求需要的全部信息,请求参数名、请求方法等信息都是在这个过程中确定的,Feign的模板化就体现在这里。

Feign

Feign是SpringCloud组件中的一个轻量级RESTFulHTTP服务客户端,内置了Ribbon来做客户端负载均衡去调注册中心的服务,它的使用就是使用Feign的注解定义接口,然后调用这个接口就可以调用注册中心的服务。

Feign使用的是自己的一套注解,不支持Spring MVC的注解。

OpenFeign

OpenFeign是Spring Cloud在Feign的基础上支持了Spring MVC的注解,列如@RequestMapping等,OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

Ribbon

Ribbon是Netflix开源的基于HTTP和TCP等协议负载均衡组件,是一个客户端负载均衡器,运行在客户端上。Ribbon的使用需要代码里面手动调用所需服务。Feign已经默认使用了Ribbon。

OpenFeign 的两个重要标注@FeignClient和@EnableFeignClients。

@FeignClient标注用于声明Feign客户端可访问的Web服务。

@EnableFeignClients标注用于修饰Spring Boot应用的入口类,以通知Spring Boot启动应用时,扫描应用中声明的Feign客户端可访问的Web服务。

@FeignClient标注的参数

  • name, value (默认""),两者等价
  • qualifier (默认"")
  • url (默认"")
  • decode404 (默认false)
  • configuration (默认FeignClientsConfiguration.class)
  • fallback (默认void.class)
  • fallbackFactory (默认void.class)
  • path (默认"")
  • primary (默认true)

启用OpenFeign

pom添加依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

启动OpenFeign

需要启动类上添加@EnableFeignClients注解

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

OpenFeign超时控制

默认Feign客户端只等待一秒钟,就是服务处理需要超过1秒,导致Feign客户端不想等待了,直接返回报错。为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制。

# 设置 feign客户端超时时间 ( openFeign 默认支持 ribbon )
ribbon:
 # 指的是建立连接所用的时间,适用于网络状况正常的情况下,俩端连接所用的时间 单位是秒
 ReadTimeout: 6000
 # 指的是建立连接后从服务器读取到可用资源的时间
 ConnectTimeout: 5000

ribbon的可配置部分

ribbon.ReadTimeout=1000 //处理请求的超时时间,默认为1秒

ribbon.ConnectTimeout=1000 //连接建立的超时时长,默认1秒

ribbon.MaxAutoRetries=1 //同一台实例的最大重试次数,但是不包括首次调用,默认为1次

ribbon.MaxAutoRetriesNextServer=0 //重试负载均衡其他实例的最大重试次数,不包括首次调用,默认为0次

ribbon.OkToRetryOnAllOperations=false //是否对所有操作都重试,默认false

 

https://www.jianshu.com/p/7d45185ae7f1 

### OpenFeignRibbon 的功能区别与适用场景 #### 功能区别 OpenFeignRibbon 是微服务架构中常用的客户端组件,它们在服务调用和负载均衡方面有着不同的定位和实现方式。Ribbon 是一个客户端负载均衡器,主要负责在多个服务实例之间分配请求[^1]。它通过 `@RibbonClient` 注解进行配置,通常与 `RestTemplate` 结合使用,以实现基于 HTTP 和 TCP 协议的服务调用和负载均衡。Ribbon 提供了丰富的负载均衡策略,例如轮询、随机、最少连接等,并且支持自定义策略。 相比之下,OpenFeign 是一个声明式的 REST 客户端,它简化了 HTTP API 的调用过程。OpenFeign 使用 `@EnableFeignClients` 注解来启用客户端功能,并通过 `@FeignClient` 注解定义服务接口。OpenFeign 的核心特点是声明式的服务调用方式,开发者可以像调用本地接口一样调用远程服务,底层通过动态代理实现。OpenFeign 内置了对 Ribbon 的支持,因此它不仅具备负载均衡能力,还提供了更高级的抽象,使得服务调用更加直观和简洁[^1]。 #### 使用场景 Ribbon 更适合那些需要对负载均衡策略进行精细控制的场景。例如,在一个需要根据特定业务逻辑动态调整请求分发策略的系统中,Ribbon 提供了足够的灵活性。由于其基于 `RestTemplate` 的实现方式,Ribbon 在需要直接操作 HTTP 请求和响应的场景中表现尤为出色。此外,Ribbon 的轻量级特性使其在资源受限的环境中具有优势。 OpenFeign 则更适合那些希望简化服务调用流程、提高开发效率的场景。OpenFeign 的声明式服务调用方式极大地减少了样板代码的数量,开发者只需关注服务接口的定义,而无需关心底层的网络细节。这种特性使得 OpenFeign 成为构建微服务架构的理想选择,尤其是在需要快速迭代和频繁变更的项目中。OpenFeign 还支持 Spring MVC 的注解,这使得它能够无缝集成到基于 Spring Boot 的项目中[^1]。 #### 性能与扩展性 在性能方面,RibbonOpenFeign 都依赖于 HTTP 协议进行服务调用,因此它们在网络传输上的性能差异不大。然而,OpenFeign 通过内置的负载均衡机制和声明式的服务调用方式,减少了开发者的编码负担,从而间接提高了整体系统的开发效率和可维护性。OpenFeign 的设计使其更容易与其他 Spring Cloud 组件(如 Hystrix 和 Sleuth)集成,从而提供更全面的服务治理能力[^2]。 在扩展性方面,Ribbon 提供了较为灵活的负载均衡策略配置,可以通过自定义策略来满足特定需求。而 OpenFeign 则通过其声明式的接口设计,使得服务调用的扩展变得更加简单。例如,开发者只需在接口上添加新的方法即可实现对新服务的调用,而无需修改底层的网络处理逻辑。这种设计不仅提高了代码的可读性和可维护性,还降低了服务调用的复杂度[^3]。 #### 代码示例 以下是使用 RibbonOpenFeign 进行服务调用的代码示例: ##### Ribbon 示例 ```java @Configuration public class RibbonConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } } @Service public class RibbonService { private final RestTemplate restTemplate; public RibbonService(RestTemplate restTemplate) { this.restTemplate = restTemplate; } public String callService(String serviceUrl) { return restTemplate.getForObject(serviceUrl, String.class); } } ``` ##### OpenFeign 示例 ```java @EnableFeignClients @Configuration public class FeignConfig { // 配置Feign客户端 } @FeignClient(name = "service-name") public interface FeignClient { @GetMapping("/api") String callService(); } @Service public class FeignService { private final FeignClient feignClient; public FeignService(FeignClient feignClient) { this.feignClient = feignClient; } public String callService() { return feignClient.callService(); } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值