【spring cloud hoxton】Ribbon 真的能被 spring-cloud-load

背景

  • 早上刷圈看到 Spring Cloud Hoxton.M2 Released 的消息,隨手發佈到了個人知識星球,過了會有個朋友過來以下問題。抽取半天時間學習spring-cloud-loadbalancer 的源碼,整理出此文總結 圖片spring

  • Spring Cloud Hoxton.M2 是第一個整合新的loadbalancer實現來替代Ribbon的版本app

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 的發展方向)maven

  2. 通過N個月的不維護,還覺得spring 放棄此項目時,忽然把此項目標記成歸檔遷移到spring-cloud-commonside

  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 無效this

<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座標spa

<dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-loadbalancer</artifactId></dependency>
  • 配置使用仍是和 ribbon 同樣配置3d

 
 
  1. @Configuration

  2. public class LbConfiguration {

  3.    @Bean

  4.    @LoadBalanced

  5.    RestTemplate restTemplate() {

  6.        return new RestTemplate();

  7.    }

  8. }


  9. @GetMapping("/demo")

  10. public String doOtherStuff() {

  11.    return restTemplate.getForObject("http://big-provider-server/demo", String.class);

  12. }

源碼解析

LoadBalancerClient 實現

圖片

  • 目前版本只提供了 BlockingLoadBalancerClient 的實現, 注意看中文註釋

 
 
  1. // 刪除只保留了核心代碼注意

  2. public class BlockingLoadBalancerClient implements LoadBalancerClient {


  3.    @Override

  4.    public <T> T execute(String serviceId, LoadBalancerRequest<T> request)

  5.            throws IOException {

  6.        // 根據 服務名稱去查詢可用實例

  7.        ServiceInstance serviceInstance = choose(serviceId);

  8.        return execute(serviceId, serviceInstance, request);

  9.    }


  10.    @Override

  11.    public ServiceInstance choose(String serviceId) {

  12.        // 獲取負載均衡策略

  13.        ReactiveLoadBalancer<ServiceInstance> loadBalancer = loadBalancerClientFactory

  14.                .getInstance(serviceId);

  15.        // 執行負載均衡策略獲取能夠實例

  16.        Response<ServiceInstance> loadBalancerResponse = Mono.from(loadBalancer.choose())

  17.                .block();

  18.        return loadBalancerResponse.getServer();

  19.    }


  20. }

loadBalancer 負載均衡策略實現

圖片

  • 目前只有一個RoundRobinLoadBalancer 輪詢選擇server的方式

 
 
  1. public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer {

  2.    public Mono<Response<ServiceInstance>> choose(Request request) {

  3.        ServiceInstanceSupplier supplier = this.serviceInstanceSupplier.getIfAvailable();

  4.        return supplier.get().collectList().map(instances -> {

  5.            if (instances.isEmpty()) {

  6.                log.warn("No servers available for service: " + this.serviceId);

  7.                return new EmptyResponse();

  8.            }

  9.            // TODO: enforce order?

  10.            int pos = Math.abs(this.position.incrementAndGet());


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


  12.            return new DefaultResponse(instance);

  13.        });

  14.    }


  15. }

和ribbon 比較

默認負載均衡比較

  • ribbon 提供7中默認的負載均衡策略,常見的常見都有覆蓋,通常咱們都是使用 ZoneAvoidanceRule 複合判斷server所在區域的性能和server的可用性選擇server 圖片

配置方面豐富性

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

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

結論

  • 老老實實用 ribbon 圖片

相關文章
相關標籤/搜索