spring-cloud-loadbalancer 将替换 ribbon

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: Spring官方推出新型负载均衡利器“spring-cloud-loadbalancer”,将代替Ribbon。

区别

- Ribbon

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依赖,就可以将新的BlockingLoadBalancerClientRestTemplate一起使用了。同时,该依赖的引入也将支持 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,无法跨命名空间来实现服务间的相互访问。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
5月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
25天前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
31 6
|
25天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
45 5
|
25天前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
35 5
|
5月前
|
Java 开发工具 git
实现基于Spring Cloud的配置中心
实现基于Spring Cloud的配置中心
|
5月前
|
设计模式 监控 Java
解析Spring Cloud中的断路器模式原理
解析Spring Cloud中的断路器模式原理
|
5月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
15060 33
|
5月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
598 15
|
5月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
128 3