知名网站建设定制注意了,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:

  1. 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.
  2. 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

  1. @LoadBalanced
  2. @Bean
  3. public RestTemplate restTemplate() {
  4.         SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
  5.         requestFactory.setReadTimeout(env.getProperty("client.http.request.readTimeout", Integer.class, 15000));
  6.         requestFactory.setConnectTimeout(env.getProperty("client.http.request.connectTimeout", Integer.class, 3000));
  7.         RestTemplate rt = new RestTemplate(requestFactory);
  8.         return rt;
  9. }

但对于配置,ribbon 显然还是较老练:

  1. backend:
  2.   ribbon:
  3.     client:
  4.       enabled: true
  5.     ServerListRefreshInterval: 5000
  6. ribbon:
  7.   ConnectTimeout: 3000
  8.   ReadTimeout: 1000
  9.   eager-load:
  10.     enabled: true
  11.     clients: cas-server,customer-server
  12.   MaxAutoRetries: 2
  13.   MaxAutoRetriesNextServer: 3
  14.   OkToRetryOnAllOperations: true
  15.   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 的服务注册与发现,我们先来注入依赖:

  1. <dependency>
  2.     <groupId>com.alibaba.cloud</groupId>
  3.     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4.     <exclusions>
  5.         <exclusion>
  6.             <groupId>org.springframework.cloud</groupId>
  7.             <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  8.         </exclusion>
  9.     </exclusions>
  10. </dependency>
  11. <dependency>
  12.         <groupId>org.springframework.cloud</groupId>
  13.         <artifactId>spring-cloud-loadbalancer</artifactId>
  14. </dependency>

在这里,我们使用到新的负载均衡器,需要排除 ribbon 依赖,不然 loadbalancer 无效。同时,我们需要禁用 ribbon 的负载均衡能力:

  1. spring:
  2.   cloud:
  3.     loadbalancer:
  4.       ribbon:
  5.         enabled: false

禁用之后,我们在结合RestTemplate使用,并使用@LoadBalanced来修饰WebClient.Builder

  1. @LoadBalanced//就不能用ip等形式来请求其他服务
  2. @Bean
  3. public RestTemplate restTemplate() {
  4.         SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
  5.         requestFactory.setReadTimeout(env.getProperty("client.http.request.readTimeout", Integer.class, 15000));
  6.         requestFactory.setConnectTimeout(env.getProperty("client.http.request.connectTimeout", Integer.class, 3000));
  7.         RestTemplate rt = new RestTemplate(requestFactory);
  8.         return rt;
  9. }

这个细心的同学可以开始看到:这个和 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" 获取更好的阅读体验!

❤️给个「在看」,是对我最大的支持❤️
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发