SpringCloud中的Ribbon負載均衡詳細解讀
負載均衡
當系統(tǒng)面臨大量的用戶訪問,負載過高的時候,通常會增加服務(wù)器數(shù)量來進行橫向擴展(集群),多個服務(wù)器的負載需要均衡,以免出現(xiàn)服務(wù)器負載不均衡,部分服務(wù)器負載較大,部分服務(wù)器負載較小的情況。通過負載均衡,使得集群中服務(wù)器的負載保持在穩(wěn)定高效的狀態(tài),從而提高整個系統(tǒng)的處理能力。
軟件負載均衡:nginx,lvs
硬件負載均衡:F5
第一層可以用DNS,配置多個A記錄,讓DNS做第一層分發(fā)。
第二層用比較流行的是反向代理,核心原理:代理根據(jù)一定規(guī)則,將http請求轉(zhuǎn)發(fā)到服務(wù)器集群的單一服務(wù)器上。
軟件負載均衡分為:服務(wù)端(集中式),客戶端。
服務(wù)端負載均衡:在客戶端和服務(wù)端中間使用代理,nginx。
客戶端負載均衡:根據(jù)自己的情況做負載。Ribbon就是。
客戶端負載均衡和服務(wù)端負載均衡最大的區(qū)別在于服務(wù)端地址列表的存儲位置,以及負載算法在哪里。
客戶端負載均衡
在客戶端負載均衡中,所有的客戶端節(jié)點都有一份自己要訪問的服務(wù)端地址列表,這些列表統(tǒng)統(tǒng)都是從服務(wù)注冊中心獲取的;
服務(wù)端負載均衡
在服務(wù)端負載均衡中,客戶端節(jié)點只知道單一服務(wù)代理的地址,服務(wù)代理則知道所有服務(wù)端的地址。
介紹:
Ribbon是Netflix開發(fā)的客戶端負載均衡器,為Ribbon配置服務(wù)提供者地址列表后,Ribbon就可以基于某種負載均衡策略算法,自動地幫助服務(wù)消費者去請求 提供者。Ribbon默認為我們提供了很多負載均衡算法,例如輪詢、隨機等。我們也可以實現(xiàn)自定義負載均衡算法。
Ribbon作為Spring Cloud的負載均衡機制的實現(xiàn),
- Ribbon可以單獨使用,作為一個獨立的負載均衡組件。只是需要我們手動配置 服務(wù)地址列表。
- Ribbon與Eureka配合使用時,Ribbon可自動從Eureka Server獲取服務(wù)提供者地址列表(DiscoveryClient),并基于負載均衡算法,請求其中一個服務(wù)提供者實例。
- Ribbon與OpenFeign和RestTemplate進行無縫對接,讓二者具有負載均衡的能力。OpenFeign默認集成了ribbon。
Ribbon組成
- ribbon-core: 核心的通用性代碼。api一些配置。
- ribbon-eureka:基于eureka封裝的模塊,能快速集成eureka。
- ribbon-examples:學習示例。
- ribbon-httpclient:基于apache httpClient封裝的rest客戶端,集成了負載均衡模塊,可以直接在項目中使用。
- ribbon-loadbalancer:負載均衡模塊。
- ribbon-transport:基于netty實現(xiàn)多協(xié)議的支持。比如http,tcp,udp等。
利用Eureka手寫負載均衡
代碼
@Autowired
DiscoveryClient discoveryClient;
AtomicInteger atomicInteger = new AtomicInteger();
@GetMapping("/client7")
public Object client7() {
List<ServiceInstance> instances = discoveryClient.getInstances("provider");
// 隨機
int nextInt = new Random().nextInt(instances.size());
// 自定義輪訓算法
int i = atomicInteger.getAndIncrement();
instances.get(i % instances.size());
// 權(quán)重。。
for (ServiceInstance serviceInstance : instances) {
// int quanzhong = serviceInstance.getMetadata(); // 權(quán)重 1-9
}
ServiceInstance instance = instances.get(nextInt);
// ribbon 完成客戶端的負載均衡,過濾掉down了的節(jié)點
// ServiceInstance instance = lb.choose("provider");
String url ="http://" + instance.getHost() +":"+ instance.getPort() + "/getHi";
String respStr = restTemplate.getForObject(url, String.class);
return respStr;
}
@LoadBalanced
實際使用方式
- 在eureka-client中使用Ribbon時, 不需要引入jar包,因為erueka-client已經(jīng)包括ribbon的jar包了。點進去看看。
- 用@LoadBalance修飾RestTemplate可以實現(xiàn)負載均衡。
- 由于RestTemplate的Bean實例化方法restTemplate被@LoadBalanced修飾,所以當調(diào)用restTemplate的postForObject方法發(fā)送HTTP請求時,會使用Ribbon進行負載均衡。
//使用ribbon,添加@LoadBalance,使RestTemplate具備負載均衡能力。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
//serviceName=虛擬主機名。默認情況下,虛擬主機名和服務(wù)名一致。
String url = "http://"+serviceName+"/send/alisms-template";
//調(diào)用
ResponseEntity<ResponseResult> resultEntity = restTemplate.postForEntity(url, smsSendRequest, ResponseResult.class);
//測試根據(jù)serviceName獲取服務(wù)提供者信息。此時不需要@LoadBalance,默認是輪訓。
@Autowired
private LoadBalancerClient loadBalancerClient;
// 不能將choseServiceName和 restTemplate寫在一起,因為后者中已經(jīng)有前者了。
@GetMapping("/choseServiceName")
public ResponseResult choseServiceName() {
String serviceName = "service-sms";
ServiceInstance si = loadBalancerClient.choose(serviceName);
System.out.println("sms節(jié)點信息:url:"+si.getHost()+",port:"+si.getPort());
return ResponseResult.success("");
}
切換負載均衡策略
注解方式
@Bean
public IRule myRule(){
//return new RoundRobinRule();
//return new RandomRule();
return new RetryRule();
配置文件
針對服務(wù)定ribbon策略:
provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
給所有服務(wù)定ribbon策略:
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
屬性配置方式優(yōu)先級高于Java代碼。
Ribbon脫離注冊中心
Ribbon可以和服務(wù)注冊中心Eureka一起工作,從服務(wù)注冊中心獲取服務(wù)端的地址信息,也可以在配置文件中使用listOfServers字段來設(shè)置服務(wù)端地址。
ribbon.eureka.enabled=false ribbon.listOfServers=localhost:80,localhost:81
到此這篇關(guān)于SpringCloud中的Ribbon負載均衡詳細解讀的文章就介紹到這了,更多相關(guān)SpringCloud的Ribbon負載均衡內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Alibaba?SpringCloud集成Nacos、openFeign實現(xiàn)負載均衡的解決方案
- SpringCloud使用Ribbon實現(xiàn)負載均衡的流程步驟
- Spring?cloud負載均衡@LoadBalanced?&?LoadBalancerClient
- SpringCloud集成Eureka并實現(xiàn)負載均衡的過程詳解
- 關(guān)于SpringCloud中Ribbon的7種負載均衡策略解析
- 詳解SpringCloud LoadBalancer 新一代負載均衡器
- Spring?Cloud?Alibaba負載均衡實現(xiàn)方式
- 深入分析Spring Cloud 負載均衡器架構(gòu)選型
相關(guān)文章
Springboot解決no main manifest attribute錯誤
在開發(fā)Springboot項目時,使用java -jar命令運行jar包可能出現(xiàn)no main manifest attribute錯誤,本文就來介紹一下該錯誤的解決方法,感興趣的可以了解一下2024-09-09
SpringBoot使用ApplicationEvent&Listener完成業(yè)務(wù)解耦
這篇文章主要介紹了SpringBoot使用ApplicationEvent&Listener完成業(yè)務(wù)解耦示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
SpringBoot+ThreadLocal+AbstractRoutingDataSource實現(xiàn)動態(tài)切換數(shù)據(jù)源
最近在做業(yè)務(wù)需求時,需要從不同的數(shù)據(jù)庫中獲取數(shù)據(jù)然后寫入到當前數(shù)據(jù)庫中,因此涉及到切換數(shù)據(jù)源問題,所以本文采用ThreadLocal+AbstractRoutingDataSource來模擬實現(xiàn)dynamic-datasource-spring-boot-starter中線程數(shù)據(jù)源切換,需要的朋友可以參考下2023-08-08
25行Java代碼將普通圖片轉(zhuǎn)換為字符畫圖片和文本的實現(xiàn)
這篇文章主要介紹了25行Java代碼將普通圖片轉(zhuǎn)換為字符畫圖片和文本的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04

