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

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

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

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

上述兩個不同的工程,因為具有相同的服務名 alibaba-server-hello,因此是屬于同一服務名下的不同實例。
除了應用名一樣外,被調(diào)用的服務名對應的各個工程實例的同一接口的訪問地址應該也要相同。
服務名在配置文件application.yml 以及Nacos配置文件中聲明。
application.yml

Nacos 配置文件

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

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

Nacos配置文件

因為 alibaba-server-helloworld 服務的每個實例只有端口號不同,所以在配置文件中不能設置端口號,否則每個實例的端口號將會相同,因而不能創(chuàng)建部署于不同端口的多實例。(配置文件的端口號設置優(yōu)先于在 VM Options 中通過 -Dserver.port = xxxx 設置端口號)
(2)打開Edit Configurations

(3)點擊“ + ”號,選擇Spring Boot,添加實例
(4)填寫實例名稱、實例的主類以及實例的端口號
主類選擇 alibaba-server-helloworld 服務的主類 WorldApplication;
在 VM options 中設置實例的端口號 -Dserver.port = 8005

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

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

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

(2)controller 中多次調(diào)用 alibaba-server-helloworld 服務
@RestController
@Slf4j
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/diaoyong")
public String msg(){
System.out.println("服務列表");
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 服務查看效果
可以發(fā)現(xiàn)兩個實例分別調(diào)用兩次,而且是輪流調(diào)用,也就是說 Ribbon 的默認負載均衡策略是輪循。


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