Spring Cloud 總結筆記(二)—負載均衡(Ribbon)

Ribbon是用於實現服務與服務之間的負載均衡的技術。官網原文:Ribbon is a client-side load balancer that gives you a lot of control over the behavior of HTTP and TCP clients.html

已知Eureka Client會從Eureka Server上拉取服務信息保存在本地緩存中,當被調用的服務是集羣方式部署時,調用端本地緩存就會存在多個目標服務的信息,而此時就須要經過必定的策略決定調用哪一個服務(負載均衡)。而Ribbon就是用來實現負載均衡的。根據實施位置,可分爲:java

  • 客戶端負載均衡:調用方將被調用方的信息所有拉取到本地緩存,在本地經過必定的策略選擇其中一個。表明:Ribbon
  • 服務端負載均衡:在服務的註冊中心中,根據調用方將負載均衡策略,選擇一個被調用的服務返回給調用方。表明:Dubbo

一、基本使用

示例提供兩個dept服務給emp模塊調用spring

1.一、啓動多個服務提供Client

複製一個dept模塊的啓動器,並修改啓動端口爲8082緩存

1.二、在被調用方引入依賴包

在emp模塊中添加以下依賴併發

<!--Ribbon-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

1.三、整合 RestTemplate和Ribbon

  • 在emp模塊的RestTemplate的配置類中給RestTemplate的bean實例加上@LoadBalanced註解
@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  • 修改服務調用app

    修改接口調用的代碼,將IP+PORT改爲服務名稱,也就是註冊到Eureka中的名稱。接口調用的時候,框架內部會將服務名稱替換成具體的服務IP信息,而後進行調用。負載均衡

    使用restTemplate.getForObject("http://目標服務名/目標接口路徑", 返回值類型)的方法,獲取返回值。框架

    @RestController
    public class EmpController {
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("/emp/all")
        public String getAll() {
            //經過restTemplate對象訪問目標服務
            String result = restTemplate.getForObject("http://dept/dept/all", String.class);
            //獲取目標結果並返回
            System.out.println(result);
            return "emp: " + "\t" + result;
        }
    }

1.四、測試

啓動Eureka Server及Eureka Client,訪問emp模塊的功能。dom

二、負載均衡策略

Ribbon做爲一款客戶端負載均衡框架,默認的負載策略是輪詢,同時也提供了不少其餘的策略,可以讓用戶根據自身的業務需求進行選擇。ide

2.一、策略類型

以下是Ribbon提供的策略接口IRule及其實現類 的UML圖

經常使用策略介紹:

  • RoundRobinRule——輪詢策略(默認),輪詢index,選擇index對應位置服務
  • RandomRule——隨機策略
  • WeightedResponseTimeRule——響應權重策略,輪詢的子類,默認使用輪詢,後續根據服務的響應時間決定
  • BestAvailableRule——最優訪問策略,根據被調用方併發數決定,即最少訪問優先。若是服務的斷路器打開,則忽略,再選擇其中併發連接最低的服務

  • RetryRule——重試策略,在一個配置時間段內,當選擇的服務不成功,則一直嘗試選擇一個可用的服務
  • ZoneAvoidanceRule——區域權重策略,綜合判斷服務所在區域的性能,和服務的可用性,輪詢選擇服務而且判斷一個AWS Zone的運行性能是否可用,剔除不可用的Zone中的全部服務
  • AvailabilityFilteringRule——過濾掉那些一直鏈接失敗的且被標記爲circuittripped的服務,並過濾掉那些高併發的服務或者使用一個AvailabilityPredicate來包含過濾服務的邏輯。其實就是檢查Status裏記錄的各個服務 的運行狀態。

2.二、策略配置

2.2.一、配置類方式

在EMP模塊添加以下配置類便可

@Configuration
public class RibbonConfig {
    @Bean
    public IRule rule() {
        return new RandomRule();
        //return new RoundRobinRule();
        //return new WeightedResponseTimeRule();
        //return new BestAvailableRule();
    }
}
2.2.二、配置文件方式(推薦)

在調用方yml文件中指定目標服務的負載均衡策略,此方式可單獨指定每一個服務的策略類型。配置以下:

DEPT:	#目標服務名
  ribbon:
  	#指定負載均衡策略
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

官網說明以下 :

https://docs.spring.io/spring-cloud-netflix/docs/2.2.7.RELEASE/reference/html/#customizing-the-ribbon-client-by-setting-properties

相關文章
相關標籤/搜索