栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

背景
  • 早上刷圈看到 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库

	
		
			org.springframework.cloud
			spring-cloud-dependencies
			Hoxton.M2
			pom
			import
		

  • 加入nacos-client ,使用 2.1.0版本,特别注意排除 ribbon依赖,不然loadbalancer 无效

	com.alibaba.cloud
	spring-cloud-starter-alibaba-nacos-discovery
	
		
			org.springframework.cloud
			spring-cloud-starter-netflix-ribbon
		
	

  • 加入 loadbalancer pom坐标

	org.springframework.cloud
	spring-cloud-loadbalancer

  • 配置使用还是和 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 execute(String serviceId, LoadBalancerRequest request)
			throws IOException {
		// 根据 服务名称去查询可用实例
		ServiceInstance serviceInstance = choose(serviceId);
		return execute(serviceId, serviceInstance, request);
	}

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

}
loadBalancer 负载均衡策略实现

  • 目前只有一个RoundRobinLoadBalancer 轮询选择server的方式
public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer {
	public Mono> 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整合高级属性等
结论
  • 老老实实用 ribbon

  • 以上源码 https://github.com/pigxcloud/big

  • 欢迎关注 基于Spring Boot 2.1.7、 Spring Cloud Greenwich.SR2、 OAuth2 的RBAC 权限管理系统

  • 欢迎关注我们获得更多的好玩JavaEE 实践

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/239182.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号