您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)Ribbon是否能被spring-cloud-loadbalancer替代,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
早上刷圈看到 Spring Cloud Hoxton.M2 Released 的消息,隨手發(fā)布到了我的知識(shí)星球,過(guò)了會(huì)有個(gè)朋友過(guò)來(lái)如下問(wèn)題。 抽取半天時(shí)間學(xué)習(xí)spring-cloud-loadbalancer 的源碼,整理出此文總結(jié)
Spring Cloud Hoxton.M2 是第一個(gè)整合新的loadbalancer實(shí)現(xiàn)來(lái)替代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 的淵源
2017年spring 開(kāi)始嘗試開(kāi)發(fā)新的項(xiàng)目 spring-cloud-loadbalancer
替代ribbon,項(xiàng)目托管在 spring-cloud-incubator 孵化器 (多提一嘴,spring cloud alibaba 等頂級(jí)的項(xiàng)目大多從此孵化出來(lái)的,代表著 spring cloud 的發(fā)展方向)
經(jīng)過(guò)N個(gè)月的不維護(hù),還以為spring 放棄此項(xiàng)目時(shí),突然把此項(xiàng)目標(biāo)記成歸檔遷移到spring-cloud-commons
發(fā)布2.2.0.M2 版本
這里基于 最新的hoxton.m2 版本才可以使用,所以要配置spring的代理maven庫(kù)
<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 無(wú)效
<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坐標(biāo)
<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); }
目前版本只提供了 BlockingLoadBalancerClient 的實(shí)現(xiàn), 注意看中文注釋
// 刪除只保留了核心代碼注意 public class BlockingLoadBalancerClient implements LoadBalancerClient { @Override public <t> T execute(String serviceId, LoadBalancerRequest<t> request) throws IOException { // 根據(jù) 服務(wù)名稱去查詢可用實(shí)例 ServiceInstance serviceInstance = choose(serviceId); return execute(serviceId, serviceInstance, request); } @Override public ServiceInstance choose(String serviceId) { // 獲取負(fù)載均衡策略 ReactiveLoadBalancer<serviceinstance> loadBalancer = loadBalancerClientFactory .getInstance(serviceId); // 執(zhí)行負(fù)載均衡策略獲取可以實(shí)例 Response<serviceinstance> loadBalancerResponse = Mono.from(loadBalancer.choose()) .block(); return loadBalancerResponse.getServer(); } }
目前只有一個(gè)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 提供7中默認(rèn)的負(fù)載均衡策略,常見(jiàn)的常見(jiàn)都有覆蓋,一般我們都是使用 ZoneAvoidanceRule
復(fù)合判斷server所在區(qū)域的性能和server的可用性選擇server
目前spring-cloud-loadbalancer
僅支持 重試操作的配置
ribbon 支持超時(shí)、懶加載處理、重試及其和 hystrix整合高級(jí)屬性等
看完上述內(nèi)容,你們對(duì)Ribbon是否能被spring-cloud-loadbalancer替代有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。