中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Ribbon是否能被spring-cloud-loadbalancer替代

發布時間:2021-10-20 15:15:35 來源:億速云 閱讀:789 作者:柒染 欄目:大數據

今天就跟大家聊聊有關Ribbon是否能被spring-cloud-loadbalancer替代,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

背景

  • 早上刷圈看到 Spring Cloud Hoxton.M2 Released 的消息,隨手發布到了我的知識星球,過了會有個朋友過來如下問題。 抽取半天時間學習spring-cloud-loadbalancer 的源碼,整理出此文總結 Ribbon是否能被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 實現

Ribbon是否能被spring-cloud-loadbalancer替代

  • 目前版本只提供了 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 負載均衡策略實現

Ribbon是否能被spring-cloud-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 Ribbon是否能被spring-cloud-loadbalancer替代

配置方面豐富性

  • 目前spring-cloud-loadbalancer 僅支持 重試操作的配置

  • ribbon 支持超時、懶加載處理、重試及其和 hystrix整合高級屬性等

看完上述內容,你們對Ribbon是否能被spring-cloud-loadbalancer替代有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通化县| 白城市| 蛟河市| 伊吾县| 奎屯市| 盐津县| 郧西县| 泽州县| 南充市| 屯留县| 巫溪县| 陈巴尔虎旗| 富平县| 苏尼特右旗| 且末县| 慈溪市| 平果县| 麻江县| 房产| 稷山县| 武川县| 塔河县| 商河县| 西林县| 九龙坡区| 开江县| 建湖县| 南岸区| 东山县| 平顶山市| 永新县| 吉安市| 阳泉市| 景泰县| 丹寨县| 扶余县| 东港市| 云龙县| 甘南县| 盐津县| 枣强县|