SpringCloud - 新版淘汰 Ribbon,在 OpenFeign 中整合 LoadBalancer 負載均衡

目錄

一、LoadBalancer 負載均衡

1.1、前言

1.2、LoadBalancer 負載均衡底層實現原理

二、整合 OpenFeign + LoadBalancer

2.1、所需依賴

2.2、具體實現

?2.3、自定義負載均衡策略


一、LoadBalancer 負載均衡


1.1、前言

在 2020 年以前的 SpringCloud 采用 Ribbon 作為負載均衡,但是 2020 年之后,SpringCloud 吧 Ribbon 移除了,而是使用自己編寫的 LoadBalancer 替代.

因此,如果在沒有加入 LoadBalancer 依賴的情況下,使用 RestTemplate 或?OpenFeign 遠程調用,就會報以下錯誤:

這就是在告訴你 LoadBalancing是未定義的(OpenFeign 中引入的依賴會使用 LoadBalancing),然后問你是不是忘記加入 spring-cloud-starter-loadbalancer 依賴.

1.2、LoadBalancer 負載均衡底層實現原理

a)在添加了 @LoadBalanced 注解之后,會啟用攔截器對我們發起的服務調用請求進行攔截(注意,這里是針對我們發起的請求進行攔截),叫做 LoadBalancerInterceptor,它實現了 ClientHttpRequestInterceptor 接口:

@FunctionalInterface
public interface ClientHttpRequestInterceptor {ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException;
}

?intercept 方法如下:

public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {URI originalUri = request.getURI();String serviceName = originalUri.getHost();Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));
}

主要就是這里的 intercept 方法攔截的請求.

b)這個攔截器具體做了什么事情呢,我們知道,被攔截的請求地址,并不是一個有效的主機地址,而是服務名稱,因此需要通過 服務注冊中心(Nacos)才能得到需要訪問的主機地址.

loadBalancer.execute() 就是在獲取請求對應的服務實例信息.

//從上面給進來了服務的名稱和具體的請求實體
public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {String hint = this.getHint(serviceId);LoadBalancerRequestAdapter<T, DefaultRequestContext> lbRequest = new LoadBalancerRequestAdapter(request, new DefaultRequestContext(request, hint));Set<LoadBalancerLifecycle> supportedLifecycleProcessors = this.getSupportedLifecycleProcessors(serviceId);supportedLifecycleProcessors.forEach((lifecycle) -> {lifecycle.onStart(lbRequest);});//可以看到在這里會調用choose方法自動獲取對應的服務實例信息ServiceInstance serviceInstance = this.choose(serviceId, lbRequest);if (serviceInstance == null) {supportedLifecycleProcessors.forEach((lifecycle) -> {lifecycle.onComplete(new CompletionContext(Status.DISCARD, lbRequest, new EmptyResponse()));});//沒有發現任何此服務的實例就拋異常(之前的測試中可能已經遇到了)throw new IllegalStateException("No instances available for " + serviceId);} else {//成功獲取到對應服務的實例,這時就可以發起HTTP請求獲取信息了return this.execute(serviceId, serviceInstance, lbRequest);}
}

?

c)因此,實際上,在進行負載均衡的時候,會向服務的注冊中心(Nacos)發起一個請求,選擇一個可用的服務(如果有多個),然后返回此服務的主機地址等信息.

二、整合 OpenFeign + LoadBalancer


2.1、所需依賴

在需要進行遠程調用的服務中引入openfeign 和 loadbalancer 依賴

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

2.2、具體實現

a)啟動類中添加 @EnableFeignClients 注解

@SpringBootApplication
@EnableFeignClients
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}}

b)例如,在 user 微服務中調用 article 微服務接口,那么就需要在 user 為服務中創建一個 article 的客戶端.

@FeignClient("article")
public interface ArticleClient {@GetMapping("/article/start")String userStart();}

服務提供者:

@RestController
@RequestMapping("/article")
public class ArticleController {@GetMapping("/start")public String userStart() {System.out.println("article 被遠程調用了!");return "article ok ~";}}

服務消費者:

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate ArticleClient articleClient;@GetMapping("/start")public String userStart() {String result = articleClient.userStart();return "user ok ~\n" + result;}}

c)訪問 user 服務接口,可以看到成功進行了遠程調用

d)連續訪問 10 次,可以發現,在 OpenFeign 的聲明式客戶端中,不用加 @LoadBalancer 注解也會實現默認的 “輪詢” 負載均衡策略(RestTemplate 方式必須加).

?

在?BlockingLoadBalancerClient 中添加斷點,就可以看到我們指定的策略默認是輪詢(RoundRobin):

?2.3、自定義負載均衡策略

LoadBalancer默認提供了兩種負載均衡策略:

  • RandomLoadBalancer - 隨機分配策略
  • (默認)?RoundRobinLoadBalancer - 輪詢分配策略

現在希望修改默認的負載均衡策略為隨機分配策略,就需要創建隨機分配策略的配置類(不用加 @Configuration):

//這里不用加 @Configuration 注解
public class LoadBalancerConfig {//將官方提供的 RandomLoadBalancer 注冊為Bean@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

通過 @LoadBalancerClient(value = "服務名", configuration = LoadBalancerConfig.class)? 指定負載均衡策略為隨機.

@FeignClient("article")
@LoadBalancerClient(value = "article", configuration = LoadBalancerConfig.class) //指定負載均衡策略為隨機
public interface ArticleClient {//    @LoadBalanced(可以寫,也可以不用寫,默認所有方法都自動加 @LoadBalanced)@GetMapping("/article/start")String userStart();}

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

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

相關文章

OOM問題排查+Jvm優化

OOM問題排查&#xff1a; 1、top命令&#xff1a;查看cpu和內存的使用情況。 2、jstat命令&#xff1a;查看YGC和FGC情況&#xff0c;一般都是老年代不夠用。導致OOM 3、jmap命令&#xff1a; 查看哪個類的實例過多,以每個類占用多少了內存。4、jstack 查看線程與線程之間的阻…

Linux用戶名用戶組命令

添加用戶(為sam用戶添加一個主目錄/home/sam) useradd -d /home/sam -m sam新建一個用戶gem,該用戶的登錄shell是/bin/sh,它屬于group用戶組&#xff0c;同時又屬于adm和root用戶組&#xff0c;其中group用戶組是其主組 添加用戶賬號就是在/etc/passwd文件中為新用戶添加一條記…

80基于matlab的小波包熵與模糊C均值聚類的故障診斷,以凱斯西儲大學軸承數據為例進行分析

基于matlab的小波包熵與模糊C均值聚類的故障診斷&#xff0c;以凱斯西儲大學軸承數據為例進行分析。對數據進行小波包分解后重構&#xff0c;然后提取各頻帶能量分布&#xff0c;后計算小波包熵進行故障診斷。輸出特征可視化結果。數據可更換自己的&#xff0c;程序已調通&…

Git遠程庫操作(GitHub)

GitHub 網址&#xff1a;https://github.com/ 創建遠程倉庫 遠程倉庫操作 命令名稱作用git remote -v查看當前所有遠程地址別名git remote add 別名 遠程地址起別名git push 別名 分支推送本地分支上的內容到遠程倉庫git clone 遠程地址將遠程倉庫的內容克隆到本地git pull 別…

文件格式校驗

json格式校驗 非嚴格模式 json.loads(data, strictFalse) 如果strict為false&#xff08;默認值為True&#xff09;&#xff0c;則字符串中允許使用控制字符。此上下文中的控制字符是那些字符代碼在0–31范圍內的字符&#xff0c;包括“\t”&#xff08;制表符&#xff09;、“…

基于STM32的色彩識別與分類算法優化

基于STM32的色彩識別與分類算法優化是一項與圖像處理和機器學習相關的研究任務&#xff0c;旨在實現高效的色彩識別和分類算法在STM32微控制器上的運行。本文將介紹基于STM32的色彩識別與分類算法優化的原理和實現步驟&#xff0c;并提供相應的代碼示例。 1. 色彩識別與分類概…

[SIGGRAPH-23] 3D Gaussian Splatting for Real-Time Radiance Field Rendering

pdf | proj | code 本文提出一種新的3D數據表達形式3D Gaussians。每個Gaussian由以下參數組成&#xff1a;中心點位置、協方差矩陣、可見性、顏色。通過世界坐標系到相機坐標系&#xff0c;再到圖像坐標系的仿射關系&#xff0c;可將3D Gaussian映射到相機坐標系&#xff0c;通…

.NET面試題2

1.請解釋一下C#中的委托&#xff08;Delegate&#xff09;。 委托是一種類型安全的函數指針&#xff0c;它可以將方法作為參數傳遞或存儲在變量中。通過委托&#xff0c;可以實現方法的回調、事件處理等功能。委托在C#中使用delegate關鍵字進行聲明&#xff0c;可以根據方法簽名…

c語言:用迭代法解決遞歸問題

題目&#xff1a; 解釋&#xff1a;題目的意思就是用迭代法的空間和時間復雜的太高了&#xff0c;需要我們減小空間與時間的復雜度&#xff0c;我就想到了迭代法&#xff0c;思路和代碼如下&#xff1a; #include <stdio.h> //這里是遞歸法轉迭代法 int main() {int x,i…

Rust語言特性探秘:宏的魔力

大家好&#xff01;我是lincyang。 今天我們繼續深入探討Rust語言中的一個有趣而強大的特性——宏&#xff08;Macros&#xff09;。 宏在Rust中扮演著特殊的角色&#xff0c;不僅提高了代碼的靈活性&#xff0c;還增強了代碼的可重用性。接下來&#xff0c;我們會通過具體的…

[ 云計算 | AWS 實踐 ] 基于 Amazon S3 協議搭建個人云存儲服務

本文收錄于【#云計算入門與實踐 - AWS】專欄中&#xff0c;收錄 AWS 入門與實踐相關博文。 本文同步于個人公眾號&#xff1a;【云計算洞察】 更多關于云計算技術內容敬請關注&#xff1a;CSDN【#云計算入門與實踐 - AWS】專欄。 本系列已更新博文&#xff1a; [ 云計算 | …

Redis-Redis緩存高可用集群

1、Redis集群方案比較 哨兵模式 在redis3.0以前的版本要實現集群一般是借助哨兵sentinel工具來監控master節點的狀態&#xff0c;如果master節點異常&#xff0c;則會做主從切換&#xff0c;將某一臺slave作為master&#xff0c;哨兵的配置略微復雜&#xff0c;并且性能和高可…

深信服技術認證“SCSA-S”劃重點:信息收集

為幫助大家更加系統化地學習網絡安全知識&#xff0c;以及更高效地通過深信服安全服務認證工程師考核&#xff0c;深信服特別推出“SCSA-S認證備考秘笈”共十期內容&#xff0c;“考試重點”內容框架&#xff0c;幫助大家快速get重點知識~ 劃重點來啦 深信服安全服務認證工程師…

前端相關免查整合-vue、es、工具類等

知識 工具篇 網頁 取色器 F12 之后&#xff0c; style里面選一個顏色&#xff0c;然后點擊鉛筆&#xff0c;復制值 dayjs 用法 const date dayjs(2021-09-01); const formattedDate dayjs(2021-09-01).format(YYYY-MM-DD); console.log(formattedDate); // 輸出&#…

SEO從業人員提問常用的ChatGPT通用提示詞模板

如何提高網站在搜索引擎中的排名&#xff1f; 如何評估網站的SEO效果和優化潛力&#xff1f; 如何運用關鍵詞研究和競爭對手分析來制定SEO策略&#xff1f; 如何優化網站的內容、結構和元數據來提高SEO效果&#xff1f; 如何運用外部和內部鏈接來提高網站的權威性和排名&am…

OpenCvSharp從入門到實踐-(02)圖像處理的基本操作

目錄 圖像處理的基礎操作 1、讀取圖像 1.1、讀取當前目錄下的圖像 2、顯示圖像 2.1、Cv2.ImShow 用于顯示圖像。 2.2、Cv2.WaitKey方法用于等待用戶按下鍵盤上按鍵的時間。 2.3、Cv2.DestroyAllWindows方法用于銷毀所有正在顯示圖像的窗口。 2.4實例1-顯示圖像 2.4實例…

分類預測 | Matlab實現KPCA-IDBO-LSSVM基于核主成分分析-改進蜣螂算法優化最小二乘支持向量機的分類預測

分類預測 | Matlab實現KPCA-IDBO-LSSVM基于核主成分分析-改進蜣螂算法優化最小二乘支持向量機的分類預測 目錄 分類預測 | Matlab實現KPCA-IDBO-LSSVM基于核主成分分析-改進蜣螂算法優化最小二乘支持向量機的分類預測分類效果基本描述程序設計參考資料 分類效果 基本描述 1.多特…

校園圈子論壇,交友,帖子內短視頻,二手市場,APP小程序H5三端交付,源碼交付,支持二開

校園圈子論壇&#xff0c;交友頻道&#xff0c;商城&#xff0c;二手市場&#xff0c;活動專區&#xff0c;短視頻&#xff0c;從校園生活的方方面面展現出了充滿活力和創造力的鏡頭。這個頻道是一個讓學生們相互交流、結識新朋友的平臺&#xff0c;不僅有交友功能&#xff0c;…

【done+重點】劍指Offer56-I:找出數組中2個只出現1次的整數

力扣&#xff0c;https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/description/ 題目&#xff1a;一個整型數組nums里除兩個數字之外&#xff0c;其他數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。要求時間復雜度是O(n)&#xff0c;空間…

啟動Dubbo項目注冊Zookeeper時提示zookeeper not connected異常原理解析

原創/朱季謙 遇到一個很詭異的問題&#xff0c;我在啟動多個配置相同zookeeper的Dubbo項目時&#xff0c;其他項目都是正常啟動&#xff0c;唯獨有一個項目在啟動過程中&#xff0c;Dubbo注冊zookeeper協議時&#xff0c;竟然出現了這樣的異常提示—— Caused by: java.lang.…