點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
概述
負(fù)載均衡是分布式架構(gòu)的重點(diǎn),負(fù)載均衡機(jī)制決定著整個(gè)服務(wù)集群的性能與穩(wěn)定。
負(fù)載均衡,英文名稱(chēng)為L(zhǎng)oad Balance,其含義就是指將負(fù)載(工作任務(wù))進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行運(yùn)行。
負(fù)載均衡解決的是將一個(gè)客戶(hù)端的流量以某種符合最大化資源利用率的方式均攤到服務(wù)端所提供的所有實(shí)例上的問(wèn)題。在這個(gè)問(wèn)題的場(chǎng)景中,后端服務(wù)的實(shí)例是通過(guò)水平擴(kuò)展的方式來(lái)提供高可用的。
負(fù)載均衡分類(lèi)
在微服務(wù)架構(gòu)中,負(fù)載均衡是必須使用的技術(shù),通過(guò)它來(lái)實(shí)現(xiàn)系統(tǒng)的高可用、集群擴(kuò)容等功能。負(fù)載均衡可以分為兩種:服務(wù)端負(fù)載均衡和客戶(hù)端負(fù)載均衡。
1、服務(wù)器負(fù)載均衡
通常所說(shuō)的負(fù)載均衡指服務(wù)器負(fù)載均衡,由服務(wù)端來(lái)決定調(diào)用哪個(gè)節(jié)點(diǎn),可通過(guò)硬件設(shè)備或軟件來(lái)實(shí)現(xiàn),硬件比如:F5、Array等,軟件比如:LVS、Nginx等,類(lèi)似的架構(gòu)圖如下:

原理:
通過(guò)硬件或軟件實(shí)現(xiàn)負(fù)載均衡均會(huì)維護(hù)一個(gè)服務(wù)端清單,利用心跳檢測(cè)等手段進(jìn)行清單維護(hù),保證清單中都是可以正常訪(fǎng)問(wèn)的服務(wù)節(jié)點(diǎn)。當(dāng)用戶(hù)發(fā)送請(qǐng)求時(shí),會(huì)先到達(dá)負(fù)載均衡器(也相當(dāng)于一個(gè)服務(wù)),負(fù)載均衡器根據(jù)負(fù)載均衡算法(輪訓(xùn)、隨機(jī)、加權(quán)輪訓(xùn))從可用的服務(wù)端列表中取出一臺(tái)服務(wù)端的地址,接著進(jìn)行轉(zhuǎn)發(fā),降低系統(tǒng)的壓力。
2、客戶(hù)端負(fù)載均衡
客戶(hù)端實(shí)際上是指服務(wù)調(diào)用者。在 SpringCloud 中調(diào)用者本身集成負(fù)載均衡,由調(diào)用者決定來(lái)調(diào)用哪個(gè)節(jié)點(diǎn)的服務(wù),這就是客戶(hù)端負(fù)載均衡。
SpringCloud Ribbon是基于客戶(hù)端的負(fù)載均衡工具,它可以將面向服務(wù)的 REST 模板請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶(hù)端負(fù)載均衡的服務(wù)調(diào)用。

原理:
Ribbon 維護(hù)了一個(gè)服務(wù)列表,如果服務(wù)實(shí)例注銷(xiāo)或死掉,Ribbon 能夠自行將其剔除。Ribbon 提供了客戶(hù)端負(fù)載均衡的功能,Ribbon 利用從注冊(cè)中心中讀取到的服務(wù)信息列表(存儲(chǔ)在本地即客戶(hù)端中),在調(diào)用某個(gè)服務(wù)時(shí),根據(jù)負(fù)載均衡算法直接請(qǐng)求到具體的微服務(wù)實(shí)例,常用的負(fù)載均衡算法有:輪循、隨機(jī)、加權(quán)輪循、加權(quán)隨機(jī)、地址哈希等方法。如下圖是Ribbon負(fù)載均衡的流程圖:

3、客戶(hù)端和服務(wù)端負(fù)載均衡的區(qū)別
兩者主要區(qū)分點(diǎn)在于服務(wù)清單的存放位置:在客戶(hù)端負(fù)載均衡中,客戶(hù)端會(huì)存儲(chǔ)一份服務(wù)端清單,它是通過(guò)從注冊(cè)中心進(jìn)行抓取得到的,同時(shí)也需要對(duì)此進(jìn)行維護(hù);而在服務(wù)端負(fù)載均衡中,服務(wù)端自己會(huì)維護(hù)一份服務(wù)端清單。
Ribbon 簡(jiǎn)介
Spring Cloud Ribbon是一個(gè)基于 HTTP 和 TCP 協(xié)議的客戶(hù)端負(fù)載均衡工具,它基于Netflix Ribbon實(shí)現(xiàn)。通過(guò) Spring Cloud 的封裝,可以讓我們輕松地將面向服務(wù)的 REST 模版請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶(hù)端負(fù)載均衡的服務(wù)調(diào)用。Spring Cloud Ribbon 雖然只是一個(gè)工具類(lèi)框架,它不像服務(wù)注冊(cè)中心、配置中心、API網(wǎng)關(guān)那樣需要獨(dú)立部署,但是它幾乎存在于每一個(gè)Spring Cloud構(gòu)建的微服務(wù)和基礎(chǔ)設(shè)施中。因?yàn)槲⒎?wù)間的調(diào)用,API網(wǎng)關(guān)的請(qǐng)求轉(zhuǎn)發(fā)等內(nèi)容,實(shí)際上都是通過(guò)Ribbon來(lái)實(shí)現(xiàn)的,包括Feign,它也是基于Ribbon實(shí)現(xiàn)的工具。所以,對(duì)Spring Cloud Ribbon的理解和使用,對(duì)于我們使用Spring Cloud來(lái)構(gòu)建微服務(wù)非常重要。
1、負(fù)載均衡的策略
2、負(fù)載均衡策略的設(shè)置
3、負(fù)載均衡的常用接口
Ribbon 負(fù)載均衡的類(lèi)型
在spring cloud微服務(wù)架構(gòu)中,基本上每個(gè)拆分的微服務(wù)都會(huì)部署多個(gè)運(yùn)行實(shí)例。每個(gè)服務(wù)多個(gè)實(shí)例,能夠提高吞吐量和可用性,使得流量均勻分布,防止單臺(tái)瓶頸,也避免單點(diǎn)故障。
Ribbon 維護(hù)了一個(gè)服務(wù)列表,服務(wù)列表以服務(wù)的應(yīng)用名為區(qū)分,當(dāng)調(diào)用某個(gè)服務(wù)名的服務(wù)時(shí),Ribbon
會(huì)根據(jù)負(fù)載均衡算法直接請(qǐng)求到該服務(wù)名下某個(gè)具體的微服務(wù)實(shí)例。
因此負(fù)載均衡適用的同一微服務(wù)名下的微服務(wù)實(shí)例有兩種類(lèi)型:
1、不同工程具有同一服務(wù)名

上述兩個(gè)不同的工程,因?yàn)榫哂邢嗤姆?wù)名 alibaba-server-hello,因此是屬于同一服務(wù)名下的不同實(shí)例。
除了應(yīng)用名一樣外,被調(diào)用的服務(wù)名對(duì)應(yīng)的各個(gè)工程實(shí)例的同一接口的訪(fǎng)問(wèn)地址應(yīng)該也要相同。
服務(wù)名在配置文件application.yml 以及Nacos配置文件中聲明。
application.yml

Nacos 配置文件

2、同一工程部署在不同端口上
將某個(gè)工程部署在不同端口上,這種情況下不同服務(wù)實(shí)例除了端口不同外其他的配置都相同,因此具有相同的服務(wù)名,屬于同一服務(wù)名下的不同實(shí)例。
同一工程部署不同實(shí)例的做法如下:

給 alibaba-server-helloworld 工程添加第2個(gè)實(shí)例的流程如下:
(1)alibaba-server-helloworld 服務(wù)的配置文件中不能設(shè)置端口號(hào)
application.yml 文件

Nacos配置文件

因?yàn)?alibaba-server-helloworld 服務(wù)的每個(gè)實(shí)例只有端口號(hào)不同,所以在配置文件中不能設(shè)置端口號(hào),否則每個(gè)實(shí)例的端口號(hào)將會(huì)相同,因而不能創(chuàng)建部署于不同端口的多實(shí)例。(配置文件的端口號(hào)設(shè)置優(yōu)先于在 VM Options 中通過(guò) -Dserver.port = xxxx 設(shè)置端口號(hào))
(2)打開(kāi)Edit Configurations

(3)點(diǎn)擊“ + ”號(hào),選擇Spring Boot,添加實(shí)例
(4)填寫(xiě)實(shí)例名稱(chēng)、實(shí)例的主類(lèi)以及實(shí)例的端口號(hào)
主類(lèi)選擇 alibaba-server-helloworld 服務(wù)的主類(lèi) WorldApplication;
在 VM options 中設(shè)置實(shí)例的端口號(hào) -Dserver.port = 8005

(5)點(diǎn)擊 Apply 后,新的實(shí)例即可創(chuàng)建完成
能夠看到 alibaba-server-helloworld 服務(wù)有兩個(gè)分別運(yùn)行在 8005 和 8006 端口的實(shí)例

(6)查看 Nacos 服務(wù)列表
能夠看到在服務(wù)列表中 alibaba-server-helloworld 服務(wù)有兩個(gè)實(shí)例

客戶(hù)端負(fù)載均衡Ribbon使用
1、RestTemplate + Ribbon (使用同一工程不同端口類(lèi)型)
(1)在 RestTemplate 配置類(lèi)里面在注入 RestTemplate 的方法上面添加注解 @LoadBalanced 即可實(shí)現(xiàn)負(fù)載均衡
@LoadBalanced 原理:
RestTemplate在發(fā)送請(qǐng)求的時(shí)候會(huì)被ClientHttpRequestInterceptor攔截,LoadBalancerInterceptor是ClientHttpRequestInterceptor的實(shí)現(xiàn)類(lèi),它的作用就是用于RestTemplate的負(fù)載均衡,LoadBalancerInterceptor將負(fù)載均衡的核心邏輯交給了loadBalancer。
@LoadBalanced注解是屬于Spring,而不是Ribbon的,Spring在初始化容器的時(shí)候,如果檢測(cè)到Bean被@LoadBalanced注解,Spring會(huì)為其設(shè)置LoadBalancerInterceptor的攔截器。
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced // 負(fù)載均衡注解
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
注:我們這里不需要添加Ribbon的依賴(lài),因?yàn)?nbsp;Nacos Client 包里面幫我們引入 Ribbon 相關(guān)的依賴(lài)。

(2)controller 中多次調(diào)用 alibaba-server-helloworld 服務(wù)
@RestController
@Slf4j
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/diaoyong")
public String msg(){
System.out.println("服務(wù)列表");
List<ServiceInstance> list=discoveryClient.getInstances("alibaba-server-helloworld");
System.out.println(list);
String response = restTemplate.getForObject("http://alibaba-server-helloworld/hello/lhj/hello", String.class);
return response;
}
}
(3)調(diào)用 4 次 alibaba-server-helloworld 服務(wù)查看效果
可以發(fā)現(xiàn)兩個(gè)實(shí)例分別調(diào)用兩次,而且是輪流調(diào)用,也就是說(shuō) Ribbon 的默認(rèn)負(fù)載均衡策略是輪循。


2、Feign(默認(rèn)繼承了Ribbon)
Feign 是一個(gè)聲明式的偽 Http 客戶(hù)端,它使得寫(xiě) Http 客戶(hù)端變得更簡(jiǎn)單。使用 Feign,只需要?jiǎng)?chuàng)建一個(gè)接口并注解。它具有可插拔的注解特性,可使用 Feign 注解和 JAX-RS 注解。Feign 支持可插拔的編碼器和解碼器。Feign 默認(rèn)集成了 Ribbon,默認(rèn)實(shí)現(xiàn)了負(fù)載均衡的效果。所以使用Feign無(wú)需任何操作就已經(jīng)附帶了Ribbon負(fù)載均衡。
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
本文鏈接:
https://blog.csdn.net/IT__learning/article/details/116540399
鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布
??????
感謝點(diǎn)贊支持下哈 