基于Eureka和restTemple的負載均衡

?

在微服務架構中,基于 Eureka(服務注冊中心)和 RestTemplate(HTTP 客戶端)實現負載均衡是常見的方案,核心是通過 Eureka 獲取服務實例列表,再結合負載均衡策略選擇具體服務實例進行調用。以下是詳細實現方式和原理:

一、核心組件角色

  1. Eureka Server:服務注冊中心,負責接收服務提供者的注冊信息,并維護服務實例列表(健康狀態、網絡地址等)。
  2. 服務提供者:向 Eureka Server 注冊自身信息(如服務名、IP、端口),并定期發送心跳證明存活。
  3. 服務消費者:通過 Eureka Server 獲取目標服務的實例列表,使用 RestTemplate 發起 HTTP 請求,同時結合負載均衡策略選擇實例。
  4. RestTemplate:Spring 提供的 HTTP 客戶端工具,用于簡化服務間的 RESTful 接口調用。
  5. 負載均衡策略:從服務實例列表中選擇一個實例的規則(如輪詢、隨機、權重等)。

二、實現步驟

1. 搭建 Eureka Server
  • 引入依賴(Maven):
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  • 啟動類注解:添加@EnableEurekaServer開啟注冊中心功能。
  • 配置文件(application.yml):

    yaml

server:port: 8761  # Eureka Server默認端口
eureka:client:register-with-eureka: false  # 自身不注冊到Eurekafetch-registry: false  # 不獲取服務列表(純注冊中心模式)server:enable-self-preservation: false  # 關閉自我保護模式(開發環境用)
2. 服務提供者注冊到 Eureka
  • 引入依賴

    xml

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 啟動類注解:添加@EnableEurekaClient(或@SpringBootApplication,Spring Cloud 2.0 + 可省略)。
  • 配置文件

    yaml

spring:application:name: service-provider  # 服務名(消費者將通過該名稱調用)
server:port: 8081  # 多個實例需不同端口(如8081、8082)
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/  # Eureka Server地址
  • 啟動多個實例:通過--server.port=8081--server.port=8082啟動同一服務的多個實例,模擬集群。
3. 服務消費者配置(核心)
  • 引入依賴:除 Eureka Client 依賴外,需添加負載均衡依賴(Spring Cloud 默認集成 Ribbon 作為負載均衡器):

    xml

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  • 配置 RestTemplate:通過@LoadBalanced注解開啟負載均衡功能(底層會自動結合 Ribbon):

    java

    運行

@Configuration
public class RestTemplateConfig {@Bean@LoadBalanced  // 關鍵:開啟負載均衡,自動集成Ribbonpublic RestTemplate restTemplate() {return new RestTemplate();}
}
  • 調用服務:使用服務名(而非具體 IP: 端口)作為 URL,RestTemplate 會自動從 Eureka 獲取實例并負載均衡:

    java

    運行

@Service
public class ConsumerService {@Autowiredprivate RestTemplate restTemplate;public String callProvider() {// 服務名"service-provider"對應提供者的spring.application.nameString url = "http://service-provider/hello";  // 無需寫具體IP:端口return restTemplate.getForObject(url, String.class);}
}
4. 負載均衡策略配置

默認情況下,Ribbon 使用輪詢策略(依次調用每個實例),可通過配置修改策略:

  • 全局配置(所有服務生效):

    yaml

ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule  # 隨機策略
  • 針對特定服務配置(僅對 "service-provider" 生效):

    yaml

service-provider:  # 服務名ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule  # 權重響應時間策略

常見策略類:

  • RoundRobinRule:輪詢(默認)
  • RandomRule:隨機
  • WeightedResponseTimeRule:根據響應時間加權(響應快的實例權重高)
  • RetryRule:重試機制(失敗后重試其他實例)
  • BestAvailableRule:選擇并發量最低的實例

三、原理說明

  1. 服務注冊與發現

    • 服務提供者啟動時,向 Eureka Server 注冊自身信息(服務名、IP、端口等)。
    • Eureka Server 維護服務實例列表,并定期檢查心跳(默認 30 秒一次),移除無心跳的實例。
    • 服務消費者啟動時,向 Eureka Server 訂閱服務,定期拉取(默認 30 秒一次)服務實例列表到本地緩存。
  2. 負載均衡執行流程

    • 消費者調用restTemplate.getForObject("http://service-provider/hello")時,@LoadBalanced注解會觸發 Ribbon 的攔截器。
    • 攔截器將服務名 "service-provider" 解析為 Eureka 中的實例列表。
    • 根據配置的負載均衡策略(如輪詢),從列表中選擇一個實例(如 192.168.1.100:8081)。
    • 將 URL 替換為具體 IP: 端口(如http://192.168.1.100:8081/hello),發起實際請求。

四、注意事項

  1. 服務名大小寫:Eureka 中服務名默認不區分大小寫,但建議統一使用小寫(避免配置錯誤)。
  2. 健康檢查:默認 Eureka 僅通過心跳判斷存活,可結合 Spring Boot Actuator 開啟健康檢查(eureka.client.healthcheck.enabled=true),更精準反映服務狀態。
  3. 超時配置:當服務響應慢時,需配置 Ribbon 超時(避免請求卡頓):

    yaml

service-provider:ribbon:ConnectTimeout: 2000  # 連接超時(毫秒)ReadTimeout: 5000     # 讀取超時(毫秒)

  1. 替代方案:Spring Cloud 中,@LoadBalanced+RestTemplate 的組合可被@FeignClient替代(Feign 默認集成 Ribbon,語法更簡潔),但底層負載均衡原理類似。

通過以上配置,即可基于 Eureka 和 RestTemplate 實現服務間的負載均衡調用,提升系統的可用性和擴展性。

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

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

相關文章

子線程不能直接 new Handler(),而主線程可以

在 Android 中&#xff0c;子線程不能直接 new Handler()&#xff0c;而主線程可以&#xff0c;原因在于 Looper 機制。下面詳細解釋&#xff1a;1. 為什么主線程可以直接 new Handler()&#xff1f; 主線程&#xff08;UI 線程&#xff09;在啟動時&#xff0c;系統會自動調用…

Android無需授權直接訪問Android/data目錄漏洞

從android11開始&#xff0c;訪問/sdcard/Android/data目錄需要URI授權&#xff0c;而從更高的版本開始甚至URI權限也被收回&#xff0c;返回“無法使用此文件夾”的提示&#xff0c;這里提供一種方法&#xff0c;可以越權強制訪問data目錄&#xff0c;當然也包括obb、media等目…

本地部署 Kimi K2 全指南(llama.cpp、vLLM、Docker 三法)

Kimi K2 是 Moonshot AI 于2025年7月11日發布的高性能多專家語言模型&#xff08;MoE&#xff09;&#xff0c;支持最大 128K 上下文&#xff0c;激活參數規模為 32B&#xff0c;具備極強的推理、代碼生成與多輪對話能力。自從其權重以多種格式開源以來&#xff0c;許多開發者希…

使用python的pillow模塊將圖片轉化為灰度圖和相關的操作

使用python的pillow模塊可以將圖片轉化為灰度圖&#xff0c; 可以獲取灰度圖的特定點值&#xff0c;區域值&#xff0c; 修改值并保存到圖片 圖片轉換為灰度圖 from PIL import Image# 打開圖片 image Image.open("d://python//2//1.jpg")gray_image image.convert…

【網絡安全】大型語言模型(LLMs)及其應用的紅隊演練指南

未經許可,不得轉載。 文章目錄 什么是紅隊演練? 為什么 RAI 紅隊演練是一項重要實踐? 如何開展和規劃 LLM 的紅隊演練 1.測試前的準備 規劃:由誰負責測試 規劃:測試內容 規劃:測試方式 規劃:數據記錄方式 2.測試過程中 3.每輪測試后 報告數據 區分“識別”與“測量” 本…

ROS2安裝ros-humble-usb-cam 404錯誤導致失敗的解決方法

ROS2安裝ros-humble-usb-cam遇到404錯誤導致安裝失敗&#xff0c;如圖&#xff1a;解決方法&#xff1a; 備份 sources.list sudo cp /etc/apt/sources.list.d/ros2.list /etc/apt/sources.list.d/ros2.list.bak替換為清華源 sudo sed -i s|http://packages.ros.org/ros2/ubunt…

OllyDbg技巧學習

1 嘗試在反匯編代碼中找到一個函數的二進制代碼 有的時候需要一個函數的二進制代碼&#xff0c;注入到另外的一些地方&#xff1b;以此程序為示例&#xff0c; 八叉樹的C實現與原理解析-CSDN博客 Ollydbg打開可執行文件&#xff0c;我想先找到此函數的二進制代碼體&#xff0…

數據分析智能體:讓AI成為你的數據科學家

數據分析智能體&#xff1a;讓AI成為你的數據科學家 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈量世界&#xff0c…

K8s與Helm實戰:從入門到精通

Kubernetes 簡介 Kubernetes(簡稱 K8s)是一個開源的容器編排平臺,用于自動化部署、擴展和管理容器化應用。最初由 Google 設計并捐贈給云原生計算基金會(CNCF),現已成為容器編排領域的事實標準。 核心功能 自動化容器部署:支持聲明式配置和自動化部署,減少人工干預。…

根據ARM手冊,分析ARM架構中,原子操作的軟硬件實現的底層原理

目錄 1.問題背景&#xff1a; 2.原子操作 2.1 硬件操作 2.1.1 LDREX/LDXR指令 2.1.2 STREX/STXR指令 2.2 軟件操作 2.3 軟件硬件操作的各性能對比 3.總結 1.問題背景&#xff1a; 我們知道&#xff0c;RTOS的任務調度算法是搶占式優先級調度算法。 既然是搶占了&…

iOS 抓包工具選擇與配置指南 從零基礎到高效調試的完整流程

iOS 抓包&#xff1a;復雜網絡調試的必要技能 隨著移動端應用越來越依賴網絡交互&#xff0c;iOS 抓包作為核心調試工具之一&#xff0c;變得尤為重要。無論是調試 App 與后端的接口通信、排查 HTTPS 請求加密問題&#xff0c;還是定位網絡連接超時、請求異常&#xff0c;抓包都…

Java使用FastExcel實現Excel文件導入

依賴配置 (Maven pom.xml)<dependencies><!-- FastExcel 核心庫 --><dependency><groupId>cn.idev.excel</groupId><artifactId>fastexcel</artifactId><version>1.0.0</version></dependency><!-- Apache POI…

【60】MFC入門到精通——運行后 button按鍵上不顯示 按鍵名, 控件上的文字不顯示

文章目錄運行后&#xff0c;button按鍵上不顯示 “Test”原因是屬性&#xff0c;圖標–>True&#xff0c;改為False就好了。

抖音回應:沒有自建外賣,就是在團購的基礎上增加的配送功能

今年以來&#xff0c;外賣行業競爭愈加激烈&#xff0c;市場格局風云變幻。在這一背景下&#xff0c;外賣行業動向備受關注。近日&#xff0c;針對抖音上線團購版外賣的消息引發公眾關注。為此&#xff0c;大公科技以商家身份咨詢了抖店客服&#xff0c;對方回應稱&#xff0c;…

中間件安全攻防全解:從Tomcat到Weblogic反序列化漏洞介紹

本文僅用于技術研究&#xff0c;禁止用于非法用途。 Author:枷鎖 文章目錄什么是中間件中間件漏洞(1) Tomcat(2) Weblogic(3) JBoss漏洞什么是中間件 中間件&#xff08;Middleware&#xff09;是指一種軟件組件&#xff0c;其作用是在不同的系統、應用程序或服務之間傳遞數據…

現代前端開發流程:CI/CD與自動化部署實戰

目錄 引言現代前端開發面臨的挑戰CI/CD基礎概念前端CI/CD流程設計實戰案例&#xff1a;構建前端CI/CD管道自動化部署策略監控與回滾機制最佳實踐與優化建議總結 引言 隨著前端技術的飛速發展&#xff0c;現代Web應用變得越來越復雜。前端項目不再只是簡單的HTML、CSS和JavaS…

MySQL EXPLAIN深度解析:優化SQL性能的核心利器

MySQL EXPLAIN深度解析&#xff1a;優化SQL性能的核心利器 引言&#xff1a;數據庫性能優化的關鍵 在數據庫應用開發中&#xff0c;SQL查詢性能往往是系統瓶頸的關鍵所在。當面對慢查詢問題時&#xff0c;EXPLAIN命令就像數據庫工程師的X光機&#xff0c;能夠透視SQL語句的執行…

Sentinel配置Nacos持久化

前言&#xff1a; Sentinel在使用控制臺時進行配置是純內存操作&#xff0c;并沒有提供默認的持久化措施&#xff0c;一旦服務重啟會導致配置的流控、熔斷等策略失效。Sentinel官方提供了多種持久化方式如&#xff1a;Redis、Zookeeper、Etcd、Nacos以及其他方式等。此文以Naco…

Java學習第五十五部分——在軟件開發中的作用

目錄 一. 前言提要 二. 主要作用 1. 跨平臺能力&#xff08;核心優勢&#xff09; 2. 企業級應用開發&#xff08;主導領域&#xff09; 3. 安卓應用開發&#xff08;關鍵角色&#xff09; 4. 大數據處理&#xff08;重要組件&#xff09; 5. 嵌入式系統 & IoT 6. 桌…

Keil編譯文件格式轉換全解析

目錄 介紹 Keil自帶常用命令概覽 fromelf介紹 Keil可燒錄文件概述 核心差異概覽 .axf文件獲取 .hex文件獲取 .bin文件生成 ?編輯 補充:生成可執行文件的匯編代碼&#xff08;.asm文件&#xff09; Keil自帶常用命令詳解 核心功能?? ??格式轉換?? ??輸出路…