区别
-
Ribbon 是由 Netflix 发布的器,知名网站建设定制它有助于控制 HTTP 和 TCP 知名网站建设定制的客户端的行为。Ribbon 知名网站建设定制属于客户端负载均衡。知名网站建设定制大家都知道,知名网站建设定制在我们最早使用 Springcloud 知名网站建设定制微服务架构时,就是使用 Netflix 公司的荣誉出品:https://docs.spring.io/spring-cloud-netflix/docs/2.2.9.RELEASE/reference/html/
。但可惜的是,Eureka 早就正式被官方废弃,不再更新了。这也许是为了更好的统一架构。
- Spring-cloud-loadbalancer
Spring-cloud-loadbalancer,是官方正式推出的一款新负载均衡利器。早在 2017 年 spring 开始尝试开发spring-cloud-loadbalancer
替代 ribbon,项目托管在 spring-cloud-incubator 孵化器,而后,经过一段时间,突然把此项目标记成归档迁移到spring-cloud-commons,说明官方在做统一公共基础架构的决心在一步步前进。
早在 Spring Cloud Hoxton.M2,第一个整合spring-cloud-loadbalancer
来替换老的 ribbon:
- Spring Cloud Hoxton.M2 is the first release containing both blocking and non-blocking load balancer client implementations as an alternative to Netflix Ribbon which has entered maintenance mode.
-
- To use the new `BlockingLoadBalancerClient` with a `RestTemplate` you will need to include `org.springframework.cloud:spring-cloud-loadbalancer` on your application’s classpath. The same dependency can be used in a reactive application when using `@LoadBalanced WebClient.Builder` - the only difference is that Spring Cloud will auto-configure a `ReactorLoadBalancerExchangeFilterFunction` instance. See the [documentation](https://cloud.spring.io/spring-cloud-static/spring-cloud-commons/2.2.0.M2/reference/html/#_spring_resttemplate_as_a_load_balancer_client) for additional information. The new `ReactorLoadBalancerExchangeFilterFunction` can also be autowired and passed directly to `WebClient.Builder` (see the [documentation](https://cloud.spring.io/spring-cloud-commons/reference/html/#webflux-with-reactive-loadbalancer)). For all these features, [Project Reactor](https://projectreactor.io/)-based `RoundRobinLoadBalancer` is used underneath.
从这段原文可以看到,目前只支持BlockingLoadBalancerClient
,同样是基于 RestTemplate
。我们知道 ribbon 也是基于RestTemplate
:
- @LoadBalanced
- @Bean
- public RestTemplate restTemplate() {
- SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
- requestFactory.setReadTimeout(env.getProperty("client.http.request.readTimeout", Integer.class, 15000));
- requestFactory.setConnectTimeout(env.getProperty("client.http.request.connectTimeout", Integer.class, 3000));
- RestTemplate rt = new RestTemplate(requestFactory);
- return rt;
- }
但对于配置,ribbon 显然还是较老练:
- backend:
- ribbon:
- client:
- enabled: true
- ServerListRefreshInterval: 5000
-
- ribbon:
- ConnectTimeout: 3000
- ReadTimeout: 1000
- eager-load:
- enabled: true
- clients: cas-server,customer-server
- MaxAutoRetries: 2
- MaxAutoRetriesNextServer: 3
- OkToRetryOnAllOperations: true
- NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
可以多维度配置:超时、刷新服务列表、重试机制等。
但对于spring-cloud-loadbalancer
,可以没有那么好,毕竟是刚养大的崽。但 Spring Cloud Hoxton 版本中第一次引入同时支持阻塞式与非阻塞式的负载均衡器spring-cloud-loadbalancer
来作为已经进入维护状态的 Netflix Ribbon。接下来,我们实战看看如何使用。
实战spring-cloud-loadbalancer
在使用时,我们从原文中了解到,只需要引入org.springframework.cloud:spring-cloud-loadbalancer
依赖,就可以将新的BlockingLoadBalancerClient
与RestTemplate
一起使用了。同时,该依赖的引入也将支持 Reactive 应用,跟其他使用一样,只需要使用@LoadBalanced
来修饰WebClient.Builder
即可。
我们先来引入依赖,这里用的是基于 Nacos 的服务注册与发现,我们先来注入依赖:
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-loadbalancer</artifactId>
- </dependency>
在这里,我们使用到新的负载均衡器,需要排除 ribbon 依赖,不然 loadbalancer 无效。同时,我们需要禁用 ribbon 的负载均衡能力:
- spring:
- cloud:
- loadbalancer:
- ribbon:
- enabled: false
禁用之后,我们在结合RestTemplate
使用,并使用@LoadBalanced
来修饰WebClient.Builder
。
- @LoadBalanced//就不能用ip等形式来请求其他服务
- @Bean
- public RestTemplate restTemplate() {
- SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
- requestFactory.setReadTimeout(env.getProperty("client.http.request.readTimeout", Integer.class, 15000));
- requestFactory.setConnectTimeout(env.getProperty("client.http.request.connectTimeout", Integer.class, 3000));
- RestTemplate rt = new RestTemplate(requestFactory);
- return rt;
- }
这个细心的同学可以开始看到:这个和 Ribbon 的配置是一样样的。此时,我们启动服务提供者、消费者即可测试。这里就不再展示了。
总结
按照官方的孵化,新的负载均衡器将会取代老的 ribbon,毕竟引入了新的功能:Reactive,加入了对其的大力支持。这在性能方面有所提升。
同时,现在spring-cloud-loadbalancer
还是存在一定局限的,比如:
ribbon 提供几种默认的负载均衡策略
目前
spring-cloud-loadbalancer
仅支持重试操作的配置ribbon 支持超时、懒加载处理、重试及其和 hystrix 整合高级属性等
在 Spring-cloud 体系中,大部分范围还是老实使用 Ribbon,但基于 spring-cloud-k8s,可能需要使用基于spring-cloud-starter-kubernetes-loadbalancer
。因为在前面实践过,基于 Ribbon 的 LB,无法跨命名空间来实现服务间的相互访问。
下面给大家介绍一本好书《深入了解分布式事务》,该书在当当网目前销售火热,有原理加实战,感兴趣可以点击下方链接购买。
开源项目
实践项目代码开源:https://gitee.com/damon_one/microservice-k8s
欢迎大家star、fork,欢迎联系我,一起学习。
云原生社区合肥站
云原生社区合肥站正式启动啦,欢迎Base合肥、关注云原生、长期从事云原生的同志们踊跃加入,云原生社区合肥站会因为你们的加入而变得更加美好~
详情参见Issue:https://github.com/cloudnativeto/community/issues/107
欢迎关注个站
往期回顾
关注公众号,回复入群,获取更多惊喜!公众号(程序猿Damon)里回复 ES、Flink、Java、Kafka、MQ、ML、监控、大数据、k8s 等关键字可以查看更多关键字对应的文章。
点击 "damon8.cn" 获取更好的阅读体验!
❤️给个「在看」,是对我最大的支持❤️