Spring Cloud LoadBalancer 最佳實踐

Ribbon 曾經是 Spring Cloud 家族默認的客戶端負載均衡工具,而 Spring Cloud LoadBalancer (SCLB) 是官方替換 Ribbon 的新實現。表面上它們都解決 “服務調用時選哪個實例” 的問題,但在理念、架構和生態上差異不小。


一、Ribbon? vs? SCLB


1. 定位和生態地位

  • Ribbon

    • Netflix OSS 出品,老一代的客戶端負載均衡器。

    • 在 Spring Cloud Dalston ~ Greenwich 時代是默認選擇。

    • 后來 Netflix OSS 宣布 進入維護模式(2018年起不再活躍發展)

  • Spring Cloud LoadBalancer

    • Spring 團隊自研,替代 Ribbon。

    • 完全獨立于 Netflix 生態,不再依賴過時組件。

    • 與 Spring Boot 2.x/3.x、Reactor、WebClient、Feign 等深度集成。


2. 核心設計思路

  • Ribbon

    • 侵入性較強:依賴 IClientConfigIRuleIPing 等接口,配置體系復雜。

    • 強調“策略類 + 配置類”模式(比如 RoundRobinRule、ZoneAvoidanceRule)。

    • 同步調用模型為主,雖然可擴展但偏“重量級”。

    • RestTemplate 深度耦合(通過 @LoadBalanced RestTemplate)。

  • Spring Cloud LoadBalancer

    • 函數式 + 輕量化:核心是 ServiceInstanceListSupplier(負責提供實例列表)和 ReactorServiceInstanceLoadBalancer(負責挑選實例)。

    • 完全 Reactor 化,支持響應式編程(Reactor/Flux/Mono),天然適配 WebClient。

    • API 更簡單,默認策略是 RoundRobin,但很容易定制。

    • 更解耦,和 DiscoveryClient、Feign、gRPC 等可自由組合。


3. 擴展能力

  • Ribbon

    • 有比較多的現成策略:RoundRobinRuleRandomRuleRetryRuleWeightedResponseTimeRule

    • 自定義需要繼承 IRule,配置也要繞 Ribbon 的專用配置體系。

    • 支持 Zone 概念(跨機房/多可用區),適合 Netflix 內部環境,但在普通企業里很少用上。

  • Spring Cloud LoadBalancer

    • 策略很“干凈”:只要實現 ReactorServiceInstanceLoadBalancer 接口即可。

    • ServiceInstanceListSupplier 提供了天然的 hook:你可以在實例列表進入負載均衡前加上 過濾、排序、權重

    • 沒有 Ribbon 那種內置十幾個策略的復雜度,但用組合的方式,靈活度更高。


4. 與 Spring 生態的關系

  • Ribbon

    • 被強綁定到 RestTemplate + Feign(老版本)。

    • Spring Cloud Netflix 維護成本高,升級阻力大。

  • Spring Cloud LoadBalancer

    • 未來路線核心組件,和 Spring Cloud Gateway、Feign 3.x、WebClient 全兼容。

    • 官方推薦替代方案,Ribbon 已經標記 Deprecated

    • 隨 Spring Boot/Spring Cloud 版本更新,能持續獲得支持。


5. 性能與現代化

  • Ribbon

    • 基于老舊同步模型(雖然功能全,但顯得笨重)。

    • 沒有天然的 Reactor 支持,在響應式場景里不合拍。

  • Spring Cloud LoadBalancer

    • 基于 Reactor,輕量、非阻塞,天然適合高并發場景。

    • 使用 Flux<ServiceInstance>,可以靈活疊加緩存、權重、健康檢查邏輯。

    • 更加云原生,能和 Kubernetes Service、Consul、Nacos 等平滑對接。


二、源碼說明

1.?核心抽象

  • Ribbon

    • 結果:實例獲取、緩存、負載均衡策略,全都綁死在 Ribbon 的體系

    • 負載均衡器接口:ILoadBalancer
      內部維護實例列表(ServerList),并交給 IRule 挑選。

    • 負載均衡策略接口:IRule

      public interface IRule {Server choose(Object key);void setLoadBalancer(ILoadBalancer lb);ILoadBalancer getLoadBalancer();
      }

      代表“從一堆服務實例里挑一個”。

    • Spring Cloud LoadBalancer (SCLB)

      • 實例供應接口:

        public interface ServiceInstanceListSupplier extends Supplier<Flux<List<ServiceInstance>>> {String getServiceId();
        }

        負責“提供候選實例列表”,來源可以是 DiscoveryClient、緩存、靜態配置。

      • 策略接口:

        public interface ReactorServiceInstanceLoadBalancer {Mono<Response<ServiceInstance>> choose(Request request);
        }

        專注于“如何從候選列表里挑一個”。

      • 結果:候選列表與選擇邏輯完全解耦,職責單一,而且基于 Reactor(非阻塞)。


2. Spring Cloud LoadBalancer 和 Feign 相對 Ribbon 的解耦性

看源碼上的調用鏈對比最明顯:

  • Ribbon + Feign
    Feign 的 LoadBalancerFeignClient → 直接調用 RibbonLoadBalancerClient → 使用 ILoadBalancer + IRule 綁定。

    public class RibbonLoadBalancerClient implements LoadBalancerClient {@Overridepublic ServiceInstance choose(String serviceId) {ILoadBalancer loadBalancer = getLoadBalancer(serviceId);Server server = loadBalancer.chooseServer(null);return new RibbonServer(serviceId, server, isSecure(server), serverIntrospector(serviceId).getMetadata(server));}
    }

    可以看到:Feign 和 Ribbon 耦合緊密ILoadBalancerIRule 必須都存在。

  • SCLB + Feign(Spring Cloud 2020+)
    Feign 的 LoadBalancerFeignClient → 使用 BlockingLoadBalancerClientReactorLoadBalancerExchangeFilterFunction

    public class BlockingLoadBalancerClient implements LoadBalancerClient {private final LoadBalancerClientFactory clientFactory;@Overridepublic ServiceInstance choose(String serviceId) {ReactorServiceInstanceLoadBalancer loadBalancer = clientFactory.getInstance(serviceId, ReactorServiceInstanceLoadBalancer.class);// 核心是調用 loadBalancer.choose()}
    }

    這里的關鍵:

    • Feign 只依賴于 ReactorServiceInstanceLoadBalancer 抽象,而不關心實例供應如何實現。

    • ServiceInstanceListSupplier 可隨時替換(比如 Kubernetes、Consul、Nacos),Feign 本身無需改動。

👉 結論:Ribbon 時代 Feign 直接依賴 Ribbon 核心接口,導致強綁定;SCLB 下 Feign 只依賴于統一的 LoadBalancer 抽象,而實例來源和策略完全可插拔 → 解耦性更高


三、Spring Cloud LoadBalancer 最佳實踐

1. 基礎使用

引入依賴

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

RestTemplate / WebClient 集成

@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder) {return builder.build();
}@Bean
@LoadBalanced
public WebClient.Builder webClientBuilder() {return WebClient.builder();
}

建議優先用 WebClient,因為它能發揮 SCLB 的 Reactor 非阻塞優勢。


2. 緩存與性能優化

SCLB 默認每次請求會調用 DiscoveryClient 獲取實例,可以用內置的 緩存供應器

@Bean
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(ConfigurableApplicationContext context) {return ServiceInstanceListSupplier.builder().withDiscoveryClient().withCaching() // 啟用緩存.build(context);
}

這樣能減少注冊中心壓力,尤其是在高并發場景。


3. 自定義策略

簡單示例:基于元數據的優先級選擇

比如實例 metadata 里有 "zone": "shanghai",只要優先調用同城實例:

@Bean
ReactorServiceInstanceLoadBalancer zoneAwareLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> supplierProvider) {return new ReactorServiceInstanceLoadBalancer() {@Overridepublic Mono<Response<ServiceInstance>> choose(Request request) {return supplierProvider.getIfAvailable().get().next().map(instances -> {List<ServiceInstance> localZone = instances.stream().filter(i -> "shanghai".equals(i.getMetadata().get("zone"))).toList();if (!localZone.isEmpty()) {return new DefaultResponse(localZone.get(0));}return new DefaultResponse(instances.get(0));});}};
}

更復雜:權重路由

實現 ReactorServiceInstanceLoadBalancer,結合 metadata.weight 字段,做加權隨機選擇。這相當于 Ribbon 的 WeightedResponseTimeRule,但在 SCLB 里更靈活。


4. ServiceInstanceListSupplier 增強

SCLB 提供了“供應鏈”思想,常用擴展點:

  • 過濾:過濾掉 metadata 標記為 "status=down" 的實例;

  • 排序:按響應時間/CPU負載排序,把健康的放前面;

  • 包裝:組合多層供應器(比如先 DiscoveryClient → 再緩存 → 再 zone 過濾)。

這種鏈式增強比 Ribbon 的配置類清晰得多。


5. 與 Feign 配合

在新版 Spring Cloud 中,Feign 默認走 SCLB。最佳實踐:

  • 配置 spring.cloud.loadbalancer.retry.enabled=true → 自動開啟重試機制;

  • 自定義 ReactorServiceInstanceLoadBalancer,Feign 會自動走你的策略;

  • 如果想做更細粒度控制,可以寫 @FeignClient(configuration=...) 指定獨立的 LoadBalancer 配置。


6. 容錯與重試

SCLB 不再像 Ribbon 那樣內置 RetryRule,而是把重試交給 Spring Retry

spring:cloud:loadbalancer:retry:enabled: trueretry-on-all-operations: truemax-retries-on-same-service-instance: 1max-retries-on-next-service-instance: 2

這樣能保證單實例失敗 → 自動切換下一個實例,避免單點問題。


7. 云原生環境最佳實踐

  • Kubernetes 上,推薦直接基于 spring-cloud-starter-kubernetes-client + SCLB,實例供應就是 Pod 列表;

  • Nacos / Consul 場景下,直接使用對應 DiscoveryClient starter,SCLB 自動適配;

  • 保持 ServiceInstance metadata 豐富(zone、weight、tag),方便做策略。


8. 遷移建議(Ribbon → SCLB)

  • RestTemplate 上的 @LoadBalanced 不需要動,底層自動切換為 SCLB;

  • Feign 默認走 SCLB,不需要額外改動;

  • Ribbon 自定義的 IRule 策略,需要改寫成 ReactorServiceInstanceLoadBalancer

  • Ribbon 的 Zone/Weight 邏輯,遷移到 ServiceInstanceListSupplier + metadata 策略更清晰。


總結

最佳實踐關鍵就是 “解耦 + 插拔”

  • 實例來源 → DiscoveryClient + 緩存

  • 實例增強 → Supplier 過濾/排序/權重

  • 策略 → 自定義 LoadBalancer

  • 調用 → WebClient / Feign

  • 容錯 → Spring Retry

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

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

相關文章

【STM32】SPI 與 Flash 筆記

1?? SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外設接口&#xff09;英文解釋&#xff1a; Serial&#xff1a;串行Peripheral&#xff1a;外設Interface&#xff1a;接口用途&#xff1a;MCU 與外部設備&#xff08;Flash、傳感器等&#xff09;高速數據通…

抽象工廠設計模式 Abstract Factory

抽象工廠抽象工廠設計模式是一種創建模式&#xff0c;它提供了一個用于創建相關或從屬對象族的接口&#xff0c;而無需指定其具體類。 它在以下情況下特別有用&#xff1a; 您需要創建必須一起使用并且是一致系列的一部分的對象&#xff08;例如&#xff0c;按鈕、復選框和菜單…

WSL 下的虛擬網卡配置

第一部分&#xff1a;Windows 虛擬網卡創建指南 1. 原理 在 Windows 里&#xff0c;“虛擬網卡”本質是由網絡驅動在系統網絡棧中創建的一個 軟件網卡接口。它的作用和物理網卡類似&#xff0c;只不過不直接連接到物理硬件&#xff0c;而是通過內核網絡驅動與宿主機網絡進行交換…

Dify web前端源碼本地部署詳細教程

目錄 1. 先啟動API 2. 啟動worker服務 3. 啟動web 4. 訪問登陸地址 在前面的文章中&#xff0c;Dify源碼部署&#xff0c;搭建二次開發環境&#xff08;一&#xff09; 已經記錄了如何在本地啟動API、work、中間件。在本篇文章中&#xff0c;將概述如何啟動dify web源碼項…

CVPR 2025|英偉達聯合牛津大學提出面向3D醫學成像的統一分割基礎模型

在 2D 自然圖像和視頻的交互式分割領域&#xff0c;基礎模型已引發廣泛關注&#xff0c;這也促使人們開始構建用于醫學成像的 3D 基礎模型。然而&#xff0c;3D 醫學成像存在的領域差異以及臨床應用場景&#xff0c;要求開發一種有別于現有 2D 解決方案的專用模型。具體而言&am…

解決“Win7共享文件夾其他電腦網絡無法發現共享電腦名稱”的問題

要讓運行 Windows 7 的電腦被局域網中其他設備&#xff08;包括另一臺電腦、手機、NAS 等&#xff09;“發現”&#xff0c;必須同時滿足三個條件&#xff1a; 網絡發現功能已啟用&#xff1b;對應的后臺服務已啟動&#xff1b;防火墻規則放行。 下面給出最簡、最穩妥的 3 步設…

Python pyzmq 庫詳解:從入門到高性能分布式通信

一、前言 在現代軟件開發中&#xff0c;進程間通信&#xff08;IPC&#xff09;與分布式系統通信已經成為基礎能力。無論是構建一個微服務架構的后端&#xff0c;還是實現大規模并行計算任務&#xff0c;如何讓不同的進程或節點之間高效地傳遞消息&#xff0c;都是核心問題。 傳…

CentOS 7更換國內鏡像源

第一步&#xff1a;檢查系統版本 在修改任何配置之前&#xff0c;先確定你的 CentOS 版本&#xff0c;因為不同版本的鏡像源配置文件不同。 cat /etc/redhat-release這個命令會顯示你的 CentOS 版本信息&#xff0c;例如 CentOS Linux release 7.9.2009 (Core)。從你的錯誤日志…

詳解 doclayout_yolo:Python 文檔布局檢測

目錄一、doclayout_yolo 核心功能二、安裝方法1. 直接安裝2. 通過 PDF-Extract-Kit 安裝三、使用示例1. 快速體驗&#xff08;HuggingFace Demo&#xff09;2. 本地推理代碼3. 批量處理四、技術亮點五、應用場景六、其他說明1.相關資源2. 注意事項doclayout_yolo 是一個基于 Y…

貓頭虎AI分享|一款Coze、Dify類開源AI應用超級智能體Agent快速構建工具:FastbuildAI

貓頭虎AI分享&#xff5c;一款 Coze、Dify 類開源 AI 應用超級智能體快速構建工具&#xff1a;FastbuildAI 區別在于它的易用度和商業閉環功能 摘要&#xff1a;FastbuildAI 是一個開源的 AI 應用“快速構建 商業化閉環”工具。它讓個人開發者與小團隊用 可視化 零代碼 的方…

GitLab 安全漏洞 CVE-2025-6186 解決方案

本分分享極狐GitLab 補丁版本 18.2.2, 18.1.4, 18.0.6 的詳細內容。這幾個版本包含重要的缺陷和安全修復代碼&#xff0c;我們強烈建議所有私有化部署用戶應該立即升級到上述的某一個版本。對于極狐GitLab SaaS&#xff0c;技術團隊已經進行了升級&#xff0c;無需用戶采取任何…

【K8s】harbor安裝與推送鏡像

引言 在開發中&#xff0c;先推送鏡像到docker&#xff0c;然后直接在docker運行。但是在K8S中&#xff0c;需要動態創建或者分配機器&#xff0c;這里需要將鏡像推送到harbor倉庫&#xff0c;然后再從倉庫拉取到每臺集群機器。 docker安裝harbor&#xff1a;https://learnku…

FPGA讀取AHT20溫濕度模塊思路及實現,包含遇到的問題(IIC協議)

一.閱讀官方手冊 手冊在下方網址下載&#xff0c;該模塊在各個網店平臺均有銷售 百度網盤 請輸入提取碼 手冊重點關注IIC地址&#xff08;讀地址0x71&#xff0c;寫地址0x70&#xff09;、IIC命令和讀寫數據邏輯&#xff0c;手冊寫的比較簡單&#xff08;感覺很多細節沒到位…

項目會議怎么開才有效

要提高項目會議的有效性&#xff0c;需要做到以下幾點&#xff1a;明確會議目的、制定具體的會議議程、合理控制會議時長、提前準備會議資料、選擇合適的參會人員、設定清晰的會議目標、確保會議有決策和行動方案、會后及時跟進與落實。其中&#xff0c;明確會議目的尤為重要。…

計算機視覺第一課opencv(二)保姆級教

目錄 簡介 一、邊界填充 1.函數說明 2.案例分析 二、圖像運算 1.號運算 2.cv2.add()函數 3.圖像加權運算 三、閾值處理 四、圖像平滑處理 1.椒鹽噪聲 2.均值濾波&#xff08;Mean Filtering&#xff09; 3.方框濾波 4. 高斯濾波&#xff08;Gaussian Filtering&am…

母豬姿態轉換行為識別:計算機視覺與行為識別模型調優指南

> 在現代智能化養殖中,母豬姿態識別是健康監測的關鍵技術。本文將帶你從0到1構建高精度母豬姿態識別系統,準確率可達95%以上! ## 一、為什么母豬姿態識別如此重要? 母豬的行為姿態是其健康狀況的重要指標: - **站立姿態**:可能表示發情期或進食需求 - **側臥姿態**:…

循序漸進學 Spring (下):從注解、AOP到底層原理與整合實戰

文章目錄7. 自動裝配 (Autowiring)7.1 XML 自動裝配7.2 使用注解實現自動裝配Autowired vs Resource8. 使用注解開發&#xff08;完全體&#xff09;8.1 定義 Bean (Component 及其衍生注解)8.2 注入屬性 (Value)8.3 注入對象8.4 定義作用域 (Scope)8.5 小結&#xff1a;XML vs…

C#WPF實戰出真汁06--【系統設置】--餐桌類型設置

1、系統設置的基本概念系統設置是用于配置和管理餐桌類型和菜品類型&#xff0c;是維護整個系統的基礎數據。通過系統設置&#xff0c;用戶可以調整餐桌類型的添加&#xff0c;刪除&#xff0c;編輯&#xff0c;分頁&#xff0c;查詢&#xff0c;重置&#xff0c;列表&#xff…

旋鈕鍵盤項目---foc講解(閉環位置控制)

hello&#xff0c;周六休息了一天&#xff0c;出去打本了。趁著夜色&#xff0c;花費了幾個小時&#xff0c;也是將閉環代碼寫完&#xff0c;參考了燈哥的思路。接下來介紹一下我的整個流程&#xff1a; 一、閉環位置控制思路&#xff1a; 其實懂得了開環&#xff0c;那么閉環…

為什么有些相機“即插即用”,而有些則需要采集卡?

在工業生產中&#xff0c;工業相機是“眼睛”&#xff0c;它幫助我們看到世界&#xff0c;但你知道嗎&#xff1f;不同的工業相機接口就像不同的“通道”&#xff0c;有些“通道”直接就能與計算機連接&#xff0c;而有些則需要一個額外的小配件——圖像采集卡。那么&#xff0…