專欄集錦,大佬們可以收藏以備不時(shí)之需
Spring Cloud實(shí)戰(zhàn)專欄:https://blog.csdn.net/superdangbo/category_9270827.html
Python 實(shí)戰(zhàn)專欄:https://blog.csdn.net/superdangbo/category_9271194.html
Logback 詳解專欄:https://blog.csdn.net/superdangbo/category_9271502.html
tensorflow專欄:https://blog.csdn.net/superdangbo/category_8691332.html
Redis專欄:https://blog.csdn.net/superdangbo/category_9950790.html
1024程序員節(jié)特輯文章:
1024程序員狂歡節(jié)特輯 | ELK+ 協(xié)同過濾算法構(gòu)建個(gè)性化推薦引擎,智能實(shí)現(xiàn)“千人千面”
1024程序員節(jié)特輯 | 解密Spring Cloud Hystrix熔斷提高系統(tǒng)的可用性和容錯(cuò)能力
1024程序員節(jié)特輯 | ELK+ 用戶畫像構(gòu)建個(gè)性化推薦引擎,智能實(shí)現(xiàn)“千人千面”
1024程序員節(jié)特輯 | OKR VS KPI誰更合適?
1024程序員節(jié)特輯 | Spring Boot實(shí)戰(zhàn) 之 MongoDB分片或復(fù)制集操作
Spring實(shí)戰(zhàn)系列文章:
Spring實(shí)戰(zhàn) | Spring AOP核心秘笈之葵花寶典
Spring實(shí)戰(zhàn) | Spring IOC不能說的秘密?
國慶中秋特輯系列文章:
國慶中秋特輯(八)Spring Boot項(xiàng)目如何使用JPA
國慶中秋特輯(七)Java軟件工程師常見20道編程面試題
國慶中秋特輯(六)大學(xué)生常見30道寶藏編程面試題
國慶中秋特輯(五)MySQL如何性能調(diào)優(yōu)?下篇
國慶中秋特輯(四)MySQL如何性能調(diào)優(yōu)?上篇
國慶中秋特輯(三)使用生成對(duì)抗網(wǎng)絡(luò)(GAN)生成具有節(jié)日氛圍的畫作,深度學(xué)習(xí)框架 TensorFlow 和 Keras 來實(shí)現(xiàn)
國慶中秋特輯(二)浪漫祝福方式 使用生成對(duì)抗網(wǎng)絡(luò)(GAN)生成具有節(jié)日氛圍的畫作
國慶中秋特輯(一)浪漫祝福方式 用循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)或長短時(shí)記憶網(wǎng)絡(luò)(LSTM)生成祝福詩詞
一、Ribbon發(fā)展歷史和底層原理
Ribbon 是 Netflix 開發(fā)的一個(gè)開源項(xiàng)目,主要用于實(shí)現(xiàn)客戶端負(fù)載均衡。其發(fā)展歷史可以追溯到 2013 年,隨著 Spring Cloud 生態(tài)的發(fā)展,Ribbon 逐漸成為 Spring Cloud 的一部分,被廣泛應(yīng)用于微服務(wù)架構(gòu)中。
- 負(fù)載均衡底層原理
Ribbon 的負(fù)載均衡底層原理是通過 RestTemplate 發(fā)起請(qǐng)求時(shí),根據(jù)配置的負(fù)載均衡策略選擇服務(wù)提供者。以下是 Ribbon 支持的負(fù)載均衡策略:
- RoundRobin(輪詢):默認(rèn)策略,按照順序依次選擇服務(wù)提供者。
- Random(隨機(jī)):隨機(jī)選擇服務(wù)提供者。
- BestConnection(最佳連接):根據(jù)服務(wù)提供者的響應(yīng)時(shí)間選擇最短的那個(gè)。
- Sentinel(圍欄):根據(jù)服務(wù)提供者的響應(yīng)時(shí)間進(jìn)行降級(jí)處理。
- 適用場(chǎng)景
Ribbon 適用于以下場(chǎng)景:
- 集群中各個(gè)節(jié)點(diǎn)提供服務(wù)能力等同且無狀態(tài)的場(chǎng)景。
- 需要根據(jù)請(qǐng)求特征或響應(yīng)時(shí)間進(jìn)行負(fù)載均衡的場(chǎng)景。
- 需要實(shí)現(xiàn)動(dòng)態(tài)發(fā)現(xiàn)和負(fù)載均衡的微服務(wù)架構(gòu)。
- 詳細(xì)參數(shù)
Ribbon 的配置主要通過 application.properties 或 application.yml 文件進(jìn)行設(shè)置。以下是一些常用參數(shù):
- listOfServers:指定服務(wù)提供者的地址列表,用逗號(hào)分隔。
- loadBalancer:負(fù)載均衡策略配置。
- roundRobin:輪詢策略配置,無特殊參數(shù)。
- random:隨機(jī)策略配置,無特殊參數(shù)。
- bestConnection:最佳連接策略配置,可設(shè)置以下參數(shù):
timeout:連接超時(shí)時(shí)間,單位為毫秒。
sentinel:圍欄策略配置,可設(shè)置以下參數(shù):
stat:統(tǒng)計(jì)信息配置,包括:
enabled:是否啟用統(tǒng)計(jì)信息,默認(rèn) false。
timeout:統(tǒng)計(jì)超時(shí)時(shí)間,單位為毫秒,默認(rèn) 1000。
- 發(fā)展歷史
- 2013 年,Netflix 開發(fā)了 Ribbon,用于解決內(nèi)部微服務(wù)架構(gòu)的負(fù)載均衡問題。
- 2017 年,Spring Cloud 項(xiàng)目收購了 Ribbon,并將其作為 Spring Cloud 的一部分進(jìn)行維護(hù)和發(fā)展。
- 至今,Ribbon 成為了 Spring Cloud 生態(tài)系統(tǒng)中重要的組成部分,被廣泛應(yīng)用于微服務(wù)架構(gòu)。
- 總結(jié)
Ribbon 是一個(gè)成熟且實(shí)用的負(fù)載均衡組件,其底層原理是通過 RestTemplate 發(fā)起請(qǐng)求時(shí),根據(jù)配置的負(fù)載均衡策略選擇服務(wù)提供者。通過調(diào)整負(fù)載均衡策略和參數(shù),可以滿足不同場(chǎng)景下的需求。隨著 Spring Cloud 生態(tài)系統(tǒng)的發(fā)展,Ribbon 將繼續(xù)完善和擴(kuò)展其功能,為微服務(wù)架構(gòu)提供更好的支持。
https://github.com/Netflix/ribbon
二、負(fù)載均衡策略
Ribbon 支持以下幾種負(fù)載均衡策略:
- RoundRobin(輪詢)
輪詢策略是 Ribbon 的默認(rèn)負(fù)載均衡策略。它按照順序依次選擇服務(wù)提供者。以下是輪詢策略的代碼分析:
在 Ribbon 中,輪詢策略實(shí)現(xiàn)在DefaultLoadBalancer
類中。DefaultLoadBalancer
繼承自AbstractLoadBalancer
類。以下是輪詢策略的關(guān)鍵代碼:
public class DefaultLoadBalancer extends AbstractLoadBalancer {
private final AtomicInteger index = new AtomicInteger(0);
@Override
protected Server choose(Server[] servers) {
int currentIndex = index.getAndUpdate(i -> (i + 1) % servers.length);
return servers[currentIndex];
}
}
在這個(gè)代碼中,choose
方法是 Ribbon 負(fù)載均衡的核心方法。它接收一個(gè)服務(wù)器數(shù)組作為參數(shù)。index
原子變量用于記錄當(dāng)前輪詢到的服務(wù)器索引。每次調(diào)用 choose
方法時(shí),索引會(huì)加 1,并對(duì)服務(wù)器數(shù)組取模,得到一個(gè)新的索引。然后從新的索引位置取出對(duì)應(yīng)的服務(wù)器作為負(fù)載均衡選擇的結(jié)果。
2. Random(隨機(jī))
隨機(jī)策略是另一種簡(jiǎn)單的負(fù)載均衡策略。它隨機(jī)選擇一個(gè)服務(wù)提供者。以下是隨機(jī)策略的代碼分析:
public class RandomLoadBalancer extends AbstractLoadBalancer {
@Override
protected Server choose(Server[] servers) {
int randomIndex = new Random().nextInt(servers.length);
return servers[randomIndex];
}
}
在這個(gè)代碼中,choose
方法通過 Random
類的 nextInt
方法生成一個(gè)隨機(jī)整數(shù),然后使用這個(gè)整數(shù)作為索引從服務(wù)器數(shù)組中選取一個(gè)隨機(jī)的服務(wù)器。
3. BestConnection(最佳連接)
最佳連接策略會(huì)根據(jù)服務(wù)提供者的響應(yīng)時(shí)間選擇最短的那一個(gè)。以下是最佳連接策略的代碼分析:
public class BestConnectionLoadBalancer extends AbstractLoadBalancer {
private final List<Server> sortedServers = new ArrayList<>();
@Override
protected Server choose(Server[] servers) {
// 獲取所有服務(wù)器的響應(yīng)時(shí)間
List<Long> responseTimes = getResponseTimes(servers);
// 對(duì)服務(wù)器按照響應(yīng)時(shí)間進(jìn)行降序排序
sortedServers.sort(Comparator.comparingLong(o -> o));
// 返回響應(yīng)時(shí)間最短的服務(wù)器
return sortedServers.get(0);
}
private List<Long> getResponseTimes(Server[] servers) {
// 獲取服務(wù)器響應(yīng)時(shí)間的邏輯,這里省略
}
}
在這個(gè)代碼中,choose
方法首先獲取所有服務(wù)器的響應(yīng)時(shí)間,然后對(duì)服務(wù)器按照響應(yīng)時(shí)間進(jìn)行降序排序。最后返回響應(yīng)時(shí)間最短的服務(wù)器。
4. Sentinel(圍欄)
圍欄策略是根據(jù)服務(wù)提供者的健康狀況和權(quán)重進(jìn)行負(fù)載均衡。以下是圍欄策略的代碼分析:
public class SentinelLoadBalancer extends AbstractLoadBalancer {
private final Map<Server, Integer> serverWeights = new HashMap<>();
@Override
protected Server choose(Server[] servers) {
// 獲取所有服務(wù)器的權(quán)重總和
int totalWeight = getTotalWeights(servers);
// 初始化圍欄統(tǒng)計(jì)信息
for (Server server : servers) {
serverWeights.put(server, 1);
}
// 按照權(quán)重比例從服務(wù)器列表中選取一個(gè)服務(wù)器
int randomWeight = new Random().nextInt(totalWeight);
int currentWeight = 0;
for (Map.Entry<Server, Integer> entry : serverWeights.entrySet()) {
currentWeight += entry.getValue();
if (randomWeight < currentWeight) {
return entry.getKey();
}
}
// 如果沒有合適的服務(wù)器,則拋出異常
throw new IllegalStateException("No available server found");
}
private int getTotalWeights(Server[] servers) {
// 獲取服務(wù)器權(quán)重總和的邏輯,這里省略
}
}
在這個(gè)代碼中,choose
方法首先獲取所有服務(wù)器的 權(quán)重總和,然后遍歷服務(wù)器列表,根據(jù)權(quán)重比例隨機(jī)選擇一個(gè)服務(wù)器。如果在遍歷過程中找不到合適的服務(wù)器(即隨機(jī)權(quán)重小于當(dāng)前權(quán)重),則返回當(dāng)前服務(wù)器的引用。如果最終沒有找到合適的服務(wù)器,則拋出異常。
圍欄策略的優(yōu)點(diǎn)是根據(jù)服務(wù)提供者的健康狀況和權(quán)重進(jìn)行負(fù)載均衡,可以確保請(qǐng)求分配得更均勻,同時(shí)避免了傳統(tǒng)輪詢策略可能導(dǎo)致的不公平問題。缺點(diǎn)是在服務(wù)器數(shù)量較少時(shí),可能會(huì)導(dǎo)致請(qǐng)求次數(shù)較多的服務(wù)器承擔(dān)更多的負(fù)載,而請(qǐng)求次數(shù)較少的服務(wù)器負(fù)載較輕。此外,圍欄策略的實(shí)現(xiàn)較為復(fù)雜,需要維護(hù)服務(wù)器的權(quán)重信息。
在實(shí)際應(yīng)用中,可以根據(jù)實(shí)際情況調(diào)整服務(wù)器的權(quán)重,以實(shí)現(xiàn)更精確的負(fù)載均衡。例如,可以根據(jù)服務(wù)器的處理能力、響應(yīng)時(shí)間等因素設(shè)置不同的權(quán)重。
三、Spring Cloud Ribbon實(shí)戰(zhàn)
Spring Cloud 負(fù)載均衡主要通過 Ribbon 來實(shí)現(xiàn)客戶端負(fù)載均衡。下面將詳細(xì)介紹如何使用 Spring Cloud Ribbon 實(shí)現(xiàn)負(fù)載均衡,包含完整代碼示例。
- 添加依賴
在項(xiàng)目的 pom.xml 文件中,添加 spring-cloud-starter-ribbon 依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>3.2.5</version>
</dependency>
- 啟用 Eureka 服務(wù)注冊(cè)
在項(xiàng)目的主啟動(dòng)類上添加@EnableEurekaClient 注解,以啟用 Eureka 服務(wù)注冊(cè)。
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 添加 Ribbon 配置
在 application.properties 或 application.yml 文件中添加 Ribbon 的配置,例如:
spring:
application:
name: movie-service
cloud:
ribbon:
my-service:
listOfServers: http://user-service-1.com, http://user-service-2.com
loadBalancer:
ribbon:
sentinel:
timeout: 1000
stat:
enabled: false
這里設(shè)置了負(fù)載均衡的策略為輪詢(round-robin),并指定了 user-service-1.com 和 user-service-2.com 為服務(wù)提供者。
4. 使用@LoadBalanced 注解
在需要進(jìn)行負(fù)載均衡的 RestTemplate 上添加@LoadBalanced 注解。
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.web.client.RestTemplate;
public class MovieService {
@LoadBalanced
private RestTemplate restTemplate;
// 使用 restTemplate 發(fā)起請(qǐng)求時(shí),會(huì)自動(dòng)進(jìn)行負(fù)載均衡
public String callUserService(String userServiceUrl) {
return restTemplate.getForObject(userServiceUrl, String.class);
}
}
- 測(cè)試負(fù)載均衡
啟動(dòng)電影服務(wù)(MovieService)和用戶服務(wù)(UserService),然后調(diào)用 movie 服務(wù)中的 callUserService 方法,觀察請(qǐng)求地址是否進(jìn)行了負(fù)載均衡。
以上代碼示例展示了如何使用 Spring Cloud Ribbon 實(shí)現(xiàn)客戶端負(fù)載均衡。在實(shí)際項(xiàng)目中,還可以根據(jù)需求自定義負(fù)載均衡策略,如響應(yīng)時(shí)間加權(quán)等。更多關(guān)于 Spring Cloud Ribbon 的詳細(xì)使用方法,可以參考官方文檔:http://cloud.spring.io/spring-cloud-static/Camden.SR7/#netflix-ribbon-starter
完整代碼:https://github.com/Netflix/ribbon/blob/master/ribbon-examples/src/main/java/com/netflix/ribbon/examples/rx/template/RxMovieTemplateExample.java
文章來源:http://www.zghlxwxcb.cn/news/detail-713364.html
四、Spring Cloud Ribbon常見問題和解決方案
在使用負(fù)載均衡 Ribbon 時(shí),可能會(huì)遇到一些常見問題,以下是一些這些問題及其解決方案:文章來源地址http://www.zghlxwxcb.cn/news/detail-713364.html
- 問題:服務(wù)注冊(cè)中心發(fā)現(xiàn)的服務(wù)實(shí)例數(shù)量不一致
解決方案:確保服務(wù)注冊(cè)中心(如 Eureka、Zookeeper 等)中的服務(wù)實(shí)例數(shù)量與實(shí)際運(yùn)行的服務(wù)實(shí)例數(shù)量一致。定期檢查并刪除已下線的服務(wù)實(shí)例。 - 問題:負(fù)載均衡策略失效
解決方案:檢查 Ribbon 的配置文件,確保負(fù)載均衡策略配置正確。如輪詢、隨機(jī)、最佳連接等。同時(shí),確保 Ribbon 與其他組件(如 Spring Cloud、Netflix OSS 等)的集成正確無誤。 - 問題:服務(wù)調(diào)用失敗
解決方案:檢查服務(wù)提供者的運(yùn)行狀態(tài),確保其正常運(yùn)行。同時(shí),檢查服務(wù)提供者的接口地址和端口是否正確。 - 問題:Ribbon 配置不生效
解決方案:確保 Ribbon 的配置文件(如 application.properties 或 application.yml)正確無誤。同時(shí),檢查 Ribbon 相關(guān)依賴是否已正確添加。 - 問題:服務(wù)延遲較高
解決方案:根據(jù)服務(wù)延遲情況,調(diào)整 Ribbon 的負(fù)載均衡策略。例如,將最佳連接策略中的超時(shí)時(shí)間設(shè)置合適值,以降低響應(yīng)時(shí)間較長的服務(wù)實(shí)例的權(quán)重。 - 問題:服務(wù)降級(jí)處理不生效
解決方案:檢查 Ribbon 的圍欄(Sentinel)策略配置,確保降級(jí)處理邏輯正確。如設(shè)置響應(yīng)時(shí)間閾值,并對(duì)超過閾值的服務(wù)實(shí)例進(jìn)行降級(jí)處理。 - 問題:多個(gè)相同服務(wù)實(shí)例的負(fù)載不均衡
解決方案:在 Ribbon 配置文件中,為相同服務(wù)實(shí)例設(shè)置不同的權(quán)重,以實(shí)現(xiàn)負(fù)載均衡。 - 問題:客戶端與服務(wù)端通信異常
解決方案:檢查客戶端與服務(wù)端的網(wǎng)絡(luò)連接,確保通信正常。如檢查防火墻、路由器等網(wǎng)絡(luò)設(shè)備配置,確保端口、IP 地址等設(shè)置正確。 - 問題:統(tǒng)計(jì)信息丟失
解決方案:確保 Ribbon 的統(tǒng)計(jì)信息配置正確,如開啟統(tǒng)計(jì)信息、設(shè)置統(tǒng)計(jì)超時(shí)時(shí)間等。通過查看 Ribbon 的統(tǒng)計(jì)信息,以便及時(shí)發(fā)現(xiàn)和處理潛在問題。 - 問題:資源消耗過高
解決方案:根據(jù)實(shí)際業(yè)務(wù)需求和系統(tǒng)資源狀況,調(diào)整 Ribbon 的配置。如降低連接數(shù)、設(shè)置合理的超時(shí)時(shí)間等,以降低資源消耗。
總之,在使用 Ribbon 時(shí),要密切關(guān)注其運(yùn)行狀態(tài),及時(shí)發(fā)現(xiàn)并解決潛在問題。同時(shí),根據(jù)實(shí)際需求調(diào)整 Ribbon 的配置,以確保負(fù)載均衡效果滿足預(yù)期。
到了這里,關(guān)于Spring Cloud 實(shí)戰(zhàn) | 解密負(fù)載均衡Ribbon底層原理,包含實(shí)戰(zhàn)源碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!