4. Spring Cloud Ribbon 實現“負載均衡”的詳細配置說明
@
- 4. Spring Cloud Ribbon 實現“負載均衡”的詳細配置說明
- 前言
- 1. Ribbon 介紹
- 1.1 LB(Load Balance 負載均衡)
- 2. Ribbon 原理
- 2.2 Ribbon 機制
- 3. Spring Cloud Ribbon 實現負載均衡演算法-應用例項
- 4. 總結:
- 5. 最後:
前言
- 對應上一篇學習內容:🌟🌟🌟ChinaRainbowSea-CSDN部落格
- 對應下一篇學習內容:🌟🌟🌟
1. Ribbon 介紹
Ribbon 是什麼 ?
1.Spring Cloud Ribbon 是基於Netflix Ribbon 實現的一套客戶端,負載均衡的工具
2.Ribbon 主要功能是提供客戶端負載均衡演算法和服務呼叫
3.Ribbon 客戶端元件提供一系列完善的配置項如“連線超時,重試”
4.Ribbon 會基於某種規則(如簡單輪詢,隨機連線等)去連線指定服務
5.程式設計師很容易是由 Ribbon 的負載均衡演算法實現負載均衡
6.一句話: Ribbon: 負載均衡 + RestTemplate 呼叫
Ribbon 的官網地址: https://github.com/Netflix/ribbon
Ribbon 進入維護狀態?
Ribbon 目前進入維護模式, 未來替換方案 是 Spring Cloud LoadBalancer
1.1 LB(Load Balance 負載均衡)
LB 分類
- 集中式: LB
即在服務的消費方和提供方之間使用獨立的LB設施(可以是硬體,如F5,也可以是軟體,如 Nginx)
由該設施負責把訪問請求透過某種策略轉發至服務的提供方。
- 程序內 LB
將 LB邏輯整合到消費方,消費方服務註冊中心獲知有哪些地址可用,然後再從這些地址中選擇
一個合適的服務地址
Ribbon 就屬於程序內 L B,它只是一個類庫,整合於消費方程序,消費方透過它來獲取到服務提供方的地址。
特別說明:在上一篇的學習內容上:例項-前面 member-consumer 輪詢負載訪問 10000/10002 底層就是 Ribbon 預設的輪詢負載演算法。
2. Ribbon 原理
Ribbon 架構圖&機制
2.2 Ribbon 機制
Ribbon 機制:
- 先選擇 EurekaServer,它優先 選擇在同一個區域內負載較少的 Server 服務。
- 再根據使用者指定的策略,在從 Server 取到的服務註冊列表中選擇一個地址
- Ribbon 提供了多種策略:比如:輪詢,隨機和根據響應時間加權等等 。
Ribbon 常見負載演算法
3. Spring Cloud Ribbon 實現負載均衡演算法-應用例項
需求分析/圖解
- 需求: 將預設的輪詢演算法改成隨機演算法 RandomRule
- 瀏覽器輸入 : http://localhost/member/consumer/get/1
- 要求 訪問的 10000/10002 埠的服務是隨機的,也就是設定為:RandomRule 隨機負載均衡
其實:所謂的隨機是在少量資料上是隨機的,但是在大量資料的基礎上,隨機的結果基本上和平均 差不多。
- 首先:建立 member-service-consumer-80 com/rainbowsea/springcloud/config/RibbonRule.java,隨機負載均衡的演算法的配置類,進行配置隨機負載均衡 。
package com.rainbowsea.springcloud.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RibbonRule {
@Bean // 配置注入自己的負載均衡演算法
public IRule myRibbonRule() {
// 這裡老師返回的是 RandomRule,大家也可以指定其他的內容。
//return new WeightedResponseTimeRule();
return new RandomRule(); // 隨機演算法
}
}
注意:同時還需要在對應的Eureka Client 客戶端當中的
RestTemplate
Http模板 的位置開啟, 加入@LoadBalanced
開啟負載均衡
以及同時還需要在對應的Eureka Client 客戶端 的場景啟動器的位置開啟,當中加入
@RibbonClient
註解標明:使用的是 Ribbon 下的負載均衡上的哪個演算法。
@RibbonClient(name = "MEMBER_SERVICE_PROVIDER_URL",configuration = RibbonRule.class) // 指定 Ribbon 的負載均衡演算法
package com.rainbowsea.springcloud; import com.rainbowsea.springcloud.config.RibbonRule; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; // 如果錯誤: 加入排除 DataSourceAutoConfiguration 自動配置 //@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) //@EnableEurekaClient 表示將專案/模組/程式 標註作為 Eureka Client @EnableEurekaClient @SpringBootApplication @EnableDiscoveryClient // 啟用服務發現 @RibbonClient(name = "MEMBER_SERVICE_PROVIDER_URL",configuration = RibbonRule.class) // 指定 Ribbon 的負載均衡演算法 public class MemberConsumerApplication80 { public static void main(String[] args) { SpringApplication.run(MemberConsumerApplication80.class, args); } }
測試
- 瀏覽器輸入 : http://localhost/member/consumer/get/1
- 觀察訪問的 10000/10002 埠的服務是隨機的。
4. 總結:
- Spring Cloud Ribbon 是基於Netflix Ribbon 實現的一套客戶端,負載均衡的工具。
- LB(Load Balance 負載均衡) 兩種分類:
- 集中式: LB
- 程序內 LB
- Ribbon 原理和機制
- 先選擇 EurekaServer,它優先 選擇在同一個區域內負載較少的 Server 服務。
- 再根據使用者指定的策略,在從 Server 取到的服務註冊列表中選擇一個地址
- Ribbon 提供了多種策略:比如:輪詢,隨機和根據響應時間加權等等 。
- Ribbon 常見的負載均衡演算法。
- 配置 Spring Cloud Ribbon 的三點:
- 建立配置對應 Ribbon 下的
負載均衡的演算法的配置類(注意標註配置類註解@Configuration 和對應的方法處加入'@Bean加入 ioc 容器管理' )
,進行配置負載均衡 ,直接 new 對應的 Ribbon 下的 負載均衡演算法即可,比如: RandomRule,RoundRobinRule- 還需要在對應的Eureka Client 客戶端當中的
RestTemplate
Http模板 的位置開啟, 加入@LoadBalanced
開啟負載均衡@LoadBalanced 註解標註負載均衡
- 同時還需要在對應的Eureka Client 客戶端 的場景啟動器的
類上
位置開啟,當中加入@RibbonClient
註解標明:使用的是 Ribbon 下的負載均衡上的哪個演算法。@RibbonClient(name = "MEMBER_SERVICE_PROVIDER_URL",configuration = RibbonRule.class) // 指定 Ribbon 的負載均衡演算法
5. 最後:
“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關注和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”