spring cloud生态中Feign、Ribbon、loadbalancer的一些历史
背景
本意是想写个feign中loadbalancer组件和nacos相遇后,一个兼容相关的问题,后面发现Feign这套东西很深,想一篇文章写清楚很难,就先开一篇,讲历史。
Feign、OpenFeign、Spring Cloud OpenFeign
Feign
Feign是Java生态中的一个库,这个库的官方目标是:Feign makes writing Java http clients easier,大概就是让http接口调用更加容易。
查了下历史,最早是Netflix家的,坐标如下,16年发布了最后一个版本后停止维护:
<!-- https://mvnrepository.com/artifact/com.netflix.feign/feign-core -->
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
</dependency>
OpenFeign
2016年,Netflix将其捐赠给社区,改名OpenFeign,目前还一直在维护:
<dependency>
<groupId>io.github.openfeig</groupId>
<artifactId>feign-core</artifactId>
</dependency>
Spring Cloud OpenFeign
而Spring Cloud OpenFeign则是对Feign的集成,让Feign能更方便地在spring项目中使用。
项目主页:https://spring.io/projects/spring-cloud-openfeign#learn
Spring cloud这块有两个坐标,一个是用于集成改名前的Feign,最早的版本是2015年,目前,这个坐标早就标记为过期了,提示使用另一个: Spring Cloud Starter Feign (deprecated, please use spring-cloud-starter-openfeign)
https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
另一个则是集成改名后的OpenFeign,最早的版本是2017年11月20日,目前一直在维护,算是spring cloud中的核心组件:
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
值得一提的是,不管是哪一个坐标,都是在第一个版本中,就已经依赖了ribbon这个组件,ribbon主要负责客户端负载均衡,因为根据服务名从服务注册中心会拿到很多实例,具体调用哪一个,就得靠ribbon这个组件来选择其中一个,比如随机、轮询等算法:

spring-cloud-starter-openfeign:

详情可参考文章:https://juejin.cn/post/7097124836496900127
Feign使用示例
在feign中,比如要调用github的两个接口,只需要向下面这样定义好接口:
interface GitHub {
@RequestLine("GET /repos/{owner}/{repo}/contributors")
List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);
@RequestLine("POST /repos/{owner}/{repo}/issues")
void createIssue(Issue issue, @Param("owner") String owner, @Param("repo") String repo);
}
调用就像下面这样:
// 发起调用,调用第一个接口
GitHub github = Feign.builder().target(GitHub.class, "https://api.github.com");
List<Contributor> contributors = github.contributors("OpenFeign", "feign");
可以看出,它的思路就是简洁,就像调用普通的方法一样,不用考虑序列化、反序列化、流的打开和关闭、异常处理。
ribbon、spring cloud loadbalancer
我应该是18/19年开始在项目里使用spring cloud,那时候的版本,还是spring cloud Netflix那一套,eureka + feign(ribbon) + hystrix断路器 + zuul网关那一套,ribbon是由OpenFeign默认引入的。
后来,Netflix宣布不再维护后,这一套中的组件,慢慢被替代。
前两年在鹅厂没搞spring cloud这一套,现在再搞这一套的时候,各个组件已经变天了。
在我们这,目前是,eureka变成了nacos,feign(ribbon)变成了feign(spring cloud loadbalancer),hystrix变成了sentinel,zuul网关变成了spring cloud gateway。
其中,feign是比较有意思的,之前的默认负载均衡组件是ribbon,但是ribbon因为也是Netflix家的,不再维护后,spring官方自己搞了个spring cloud loadbalancer。
spring cloud openfeign是从什么时候开始支持自家的loadbalancer呢?我翻了下历史,在2.1.5.RELEASE版本,都还只有ribbon(https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign/2.1.5.RELEASE)
下一个版本是2.2.0.RELEASE,已经开始支持loadbalancer了(https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign/2.2.0.RELEASE)。
当然,ribbon也还是支持的,只是多了个选择。

spring cloud loadbalancer的最早版本也就是2.2.0.RELEASE,想必就是为了和openfeign的版本保持一致。
ribbon落幕
我发现,OpenFeign目前主要有几个大版本。
2.2.x(从2.2.0.RELEASE到从2.2.10.RELEASE),这个版本都是有ribbon的,当然也有loadbalancer;
3.0.x,该版本是不带ribbon的,只有loadbalancer;
3.1.x,4.0.x,4.1.x,都是不带ribbon的,只有loadbalancer。
理清历史有什么用
理清历史,可以让你对项目中的依赖和配置项更有掌控。
比如,ribbon和loadbalancer只需要一个就够了,没必要共存,那你会说,我肯定不会两个依赖同时引入。
没错,但是ribbon可能作为如下依赖的间接依赖被引入:
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
也就是说,nacos服务发现的2.2.x系列,默认引入ribbon。

这样的话,你就可以排除掉多余的。
但你如果用的是nacos的2021.0.x系列,则它已经自己排除了ribbon系列,只支持loadbalancer了,就不需要手动排除了。
我就说我们有个项目很奇怪,为啥要手动排除ribbon:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<groupId>org.springframework.cloud</groupId>
</exclusion>
</exclusions>
</dependency>
我才发现,是项目的nacos服务发现坐标,从当时的2.2.x,升级到了:2021.0.5.0。我就说,排除个啥呀,本来都没这个依赖。
另外,之前还需要手动禁用ribbon:
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
没理清楚这个历史前,我还不敢去掉这段配置,现在呢,直接删了就是。
这里,总结一下,就是说,如果项目里ribbon和loadbalancer共存,首先,这是没啥必要的,其次,共存情况下要使用loadbalancer,则还是需要上面这段禁用ribbon的配置的。
参考文章
这篇是loadbalancer诞生的简介。
https://spring.io/blog/2020/03/25/spring-tips-spring-cloud-loadbalancer
https://baijiahao.baidu.com/s?id=1662947934543573780
spring cloud生态中Feign、Ribbon、loadbalancer的一些历史的更多相关文章
- Spring Cloud项目中通过Feign进行内部服务调用发生401\407错误无返回信息的问题
问题描述 最近在使用Spring Cloud改造现有服务的工作中,在内部服务的调用方式上选择了Feign组件,由于服务与服务之间有权限控制,发现通过Feign来进行调用时如果发生了401.407错误时 ...
- spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制)
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 前言 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...
- spring cloud 客户端负载均衡 - Ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon实现的,Ribbon不像注册中心.网关那样需要单独部署,它是作为一个工具直接集成到 ...
- Spring Cloud系列之Feign的常见问题总结
一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...
- Spring Cloud(Dalston.SR5)--Feign 声明式REST客户端
Spring Cloud 对 Feign 进行了封装,集成了 Ribbon 并结合 Eureka 可以实现客户端的负载均衡,Spring Cloud 实现的 Feign 客户端类名为 LoadBala ...
- Spring Cloud 入门 之 Feign 篇(三)
原文地址:Spring Cloud 入门 之 Feign 篇(三) 博客地址:http://www.extlight.com 一.前言 在上一篇文章<Spring Cloud 入门 之 Ribb ...
- 0.9.0.RELEASE版本的spring cloud alibaba sentinel+feign降级处理实例
既然用到了feign,那么主要是针对服务消费方的降级处理.我们基于0.9.0.RELEASE版本的spring cloud alibaba nacos+feign实例添油加醋,把sentinel功能加 ...
- 【spring cloud】在spring cloud服务中,打包ms-core失败,报错Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.0.4.RELEASE:repackage (default) on project
在spring cloud服务中,有一个ms-code项目,只为所有的微服务提供核心依赖和工具类,没有业务意义,作为核心依赖使用.所以没有main方法,没有启动类. 在spring cloud整体打包 ...
- 【spring】在spring cloud项目中使用@ControllerAdvice做自定义异常拦截,无效 解决原因
之前在spring boot服务中使用@ControllerAdvice做自定义异常拦截,完全没有问题!!! GitHub源码地址: 但是现在在spring cloud中使用@ControllerAd ...
- Spring Cloud Alibaba(8)---Feign服务调用
Feign服务调用 有关Spring Cloud Alibaba之前写过五篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring Clo ...
随机推荐
- 通过WinSW部署JAR包为windows服务
通过WinSW部署JAR包为windows服务 背景 使用 Java 编写了一些有用的工具,因为不方便部署到服务器上,所以需要把 Java 生成的 jar 包在本地 Windows 上部署. 查阅了几 ...
- android webview调用js(vue)问题记录
这几天和别人对接移动端,安卓平台,我们这边输出vue界面,安卓方反馈轮询的时候调用不到,具体原因也定位不到,只能确定前端这边没几句代码,应该没有问题,因此决定自己下载个android studio写个 ...
- 【升职加薪秘籍】我在服务监控方面的实践(8)-elasticsearch 性能监控与分析手段
大家好,我是蓝胖子,之前讲了mysql,redis中间件的监控,今天我们再来看看另一个基础组件elasticsearch,如何对它进行监控,当你思考如何对一个组件进行监控时,四大黄金指标会告诉你答案, ...
- 图解 LeetCode 算法汇总——回溯
本文首发公众号:小码A梦 回溯算法是一种常见的算法,常见用于解决排列组合.排列问题.搜索问题等算法,在一个搜索空间中寻找所有的可能的解.通过向分支不断尝试获取所有的解,然后找到合适的解,找完一个分支后 ...
- Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞
JNDI注入 什么是JNDI JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统 ...
- python基础:元组(tuple)列表(list)介绍
一,元组 1.元组的创建(可以把元组看作一个容器,任何数据类型都可以放在里面)通过赋值方法创建元组In [5]: t = ("hello",2.3,2,True,{1:" ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-16-处理模态对话框弹窗
1.简介 我们在日常工作中,会经常遇到弹出警告框的问题,弹框无法绕过,必须处理才可以执行后续的测试,所以弹框处理也是我们必须掌握的一个知识.宏哥在java+selenium系列文章中介绍过这部分内容. ...
- Oracle-降低表的高水位线
在应用中存在一系列的表,对表的操作是批量插入又批量删除,最终导致表的水位线很高.高水位线影响全索引扫描的SQL.即影响系统的性能. 现有方法降低表的水位线: 1.降低表的高水位线 select 'al ...
- poj2279
Mr. Young's Picture Permutations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5841 ...
- [ARC143B] Counting Grids 题解
Counting Grids 题目大意 将 \(1\sim n^2\) 填入 \(n\times n\) 的网格 \(A\) 中,对于每个格子满足以下条件之一: 该列中存在大于它的数. 该行中存在小于 ...