伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

【spring cloud hoxton】Ribbon 真的能被 spring-cloud-load

来源:本站原创 浏览:102次 时间:2022-10-11
背景
  • 早上刷圈看到 Spring Cloud Hoxton.M2 Released 的消息,随手发布到了我的知识星球,过了会有个朋友过来如下问题。抽取半天时间学习spring-cloud-loadbalancer 的源码,整理出此文总结 

  • Spring Cloud Hoxton.M2 是第一个整合新的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.
  • spring-cloud-loadbalancer 的渊源

  1. 2017年spring 开始尝试开发新的项目 spring-cloud-loadbalancer 替代ribbon,项目托管在 spring-cloud-incubator 孵化器 (多提一嘴,spring cloud alibaba 等顶级的项目大多从此孵化出来的,代表着 spring cloud 的发展方向)

  2. 经过N个月的不维护,还以为spring 放弃此项目时,突然把此项目标记成归档迁移到spring-cloud-commons

  3. 发布2.2.0.M2 版本

如何使用
  • 这里基于 最新的hoxton.m2 版本才可以使用,所以要配置spring的代理maven库

<dependencyManagement>    <dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-dependencies</artifactId>            <version>Hoxton.M2</version>            <type>pom</type>            <scope>import</scope>        </dependency></dependencyManagement>
  • 加入nacos-client 使用 2.1.0版本,特别注意排除 ribbon依赖,不然loadbalancer 无效

<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>
  • 加入 loadbalancer pom坐标

<dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-loadbalancer</artifactId></dependency>
  • 配置使用还是和 ribbon 一样配置

  1. @Configuration

  2. public class LbConfiguration {

  3.    @Bean

  4.    @LoadBalanced

  5.    RestTemplate restTemplate() {

  6.        return new RestTemplate();

  7.    }

  8. }


  9. @GetMapping("/demo")

  10. public String doOtherStuff() {

  11.    return restTemplate.getForObject("http://big-provider-server/demo", String.class);

  12. }

源码解析LoadBalancerClient 实现

  • 目前版本只提供了 BlockingLoadBalancerClient 的实现, 注意看中文注释

  1. // 删除只保留了核心代码注意

  2. public class BlockingLoadBalancerClient implements LoadBalancerClient {


  3.    @Override

  4.    public <T> T execute(String serviceId, LoadBalancerRequest<T> request)

  5.            throws IOException {

  6.        // 根据 服务名称去查询可用实例

  7.        ServiceInstance serviceInstance = choose(serviceId);

  8.        return execute(serviceId, serviceInstance, request);

  9.    }


  10.    @Override

  11.    public ServiceInstance choose(String serviceId) {

  12.        // 获取负载均衡策略

  13.        ReactiveLoadBalancer<ServiceInstance> loadBalancer = loadBalancerClientFactory

  14.                .getInstance(serviceId);

  15.        // 执行负载均衡策略获取可以实例

  16.        Response<ServiceInstance> loadBalancerResponse = Mono.from(loadBalancer.choose())

  17.                .block();

  18.        return loadBalancerResponse.getServer();

  19.    }


  20. }

loadBalancer 负载均衡策略实现

  • 目前只有一个RoundRobinLoadBalancer 轮询选择server的方式

  1. public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer {

  2.    public Mono<Response<ServiceInstance>> choose(Request request) {

  3.        ServiceInstanceSupplier supplier = this.serviceInstanceSupplier.getIfAvailable();

  4.        return supplier.get().collectList().map(instances -> {

  5.            if (instances.isEmpty()) {

  6.                log.warn("No servers available for service: " + this.serviceId);

  7.                return new EmptyResponse();

  8.            }

  9.            // TODO: enforce order?

  10.            int pos = Math.abs(this.position.incrementAndGet());


  11.            ServiceInstance instance = instances.get(pos % instances.size());


  12.            return new DefaultResponse(instance);

  13.        });

  14.    }


  15. }

和ribbon 比较默认负载均衡比较
  • ribbon 提供7中默认的负载均衡策略,常见的常见都有覆盖,一般我们都是使用 ZoneAvoidanceRule 复合判断server所在区域的性能和server的可用性选择server 

配置方面丰富性
  • 目前 spring-cloud-loadbalancer 仅支持 重试操作的配置

  • ribbon 支持超时、懒加载处理、重试及其和 hystrix整合高级属性等

结论
  • 老老实实用 ribbon 


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net