【spring cloud hoxton】Ribbon 真的能被 spring-cloud-loadbalancer 替代吗

本文介绍SpringCloud Hoxton.M2版本中引入的spring-cloud-loadbalancer,作为Ribbon的替代方案,提供了新的负载均衡实现。文章详细解析了如何在项目中配置并使用新的loadbalancer,以及其与Ribbon的对比分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

  • 早上刷圈看到 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 一样配置
@Configuration
public class LbConfiguration {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@GetMapping("/demo")
public String doOtherStuff() {
    return restTemplate.getForObject("http://big-provider-server/demo", String.class);
}

源码解析

LoadBalancerClient 实现


  • 目前版本只提供了 BlockingLoadBalancerClient 的实现, 注意看中文注释
// 删除只保留了核心代码注意
public class BlockingLoadBalancerClient implements LoadBalancerClient {

    @Override
    public <T> T execute(String serviceId, LoadBalancerRequest<T> request)
            throws IOException {
        // 根据 服务名称去查询可用实例
        ServiceInstance serviceInstance = choose(serviceId);
        return execute(serviceId, serviceInstance, request);
    }

    @Override
    public ServiceInstance choose(String serviceId) {
        // 获取负载均衡策略
        ReactiveLoadBalancer<ServiceInstance> loadBalancer = loadBalancerClientFactory
                .getInstance(serviceId);
        // 执行负载均衡策略获取可以实例
        Response<ServiceInstance> loadBalancerResponse = Mono.from(loadBalancer.choose())
                .block();
        return loadBalancerResponse.getServer();
    }

}

loadBalancer 负载均衡策略实现

  • 目前只有一个RoundRobinLoadBalancer 轮询选择server的方式
public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer {
    public Mono<Response<ServiceInstance>> choose(Request request) {
        ServiceInstanceSupplier supplier = this.serviceInstanceSupplier.getIfAvailable();
        return supplier.get().collectList().map(instances -> {
            if (instances.isEmpty()) {
                log.warn("No servers available for service: " + this.serviceId);
                return new EmptyResponse();
            }
            // TODO: enforce order?
            int pos = Math.abs(this.position.incrementAndGet());

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

            return new DefaultResponse(instance);
        });
    }

}

和ribbon 比较

默认负载均衡比较

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

配置方面丰富性

  • 目前spring-cloud-loadbalancer 仅支持 重试操作的配置
  • ribbon 支持超时、懒加载处理、重试及其和 hystrix整合高级属性等

结论

<think>好的,用户想了解spring-cloud-starter-loadbalancer的官方文档地址,并且希望有中文版。首先,我需要确认这个组件属于哪个项目。Spring Cloud的各个子项目文档通常托管在spring.io官网上。 记得Spring Cloud的文档结构,每个项目会有对应的版本和文档链接。LoadBalancer作为Spring Cloud Commons的一部分,可能在Spring Cloud Commons的文档里有专门的章节。但用户直接提到了spring-cloud-starter-loadbalancer,这应该是单独的starter。 现在需要找到正确的官方文档入口。访问Spring Cloud官网,查看项目列表,找到Spring Cloud Commons,然后在其中搜索关于LoadBalancer的部分。或者直接搜索spring-cloud-starter-loadbalancer文档,可能会跳转到对应的页面。 另外,用户问有没有中文版。Spring Cloud的部分文档有翻译版,但通常滞后于英文版。需要检查Spring Cloud的中国社区或者官方是否有提供中文文档,比如spring.io/zh可能会有部分翻译内容,但可能不全。或者推荐第三方翻译的文档,比如Spring Cloud中文网,但需要确认其可靠性。 接下来,具体的文档URL应该类似:https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer,因为LoadBalancer属于Commons项目。同时,starter的Maven依赖信息可能在同一个文档里。 关于中文版,需要检查该页面是否有语言切换选项,或者是否有对应的中文翻译链接。如果没有,可能需要告知用户目前没有官方的中文文档,但可以通过浏览器翻译工具或第三方资源来辅助阅读。 最后,确保提供的链接是当前可用的,并且指向正确版本。可能需要建议用户查看对应他们使用的Spring Cloud版本的文档,因为不同版本的文档结构可能有所不同。</think>关于 spring-cloud-starter-loadbalancer 的官方文档信息整理如下: 1. 官方英文文档地址: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer 2. 中文资源情况: • 目前Spring Cloud官方未提供完整中文文档 • 可通过以下方式获取中文内容: a) 使用Chrome浏览器自带的网页翻译功能 b) 参考民间翻译项目(需自行验证准确性): https://springcloud.cc/spring-cloud-loadbalancer.html 3. 推荐学习方式建议: ✓ 优先阅读英文原版文档(保持最新特性同步) ✓ 配合翻译工具理解专业术语 ✓ 查看代码示例仓库: https://github.com/spring-cloud-samples/spring-cloud-loadbalancer-samples 4. Maven坐标参考(最新版本请以官网为准): ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> <version>{version}</version> </dependency> ``` 提示:该组件是Spring Cloud Hoxton.M2版本后替代Ribbon的官方负载均衡解决方案,建议结合Spring Cloud Gateway或OpenFeign使用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值