SpringCloud微服務中使用RestTemplate+Ribbon實現負載均衡(實現方法+實現原理+替換負載均衡策略)

java_codeMan發表於2020-10-10

前言:首先我們需要來了解一下什麼是ribbon?

Spring Cloud Ribbon是基於NetFlix Ribbon實現的一套客戶端負載均衡的工具。簡單的說,Ribbon是Netflix釋出的開源專案,主要功能是提供客戶端的軟體負載均衡演算法和服務呼叫。Ribbon客戶端元件提供一系列完善的配置項如連線超時,重試等。簡單的說,就是在配置檔案中列出Load Balancer(簡稱LB)後面所有的機器,Ribbon會自動的幫準基於某種規則(如簡單輪詢,隨機連線等)去連線這些機器。我們很容易使用Ribbon實現自定義的負載均衡演算法。

以下介紹RestTemplate+Ribbon負載均衡的實現過程,本示例專案結構:

  1. springcloud_demo:專案名稱
  2. eureka-server-7001:7001埠啟動的eureka
  3. provider-8001:8001埠啟動的服務提供者
  4. provider-8002:8002埠啟動的服務提供者
  5. consumer:服務消費者

說明:本篇部落格主要講RestTemplate+Ribbon負載均衡實現過程,沒有說明詳細專案建立步驟,如果對SpringCloud專案構建以及消費者叢集有疑問的小夥伴,請參照我的另外兩篇部落格:使用Idea構建SpringCloud專案SpringCloud微服務中Eureka叢集與服務提供者叢集的實現



一。RestTemplate+Ribbon負載均衡的實現

1.匯入依賴

在pom.xml檔案中新增以下依賴:

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

值得注意的是,在新版的Eureka中已經預設整合了Ribbon,所以我們也可以不引入上一步的依賴:

在這裡插入圖片描述
如下圖所示:Eureka依賴下已存在Ribbon的依賴:

在這裡插入圖片描述

2.編碼階段

編寫RestTemplate配置類,使用@Configuration註解將RestTemplate注入到Spring容器中:

@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

編寫呼叫服務提供者模組介面程式碼:

@Service
public class ProviderTemplate {

    @Autowired
    private RestTemplate restTemplate;

    public String getInfoByTemplate() {
        //呼叫子模組介面地址
        String name = restTemplate.getForObject("http://service-provider/provider/getInfo", String.class);
        return name;
    }
}

服務提供者8001介面詳情:

在這裡插入圖片描述

服務提供者8002介面詳情:

在這裡插入圖片描述

控制類程式碼:

@RequestMapping("consumer")
@RestController
public class ConsumerController {

    @Autowired
    private ProviderTemplate providerTemplate;

    @RequestMapping("getInfoByTemplate")
    public String getInfoByTemplate(){
        return providerTemplate.getInfoByTemplate();
    }
    

3.測試階段

依次啟動,訪問:http://localhost:8777/consumer/getInfoByTemplate,重新整理數次,發現8001,8002埠輪詢的在提供服務:

在這裡插入圖片描述

在這裡插入圖片描述

到這裡,基於RestTemplate+Ribbon的簡單負載均衡就已經實現了。

二。負載均衡實現原理

預設輪詢演算法原理

在這裡插入圖片描述

三。替換負載均衡策略

1.常用的幾種負載均衡策略

名稱以及解釋:

在這裡插入圖片描述
關係圖:

在這裡插入圖片描述

2.替換策略

這裡我們把預設的輪詢方式改為隨機的方式,首先我們需要注意IRule介面,這個是實現負載均衡方式的介面,其原始碼如下:

在這裡插入圖片描述
我們需要再新建一個配置類實現IRule介面去配置我們的Ribbon負載均衡方式,特別需要注意的是,但是這裡需要注意一個問題:

在這裡插入圖片描述
點開啟動類中的@SpringBootApplication註解,其原始碼中包含了@ComponentScan註解,瞭解到該配置類不能和啟動類在同一個包或者該包的子包下:

在這裡插入圖片描述
新建一個名叫rule的包,再新建一個MySelfRule自定義負載均衡方式類:

在這裡插入圖片描述
MySelfRule配置類程式碼如下:

@Configuration
public class MySelfRule {

    @Bean
    public IRule myRule() {

        return new RoundRobinRule();// 定義為隨機
    }
}
 

最後在啟動類中加上@RibbonClient註解,指定ribbon負載均衡自定義更換策略:

在這裡插入圖片描述

3.重新測試

重新依次啟動並測試,你會發現8001,8002出現的概率是隨機分佈的了,而不是你一下我一下這樣的輪詢方式出現了:

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

相關文章