1. 程式人生 > 其它 >Spring Cloud入門之客戶端負載均衡Ribbon

Spring Cloud入門之客戶端負載均衡Ribbon

技術標籤:Spring CloudSpring CloudRibbon

Spring Cloud 之 客戶端負載均衡

1、負載均衡

  負載均衡是分散式(微服務)架構的重要組成部分,負載均衡機制決定了整個服務叢集的效能和穩定。

  負載均衡可以分為服務端負載均衡和客戶端負載均衡兩類,其中服務端負載均衡可通過硬體裝置或軟體來實現,硬體有F5、Array等,軟體有LVS、Nginx等;客戶端負載均衡相對伺服器負載均衡而言,主要指服務清單存放在客戶端本地,一般是從註冊中心進行抓取並進行維護。在前面學習服務治理框架的時候,提到的負載均衡就是指的客戶端負載均衡器。

2、準備測試環境

  為了驗證客戶端負載均衡,則需要為一個服務啟動多個例項,並註冊到註冊中心中。這裡選擇上一節中的註冊中心和服務提供者,然後執行多個服務提供者例項即可。執行多例項的方式請參考

《IntelliJ Idea如何為一個專案啟動多個專案例項》

  執行多個例項後,進入註冊中心,可以發現EUREKA-PROVIDER有了多個例項,如下所示:

3、LoadBalancerClient實現負載均衡

  Spring Cloud Commons模組提供了大量的與服務治理相關的抽象介面,除了上一篇中提到的服務發現介面DiscoveryClient外,還有今天要用到的LoadBalancerClient介面。

  為了使用LoadBalancerClient實現負載均衡,我們重寫上一篇中的消費者即可。

3.1、引入依賴

  上一篇中提到簡單使用服務發現,可以不用引入spring-cloud-starter-netflix-eureka-client依賴,其實在實際工作中,一般都是需要引入該依賴的,只有這樣,該服務才會被註冊到註冊中心進行統一管理和維護。

  這裡,為了實現客服端負載均衡,該依賴也是必須要引入的,否則LoadBalancerClient的實現類不會被注入到Spring的IOC容器中。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.2、修改application.properties配置檔案

  這裡必須設定Eureka註冊中心的地址,否則因為引入了spring-cloud-starter-netflix-eureka-client依賴,使用預設的配置可能會出現錯誤。

spring.application.name=eureka-consumer
server.port=8020

#設定Eureka註冊中心的地址。
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka/
3.3、增加負載均衡測試類

  這裡通過注入LoadBalancerClient例項,然後通過loadBalancerClient.choose()方法,使用預設輪詢策略選取服務提供者例項(為了驗證結果,我們返回了例項的地址)。

@RestController
public class LoadBalancerController {

    Logger logger = Logger.getLogger(LoadBalancerController.class);

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @RequestMapping("/loadBalancer")
    public String loadBalancer(){
        logger.info("執行消費者LoadBalancerController的loadBalancer()方法!");
        ServiceInstance instance = loadBalancerClient.choose("eureka-provider");
        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/provider";
        return url;
    }
}
3.4、啟動類、驗證

  其他類和配置都不需要改變,然後執行該應用,啟動成功後,訪問http://localhost:8020/loadBalancer地址,多次重新整理會發現“http://localhost:8011/provider”和“http://localhost:8010/provider”結果會交替出現,說明該負載均衡的預設策略是1:1權重的輪詢。

4、Spring Cloud Ribbon

  Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端負載均衡的工具。它是一個基於HTTP和TCP的客戶端負載均衡器。Ribbon實現客戶端負載均衡的步驟如下:

4.1、引入依賴

  為了使用Ribbon負載均衡,需要引入spring-cloud-starter-ribbon依賴,如下:

org.springframework.cloud
spring-cloud-starter-ribbon
1.4.7.RELEASE

4.2、修改RestTemplate例項注入Spring IOC容器的方式

  在啟動類中,依賴注入RestTemplate例項的時候,增加了一個@LoadBalanced註解。這樣RestTemplate例項物件,在呼叫服務地址的時候,就具備了負載均衡的能力,至於為什麼具有了該能力,後續我們在深入瞭解。

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}
4.3、編寫Ribbon測試類

  這裡和前面使用DiscoveryClient實現服務發現的區別在於:這裡的url中,直接用服務名稱代替了原來的IP+Port,為什麼要這樣子呢?在RestTemplate例項注入Spring IOC容器時,使用了@LoadBalanced註解,而RestTemplateCustomizer會對所有被@LoadBalanced註解的例項物件,添加了一個LoadBalancerInterceptor攔截器。利用RestTempllate的攔截器,就會實現負載均衡策略,並將請求的地址中的服務邏輯名轉為具體的服務地址。

@RestController
public class RibbonController {

    Logger logger = Logger.getLogger(RibbonController.class);

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/ribbon")
    public String ribbon(){
        logger.info("執行消費者ConsumerController的consumer()方法!");
        String url = "http://eureka-provider/provider";
        return restTemplate.getForObject(url,String.class);

    }
}
4.4、啟動,測試

  正常啟動應用後,多次訪問http://localhost:8020/ribbon地址,在兩個服務例項的控制檯分別會列印方法中的日誌,說明客戶端負載均衡生效了。