文档章节

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

冷冷gg
 冷冷gg
发布于 08/21 09:33
字数 776
阅读 723
收藏 4

背景

  • 早上刷圈看到 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>
</dependencies></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>&gt; choose(Request request) {
		ServiceInstanceSupplier supplier = this.serviceInstanceSupplier.getIfAvailable();
		return supplier.get().collectList().map(instances -&gt; {
			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整合高级属性等

结论

© 著作权归作者所有

冷冷gg

冷冷gg

粉丝 685
博文 131
码字总数 69020
作品 1
潍坊
UI设计师
私信 提问
加载中

评论(3)

Nthan
Nthan
我看到 https://github.com/spring-cloud-incubator/spring-cloud-loadbalancer 已经被归档了,是不是 Spring Cloud 官方已经放弃了?
冷冷gg
冷冷gg 博主
迁移到 spring cloud common 这个一块维护了
Nthan
Nthan
感谢
聊聊RibbonLoadBalancerClient的choose方法

序 本文主要研究一下RibbonLoadBalancerClient的choose方法 RibbonLoadBalancerClient.choose spring-cloud-netflix-ribbon-2.0.0.RC1-sources.jar!/org/springframework/cloud/netflix/rib......

go4it
2018/05/28
470
0
聊聊spring cloud的LoadBalancerAutoConfiguration

序 本文主要研究一下spring cloud的LoadBalancerAutoConfiguration RibbonAutoConfiguration spring-cloud-netflix-ribbon-2.0.0.RC2-sources.jar!/org/springframework/cloud/netflix/ribb......

go4it
2018/07/16
76
0
聊聊eureka的ZoneAffinityServerListFilter

序 本文主要研究一下eureka的ZoneAffinityServerListFilter ZoneAffinityServerListFilter ribbon-loadbalancer-2.2.5-sources.jar!/com/netflix/loadbalancer/ZoneAffinityServerListFilte......

go4it
2018/05/22
70
0
Spring Cloud Greenwich.SR3 发布

Spring Cloud Greenwich.SR3 已发布,可在 Maven Central 中获取。更新情况如下: 新的负载均衡器实现 Spring Cloud Greenwich.M3 是第一个包含阻塞和非阻塞负载均衡器客户端实现的版本,作为...

xplanet
09/16
1K
3
聊聊spring cloud的AbstractLoadBalancingClient

序 本文主要研究一下spring cloud的AbstractLoadBalancingClient AbstractLoadBalancingClient spring-cloud-netflix-ribbon-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netfli......

go4it
2018/07/18
57
0

没有更多内容

加载失败,请刷新页面

加载更多

SSH安全加强两步走

从 OpenSSH 6.2 开始已经支持 SSH 多因素认证,本文就来讲讲如何在 OpenSSH 下启用该特性。 OpenSSH 6.2 以后的版本多了一个配置项 AuthenticationMethods。该配置项可以让 OpenSSH 同时指定...

xiangyunyan
26分钟前
4
0
C或C++不是C/C++

http://www.voidcn.com/article/p-mucdruqa-ws.html

shzwork
今天
6
0
OSChina 周六乱弹 —— 如何将梳子卖给和尚

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @for_ :划水五分钟,专注两小时。分享Various Artists的单曲《贝多芬第8号钢琴奏鸣曲悲伤的第三乐章》: 《贝多芬第8号钢琴奏鸣曲悲伤的第三乐...

小小编辑
今天
179
8
ES5

什么是ES5:比普通js运行要求更加严格的模式 为什么:js语言本身有很多广受诟病的缺陷 如何:在当前作用域的顶部添加:"use strict" 要求: 1、禁止给未声明的变量赋值 2、静默失败升级为错误...

wytao1995
今天
7
0
c++ 内联函数调用快的原因

见图片分析

天王盖地虎626
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部