5.LoadBalancer負載均衡服務調用

目錄

一、Ribbon目前也進入維護模式

二、spring-cloud-loadbalancer概述

三、spring-cloud-loadbalancer負載均衡解析

1.負載均衡演示案例-理論

2.負載均衡演示案例-實操

按照8001拷貝后新建8002微服務

啟動Consul,將8001/8002啟動后注冊進微服務

Consul數據持久化配置并且注冊為Windows服務

方式一:編寫腳本的方式

方式二:通過-data-dir進行設置consul持久化目錄

消費者-訂單80模塊修改POM并注冊進consul,新增LoadBalancer組件

訂單80模塊修改Controler并啟動80

目前consul上的服務 將order也進行注冊

測試

3.負載均衡演示案例-小總結?

編碼使用DiscoveryClient動態獲取所有上線的服務列表

代碼解釋,修改80微服務的Controller

結合前面實操,負載選擇原理小總結

4.負載均衡算法原理

官網算法

默認算法

算法切換

測試


一、Ribbon目前也進入維護模式

Ribbon簡介
Spring Cloud Ribbon是基于Netflix Ribbon實現的一套 客戶端 負載均衡的工具。
簡單的說,Ribbon是Netflix發布的開源項目,主要功能是 提供客戶端的軟件負載均衡算法和服務調用。Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出Load Balancer(簡稱LB)后面所有的機器,Ribbon會自動的幫助你基于某種規則(如簡單輪詢,隨機連接等)去連接這些機器。我們很容易使用Ribbon實現自定義的負載均衡算法。
官網Ribbon維護模式信息
項目狀態:維護中...
spring官網推薦Rabbon平替組件loadbalancer

二、spring-cloud-loadbalancer概述

官網: Spring Cloud Commons
官網學習地址: Cloud Native Applications
github地址: GitHub - spring-guides/gs-spring-cloud-loadbalancer: Client-Side Load-Balancing with Spring Cloud LoadBalancer :: Dynamically select correct instance for the request :: spring-cloud,spring-cloud-loadbalancer,spring-cloud-commons
loadbalancer目前在springcloudcommons下
LB負載均衡(Load Balance)是什么
簡單的說就是將用戶的請求平攤的分配到多個服務上,從而達到系統的HA(高可用),常見的負載均衡有軟件Nginx,LVS,硬件 F5等
spring-cloud-starter-loadbalancer組件是什么
Spring Cloud LoadBalancer是由SpringCloud官方提供的一個開源的、簡單易用的 客戶端負載均衡器,它包含在SpringCloud-commons中用它來替換了以前的Ribbon組件。相比較于Ribbon,SpringCloud LoadBalancer不僅能夠支持RestTemplate,還支持WebClient(WeClient是Spring Web Flux中提供的功能,可以實現響應式異步請求)
loadbalancer本地負載均衡客戶端 VS Nginx服務端負載均衡區別?
Nginx是 服務器負載均衡,客戶端所有請求都會交給nginx,然后由nginx實現轉發請求,即負載均衡是由服務端實現的。?
loadbalancer 本地負載均衡,在調用微服務接口時候,會在注冊中心上獲取注冊信息服務列表之后緩存到JVM本地,從而在本地實現RPC遠程服務調用技術。

三、spring-cloud-loadbalancer負載均衡解析

1.負載均衡演示案例-理論

架構說明:80通過輪詢負載訪問8001/8002/8003
LoadBalancer 在工作時分成兩步:
第一步,先選擇ConsulServer從服務端查詢并拉取服務列表,知道了它有多個服務(上圖3個服務),這3個實現是完全一樣的,
默認輪詢調用誰都可以正常執行。類似生活中求醫掛號,某個科室今日出診的全部醫生,客戶端你自己選一個。
第二步,按照指定的負載均衡策略從server取到的服務注冊列表中由客戶端自己選擇一個地址,所以LoadBalancer是一個 客戶端的 負載均衡器

2.負載均衡演示案例-實操

官網參考地址: Cloud Native Applications
按照8001拷貝后新建8002微服務
啟動Consul,將8001/8002啟動后注冊進微服務
看到兩個service已注冊成功, 但是consul的key/value之前配置未進行持久化保存,已經不存在
Consul數據持久化配置并且注冊為Windows服務
方式一:編寫腳本的方式
1.D:\devSoftlconsul 1.17.0 windows 386日錄下
  • 新建mydata文件夾
  • 新建文件consul start.bat后綴為.bat
2.consul start.bat內容信息
@echo.服務啟動......  
@echo off  
@sc create Consul binpath= "D:\devSoft\consul_1.17.0_windows_386\consul.exe agent -server -ui -bind=127.0.0.1 -client=0.0.0.0 -bootstrap-expect  1  -data-dir D:\devSoft\consul_1.17.0_windows_386\mydata   "
@net start Consul
@sc config Consul start= AUTO  
@echo.Consul start is OK......success
@pause
3.右鍵管理員權限打開
4.啟動結果
5. win后臺
6.后續consul的配置數據會保存進mydata文件夾,關機重啟數據也是存在的
或者也可以啟動的時候設置consul持久化目錄
方式二:通過-data-dir進行設置consul持久化目錄
consul agent -server -config-dir=E:/consul/config -data-dir=E:/consul/data -bind=127.0.0.1 -bootstrap-expect=1 -ui
解釋:
-consul agent:啟動Consul的代理(agent)進程。Consul代理是Consul服務的核心組件,負責服務注冊與發現、健康檢查、鍵值存儲等功能。
-server:指定此Consul代理以服務器模式運行。在服務器模式下,該代理將參與Raft一致性協議,能夠處理集群的選舉、日志復制等任務,是Consul集群中不可或缺的一部分。
-config-dir=E:/consul/config:指定一個目錄,Consul會從該目錄中加載額外的配置文件。這些配置文件可以是JSON或HCL格式,用于自定義Consul的行為,如服務定義、ACL策略等。
-data-dir=E:/consul/data:指定一個目錄,Consul將在此目錄中存儲其運行所需的數據,包括服務注冊信息、健康檢查的狀態、鍵值存儲的數據以及Raft日志和快照等。這個目錄對于Consul的數據持久化至關重要。
-bind=127.0.0.1:指定Consul代理綁定的IP地址。在這個例子中,Consul被配置為僅監聽本地回環地址(127.0.0.1),這意味著它不會接受來自外部網絡的連接請求,增強了安全性。這通常用于開發或測試環境。
-bootstrap-expect=1:這是一個引導模式配置,指定了Consul期望在集群中看到的服務器節點數。在這個例子中,-bootstrap-expect=1 表示這是一個單節點集群的配置。由于集群中只有一個節點,Consul將立即進入領導者模式,無需等待其他節點的加入。
-ui:啟用Consul的內置Web UI。通過Web UI,用戶可以方便地查看和管理Consul集群的狀態,包括服務列表、健康檢查、鍵值對等。
后臺自啟動Consul測試地址: http://localhost:8500
  • cloud-payment-service-8001:http://localhost:8001/pay/get/info
  • cloud-payment-service-8002:http://localhost:8002/pay/get/info
消費者-訂單80模塊修改POM并注冊進consul,新增LoadBalancer組件
<!--loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
訂單80模塊修改Controler并啟動80
cloud-payment-service 要與consul上注冊名稱一致。
@RestController
public class OrderController
{//public static final String PaymentSrv_URL = "http://localhost:8001";//先寫死,硬編碼public static final String PaymentSrv_URL = "http://cloud-payment-service";//服務注冊中心上的微服務名稱@Autowiredprivate RestTemplate restTemplate;/*** 一般情況下,通過瀏覽器的地址欄輸入url,發送的只能是get請求* 我們模擬消費者發送get請求,but底層調用post方法,客戶端消費者參數PayDTO可以不添加@RequestBody* @param payDTO* @return*/@GetMapping("/consumer/pay/add")public ResultData addOrder(PayDTO payDTO){return restTemplate.postForObject(PaymentSrv_URL + "/pay/add",payDTO,ResultData.class);}@GetMapping("/consumer/pay/get/{id}")public ResultData getPayInfo(@PathVariable Integer id){return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/"+id, ResultData.class, id);}@GetMapping(value = "/consumer/pay/get/info")private String getInfoByConsul(){return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/info", String.class);}
}
目前consul上的服務 將order也進行注冊
測試
測試地址: http://localhost/consumer/pay/get/info
通過該地址交替訪問到8001、8002端口

3.負載均衡演示案例-小總結?

編碼使用DiscoveryClient動態獲取所有上線的服務列表
官網地址: Service Discovery with Consul :: Spring Cloud Consul
代碼解釋,修改80微服務的Controller
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/consumer/discovery")
public String discovery()
{List<String> services = discoveryClient.getServices();for (String element : services) {System.out.println(element);}System.out.println("===================================");List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");for (ServiceInstance element : instances) {System.out.println(element.getServiceId()+"\t"+element.getHost()+"\t"+element.getPort()+"\t"+element.getUri());}return instances.get(0).getServiceId()+":"+instances.get(0).getPort();
}

DiscoveryClient獲取所有上線的服務列表數據:

cloud-consumer-order

cloud-payment-service

consul

cloud-payment-service? ? WIN-C38UV4TIS4J 8001? ? ?http://WIN-C38UV4TIS4J:8001

cloud-payment-service? ? WIN-C38UV4TIS4J 8002 ? ? http://WIN-C38UV4TIS4J:8002

結合前面實操,負載選擇原理小總結
負載均衡算法:rest接口第幾次請求數 % 服務器集群總數量 = 實際調用服務器位置下標 ,每次服務重啟動后rest接口計數從1開始。
List instances = discoveryClient.getInstances("cloud-payment-service");
如: List [0] instances = 127.0.0.1:8002
List [1] instances = 127.0.0.1:8001
8001+ 8002 組合成為集群,它們共計2臺機器,集群總數為2, 按照輪詢算法原理:
當總請求數為1時: 1 % 2 =1 對應下標位置為1 ,則獲得服務地址為127.0.0.1:8001
當總請求數位2時: 2 % 2 =0 對應下標位置為0 ,則獲得服務地址為127.0.0.1:8002
當總請求數位3時: 3 % 2 =1 對應下標位置為1 ,則獲得服務地址為127.0.0.1:8001
當總請求數位4時: 4 % 2 =0 對應下標位置為0 ,則獲得服務地址為127.0.0.1:8002
如此類推......

4.負載均衡算法原理

官網算法
官網負載均衡算法地址: Cloud Native Applications
默認算法
默認兩種算法輪詢和隨機
輪詢源碼實現類
public class RoundRobinLoadBalancer implementsReactorServiceInstanceLoadBalancer
隨機源碼實現類
public class RandomLoadBalancer implements
ReactorServiceInstanceLoadBalancer
@LoadBalancerClient 解釋
自定義客戶端每個服務的負載均衡配置,且服務期間相互隔離。
主要用于配置和定制特定的客戶端負載均衡器行為。
@LoadBalancerClient 可以用來為特定的微服務配置負載均衡器的相關設置。通過指定name或value屬性(兩者通常可以互換使用),你可以指定一個服務的ID,該ID與Spring Cloud consul(或其他服務注冊中心)中注冊的服務名相對應。這樣,你就 可以為特定的服務定制負載均衡策略、重試機制等。
在微服務架構中,不同的服務可能需要不同的負載均衡配置。@LoadBalancerClient 允許你通過為不同的服務定義不同的配置類來實現 配置的隔離。這樣, 每個服務都可以根據自身的需求來定制負載均衡行為,而不會影響到其他服務。
還允許你通過configuration屬性來指定一個配置類,該配置類中可以定義 自定義的負載均衡器、規則、攔截器等。
算法切換
從默認的輪詢,切換為 隨機算法,修改RestTemplateConfig
/*** LoadBalancer默認輪詢算法切換隨機算法* @LoadBalancerClient   @Bean*/
@Configuration
@LoadBalancerClient(//下面的value值大小寫一定要和consul里面的名字一樣,必須一樣value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig
{@Bean@LoadBalanced //使用@LoadBalanced注解賦予RestTemplate負載均衡的能力public RestTemplate restTemplate(){return new RestTemplate();}@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
自定義算法
@LoadBalancerClient(name = "my-service", configuration = MyServiceLoadBalancerConfig.class)  
public class MyServiceConfiguration {  // 這里可以包含一些針對my-service的特定配置  
}  @Configuration  
public class MyServiceLoadBalancerConfig {  @Bean  public IRule myCustomRule() {  // 返回一個自定義的負載均衡規則  return new MyCustomRule();  }  
}
測試
測試地址: http://localhost/consumer/pay/get/info
實現效果:隨機訪問cloud-payment-service服務

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81710.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux安裝ffmpeg7.0.2全過程

?編輯 白眉大叔 發布于 2025年4月16日 評論關閉 閱讀(341) centos 編譯安裝 ffmpeg 7.0.2 &#xff1a;連接https://www.baimeidashu.com/19668.html 下載 FFmpeg 源代碼 在文章最后 一、在CentOS上編譯安裝FFmpeg 以常見的CentOS為例&#xff0c;FFmpeg的編譯說明頁面為h…

視頻逐幀提取圖片的工具

軟件功能&#xff1a;可以將視頻逐幀提取圖片&#xff0c;可以設置每秒提取多少幀&#xff0c;選擇提取圖片質量測試環境&#xff1a;Windows 10軟件設置&#xff1a;由于軟件需要通過FFmpeg提取圖片&#xff0c;運行軟件前請先設置FFmpeg&#xff0c;具體步驟 1. 請將…

java精簡復習

MyBatis批量插入 <insert id"batchInsert" parameterType"java.util.List">INSERT INTO users(name, age) VALUES<foreach collection"list" item"item" separator",">(#{item.name}, #{item.age})</foreac…

IP 網段

以下是關于 IP 網段 的詳細解析&#xff0c;涵蓋基本概念、表示方法、劃分規則及實際應用場景&#xff1a; 一、網段核心概念 1. 什么是網段&#xff1f; 網段指一個邏輯劃分的 IP 地址范圍&#xff0c;屬于同一子網的設備可以直接通信&#xff08;無需經過路由器&#xff09…

模型微調參數入門:核心概念與全局視角

一、引言 在深度學習領域&#xff0c;模型微調已成為優化模型性能、適配特定任務的重要手段。無論是圖像識別、自然語言處理&#xff0c;還是其他復雜的機器學習任務&#xff0c;合理調整模型參數都是實現卓越性能的關鍵。然而&#xff0c;模型微調涉及眾多參數&#xff0c;這…

端口映射不通的原因有哪些?路由器設置后公網訪問本地內網失敗分析

本地網絡地址通過端口映射出去到公網使用&#xff0c;是較為常用的一種傳統方案。然而&#xff0c;很多環境下和很多普通人員在實際使用中&#xff0c;卻往往會遇到端口映射不通的問題。端口映射不通的主要原因包括公網IP缺失&#xff08;更換nat123類似映射工具方案&#xff0…

Git Push 失敗:HTTP 413 Request Entity Too Large

Git Push 失敗&#xff1a;HTTP 413 Request Entity Too Large 問題排查 在使用 Git 推送包含較大編譯產物的項目時&#xff0c;你是否遇到過 HTTP 413 Request Entity Too Large 錯誤&#xff1f;這通常并不是 Git 的問題&#xff0c;而是 Web 服務器&#xff08;如 Nginx&am…

docker-記錄一次容器日志<container_id>-json.log超大問題的處理

文章目錄 現象一、查找源頭二、分析總結 現象 同事聯系說部署在虛擬機里面的用docker啟動xxl-job的服務不好使了&#xff0c;需要解決一下&#xff0c;我就登陸虛擬機檢查&#xff0c;發現根目錄滿了&#xff0c;就一層一層的找&#xff0c;發現是<container_id>-json.l…

Ubuntu 24.04 LTS 和 ROS 2 Jazzy 環境中使用 Livox MID360 雷達

本文介紹如何在 Ubuntu 24.04 LTS 和 ROS 2 Jazzy 環境中安裝和配置 Livox MID360 激光雷達&#xff0c;包括 Livox-SDK2 和 livox_ros_driver2 的安裝&#xff0c;以及在 RViz2 中可視化點云數據的過程。同時&#xff0c;我們也補充說明了如何正確配置 IP 地址以確保雷達與主機…

電腦開機后長時間黑屏,桌面圖標和任務欄很久才會出現,但是可通過任務管理器打開應用程序,如何解決

目錄 一、造成這種情況的主要原因&#xff08;詳細分析&#xff09;&#xff1a; &#xff08;1&#xff09;啟動項過多&#xff0c;導致系統資源占用過高&#xff08;最常見&#xff09; 檢測方法&#xff1a; &#xff08;2&#xff09;系統服務啟動異常&#xff08;常見&a…

uniapp地圖map支付寶小程序汽泡顯示

先看原文地址&#xff1a;map | uni-app官網 氣泡的顯示&#xff0c;可以使用callout和label兩個屬性 但是如果想要氣泡默認顯示&#xff0c;而不是點擊顯示&#xff0c;則用label

信創 CDC 實戰 | OGG、Attunity……之后,信創數據庫實時同步鏈路如何構建?(以 GaussDB 數據入倉為例)

國產數據庫加速進入核心系統&#xff0c;傳統同步工具卻頻頻“掉鏈子”。本系列文章聚焦 OceanBase、GaussDB、TDSQL、達夢等主流信創數據庫&#xff0c;逐一拆解其日志機制與同步難點&#xff0c;結合 TapData 的實踐經驗&#xff0c;系統講解從 CDC 捕獲到實時入倉&#xff0…

Python爬蟲實戰:研究Selenium框架相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網的快速發展,網頁數據量呈爆炸式增長。從網頁中提取有價值的信息成為數據挖掘、輿情分析、商業智能等領域的重要基礎工作。然而,現代網頁技術不斷演進,越來越多的網頁采用 JavaScript 動態加載內容,傳統的基于 HTTP 請求的爬蟲技術難…

【CSS border-image】圖片邊框拉伸不變形,css邊框屬性,用圖片打造個性化邊框

當用圖片做邊框時&#xff0c;還要考慮到一個問題&#xff0c;如何適應邊框的寬高變化&#xff0c;并且圖片不變形&#xff1f;本文深入解析 CSS border-image&#xff0c;用圖片打造個性化邊框。下圖的效果就是利用border-image屬性實現的圖片邊框自適應。 本文將border-imag…

14. LayUI與Bootstrap框架使用

引言 在前端開發中,UI框架可以大大提高開發效率。今天我將對比學習兩個流行的前端UI框架:LayUI和Bootstrap。這兩個框架各有特點,分別適用于不同的場景。 1. 框架概述 LayUI LayUI是一款國產的前端UI框架,由賢心開發,特點是輕量、簡單、易用。它采用了經典的模塊化方式…

購物車系統的模塊化設計:從加載到結算的全流程拆解

購物車系統的模塊化設計:從加載到結算的全流程拆解? 一、購物車信息分頁加載模塊:大數據量下的流暢體驗二、商品信息展示三、購物車管理模塊:操作邏輯的閉環設計四、商品金額計算模塊:實時同步的動態數據中心在電商應用中,購物車頁面是用戶操作最頻繁的核心場景之一。合理…

Veeam Backup Replication Console 13 beta 備份 PVE

前言 通過Veeam Backup & Replication控制臺配置與Proxmox VE&#xff08;PVE&#xff09;服務器的連接&#xff0c;包括主機地址、用戶名密碼和SSH信任設置。隨后詳細說明了部署備份Worker虛擬機的步驟&#xff0c;涵蓋網絡配置和VM創建。接著指導用戶創建PVE虛擬機備份任…

C++ 寫單例的辦法

先在頭文件聲明&#xff1a; 聲明一個COemInstancer的 _this指針&#xff1a; static COemInstance* _this; .然后在文件外層這樣寫&#xff1a; #define CXXModule COemInstance::instance() #define ExecuteCommand(ClassName,RunCommand) class Tempclass##ClassName\ …

ETL工具:Kettle,DataX,Flume,(Kafka)對比辨析

1. 各自特點 Kettle&#xff1a; 側重數據處理與轉換&#xff1a;具備強大的數據轉換和處理能力&#xff0c;能對數據進行清洗&#xff08;如去除重復值、處理缺失值 &#xff09;、轉換&#xff08;如數據類型轉換、計算派生字段 &#xff09;、過濾等操作。例如&#xff0c…

28、請求處理-【源碼分析】-請求映射原理

28、請求處理-【源碼分析】-請求映射原理 Spring Boot 的請求映射原理主要基于 Spring MVC 框架&#xff0c;通過 DispatcherServlet 前端控制器實現。以下是詳細的請求映射過程&#xff1a; ### 1. 請求進入 DispatcherServlet 當客戶端發送請求時&#xff0c;首先由 Dispatch…