Spring cloud alibaba之Ribbon負載均衡實現方案

1.什麼是Ribbon

目前主流的負載均衡方案分為以下兩種:

(1)集中式負載均衡:在消費者和服務提供者中間使用獨立的代理方式進行負載,有硬件的(F5),軟件的Nginx

(2)客戶端事先拿到提供者請求連接集合,根據自己的請求情況做負載均衡,Ribbon就屬於客戶端自己做負載均衡。

Spring cloud Ribbon是基於Netflix Ribbon實現的一套客戶端的負載均衡工具,Ribbon客戶端提供一系列完善的配置,如超時、重試等。通過Load Balancer獲取到服務器提供的所有機器實例,Ribbon會自動基於某種規則(輪詢、隨機)去調用這些服務。Ribbon也可以實現自己的負載均衡算法。

1.1客戶端的負載均衡

例如spring cloud中的Ribbon,客戶端會有一個服務器地址列表,在發送請求前通過負載均衡算法選擇一個服務器,然後進行訪問,這是客戶端負載均衡,即在客戶端進行負載均衡算法分配。

1.2服務器端的負載均衡

例如通過Nginx進行負載均衡,先發送請求,然後通過負載均衡算法,在多個服務器之間選擇一個進行訪問;即在服務器端進行負載均衡算法分配。

1.3常見負載均衡算法

(1)隨機:通過隨機選擇服務進行執行,一般這種方法使用較少

(2)輪詢:負載均衡默認實現方式,請求來之後排隊處理

(3)加權輪詢:通過對服務器性能的分型,給高配置、低負載的服務器分配更高的權重,均衡各個服務器的壓力

(4)地址Hash,通過客戶端地址請求地址的hash值取模映射進行調度,

(5)最小鏈接數:即使請求均衡瞭,壓力不一定會均衡,最小鏈接數法就是根據服務器的情況,例如請求積壓數的參數,將請求分配到當前壓力最小的服務器上

2.Nacos使用Ribbon

(1)Nacos disconvery中默認已經引入瞭Ribbon,不需要單獨引入

(2)添加@LoadBalanced註解

(3)調用的時候使用服務器名稱替代ip+端口,即使用默認輪詢的負載均衡方式

3.Ribbon負載均衡策略

3.1常用負載均衡描述

①RandomRule:隨機選擇一個服務實例

②RoundRobinRule:輪詢負載均衡策略

③RetryTule:在輪詢的基礎上進行重試,一直重試的次數由服務連接的超時時間控制

④WeightedResponseTimeRule:一個服務的平均響應時間越短,則權重越大,那麼改實例被選中執行任務的概率也越大

⑤BestAvaliableRule:過濾掉失效的服務實例,順便找出並發最小的服務實例來使用

⑥ZoneAvoidanceRule:判斷所在的區域,選擇最近的服務調用

⑦NacosRule:按隨機與配置的權重進行選擇服務器

3.2修改默認的負載均衡策略–配置類的方式

①賦值一份消費端項目OrderNacos,重命名為OrderRibbon

刪除OrderRibbon中原先的OrderNacos.iml文件

修改OrderRibbon的pom.xml的ArtifactId值

把新添加的OrderRibbon添加到父項目的pom.xml的module中

刷新maven項目

②創建RibbonConfig配置類

使用@Configuration標識是配置類,使用@Bean註入到spring容器中,方法名必須叫iRule,否則無效。

/**
 * 重寫負載均衡配置類
 */
@Configuration
public class RibbonConfig {
 
 
    //方法名一定要叫iRule
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }
}

****註意此配置類不能放在@SpringBootApplication的註解@CompentScan掃描得到的地方,否則自定義的配置類就會被所有的RibbonClients共享,

springboot啟動類,沒有配置掃描范圍的話,默認掃描到與啟動類OrderApplication同目錄級別的文件,此處為qingyun包下的文件都會被掃描到。

配置的目錄如下:

③在啟動類中使用註解@RibbonClients加入配置的自定義負載均衡器,value裡面可以配置多個負載均衡器,是個數組類型的值;調用服務創建的RestTemplate使用@LoadBalanced進行修飾。

啟動消費者,兩個不同端口的服務提供者,通過頁面訪問,查看負載均衡機制由之前默認的改為輪詢的方式

3.3修改默認的負載均衡策略–配置文件的方式

使用配置文件的方式設定負載均衡方式,具體到某個服務,格式:服務名.ribbon.NFLoadBalancerRuleClassName=服務方式

stock-service.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule

在nacos管理界面配置服務器的權重,權重越大,被選中的概率越大。

也可以在項目配置文件中設置

#設置服務的權重
spring.cloud.nacos.discovery.weight=4

3.4自定義負載均衡策略

(1)定義一個類繼承AbstractLoadBalancerRule,重寫choose方法

/**
 * 自定義負載均衡策略
 */
public class CustomRule extends AbstractLoadBalancerRule {
 
 
    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
 
    }
 
    @Override
    public Server choose(Object o) {
        ILoadBalancer loadBalancer = this.getLoadBalancer();
 
        //獲取當前請求的實例集合
        List<Server> reachableServers = loadBalancer.getReachableServers();
 
        //使用線程安全生成一個隨機數
        int i = ThreadLocalRandom.current().nextInt(reachableServers.size());
 
        //獲取服務
        Server server = reachableServers.get(i);
 
 
        return server;
    }
}

(2)在application.properties中添加配置信息,指向自定義的配置類

stock-service.ribbon.NFLoadBalancerRuleClassName=com.rule.CustomRule

(3)開啟ribbon饑餓加載

當沒有任何配置的情況下,第一次請求服務時,才會請求加載對應的服務實例

可以在配置文件application.properties中配置饑餓加載

#開啟ribbon饑餓加載
ribbon.eager-load.enabled=true
#饑餓加載是服務,多個使用逗號隔開
ribbon.eager-load.clients=stock-service

啟動項目的時候,加載配置服務使用的負載均衡策略

4.使用spring cloud loadbalancer替代ribbon

(1)在pom.xml中引入nacos-discovery時,去除ribbon,此時項目依賴的包裡面已經移除ribbon

(2)pom.xml中添加loadbalancer依賴,前提是項目中已經引入瞭spring cloud依賴(父maven已經引入)

  <!-- 添加loadbalancer依賴-->
  <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  </dependency>

(3)創建RestTemplate時,需要加@LoadBalanced

//程序啟動時創建RestTemplate
    //使用註解LoadBalanced標識負載均衡,默認輪詢的方式
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate build = builder.build();
        return build;
    }

(4)application.properties中禁用ribbon

#禁用ribbon
spring.cloud.loadbalancer.ribbon.enabled=false

(5)若是想自定義loadbalancer,與自定義ribbon類似的方式,使用@LoadBalancerClients配置到springboot啟動類中

到此這篇關於Spring cloud alibaba–Ribbon負載均衡的文章就介紹到這瞭,更多相關Spring cloud alibaba–Ribbon負載均衡內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: