SpringCloud服務拆分:Nacos服務注冊中心 + LoadBalancer服務負載均衡使用

SpringCloud中Nacos服務注冊中心 + LoadBalancer服務負載均衡使用

  • 前言
  • Nacos
    • 工作流程
    • nacos安裝
      • docker安裝
      • window安裝
    • 運行nacos
    • 微服務集成nacos
    • 高級特性
      • 1.服務集群
        • 配置方法
        • 效果圖
        • 模擬服務實例宕機
      • 2.權重配置
      • 3.環境隔離
  • 如何啟動集群節點
    • 本地啟動多個節點方法
  • LoadBalancer
    • 集成LoadBalancer
    • LoadBalancer流程
    • 源碼跟蹤
    • 自定義負載均衡算法
      • 使用自定義負載均衡算法
  • 結語

😀大家好!我是向陽🌞,一個想成為優秀全棧開發工程師的有志青年!	
📔今天來說一說SpringCloud中Nacos服務注冊中心 + LoadBalancer服務負載均衡使用。

前言

本篇文章主要是使用Nacos來注冊服務實例,使用Nacos來管理這些服務實例,然后使用LoadBalancer讓服務消費方負載均衡調用服務提供方

這里有一些代碼準備,Contorller的代碼我就不貼了,貼一個order服務遠程調用user服務,獲取訂單對應的用戶信息。

這里使用的是RestTemplate來進行調用遠程服務,后續會用OpenFeign來進行替換優化

@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;/*** 查詢訂單(攜帶用戶信息)** @param orderId* @return*/@Overridepublic Order findOrderByOrderId(Long orderId) {Order order = orderMapper.findOrderByOrderId(orderId);User user = restTemplate.getForObject("http://ssgw-cloud-user/api/user/findUserByUserId/" + order.getUserId(),User.class);order.setUser(user);return order;}
}

Nacos

在這里插入圖片描述

官方文檔地址:Nacos文檔地址

Nacos有多個特性,這里我們主要介紹的是他的服務發現和服務健康監測這個特性,他還有個我常用的特性,那就是動態配置服務,以后可能會說到。

我們把服務都注冊到Nacos里面,Nacos會對服務進行實時的健康檢查,阻止向不健康的主機或服務實例發送請求。

工作流程

通過注冊中心可以對服務提供方和服務消費方進行解耦。具體的工作模式如下圖所示:
在這里插入圖片描述
工作流程說明:

  1. 服務提供方在啟動的時候,會向注冊中心注冊自己服務的詳情信息 (ip、端口號等) 。在注冊中心中會維護一張服務清單,保存這些注冊信息,注冊中心需要以心跳的方式(30s,服務向注冊中心發送心跳)去監測清單中的服務是否可用,如果不可用,需要在服務清單中剔除不可用的服務。
  2. 服務消費方向服務注冊中心咨詢服務,并獲取所有服務的實例清單,然后,按照指定的負載均衡算法從服務清單中選擇一個服務實例進行訪問。
  3. 每當服務提供方有節點不可用后,服務消費方會重新緩存可用的提供方信息(ip、端口號等)。

nacos安裝

docker安裝

直接在linux虛擬機中用docker進行以下命令即可。

# 拉取鏡像
docker pull nacos/nacos-server:v2.2.2# 創建容器
docker run --name nacos -e MODE=standalone -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:v2.2.2# nacos2.x的版本新增了一個客戶端與服務端的gRpc的通訊端口號9848

window安裝

不同的版本有不同的注意事項,可以去官方文檔查閱,或者具體的細節可以查看其他博客,這里不詳細贅述。

二進制包下載地址

運行nacos

docker的運行在上面已經提到了,docker run xxx就已經運行了。

Window版本的docker配置文件默認是單機模式啟動,所以我們運行nacos要加上 standalone 這個命令。

startup.cmd -m standalone

運行成功的頁面,nacos的默認端口是8848,我們訪問:http://localhost:8848/nacos 即可訪問到圖形化界面,默認賬號密碼都是 nacos
在這里插入圖片描述

微服務集成nacos

在pom.xml中加入以下依賴:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在application.yml中加入以下配置:

spring:# 配置nacos注冊中心的地址cloud:nacos:discovery:server-addr: localhost:8848 # 如果在虛擬機安裝,則改成你對應的ip地址application: name: spzx-cloud-user   # 每一個服務注冊到nacos注冊中心都需要提供一個服務名稱,order微服務注冊的時候需要更改微服務名稱

加入對應的配置文件后,在nacos圖形化界面就可以看到以下信息,這里我已經啟動了3個user服務,所以 ssgw-cloud-user 的實例數為3。

在這里插入圖片描述

高級特性

1.服務集群

在實際生產環境中,為了保證每一個服務的高可用,那么,此時就需要去構建服務集群,但是,并不是說把所有的服務都部署在一個機房里。而是將多個服務分散的部署到不同的機房中,每一個機房的服務可以看做成是一個集群

微服務互相訪問時,應該盡可能訪問同集群實例,因為本地訪問速度更快。當本集群內不可用時,才訪問其它集群。例如:上海機房內的order微服務應該優先訪問同機房的user微服務。

配置方法

配置yml文件:

spring:cloud:nacos:discovery:cluster-name: SH		# 配置服務所屬集群

集成nacos的負載均衡算法,也是在yml文件中配置,配置了之后,就會按照服務集群來進行訪問對應的服務實例,訪問默認是隨機訪問。

spring:cloud:loadbalancer:nacos:enabled: true

一個服務不同實例配置不同的集群方法和下面如何啟動集群節點方法一樣,這里貼個圖。

在這里插入圖片描述
我們這里用戶服務,兩個配置BJ,兩個配置SH,訂單服務配置了SH,根據上面的講述,如果我們訪問訂單服務的接口,我們應該優先訪問的是兩個SH的用戶服務

配置了服務集群后,nacos的服務實例有所變化,如下面兩張圖。

在這里插入圖片描述

在這里插入圖片描述

效果圖

我們訪問訂單的接口,查看用戶服務的控制臺,我們可以看到只有配置了SH的兩個用戶服務控制臺信息有打印SQL語句,說明被只有這兩個服務被調用了。

其余三個我就不貼圖了…

模擬服務實例宕機

我們可以在nacos的圖形化界面中下線按鈕來下線對應的服務實例,這樣就模擬了服務宕機場景,此時我們下線兩個SH的用戶服務實例,我們訪問訂單接口,此時訪問就會訪問兩個BJ的服務實例,如下圖所示。
在這里插入圖片描述
此時只會調用在配置在BJ的兩個服務實例中。

在這里插入圖片描述
其余三個我就不貼圖了…

2.權重配置

我們可以對不同的服務進行權重配置,比如性能好的服務器權重就可以大一點性能差的服務器泉州就可以小一點

這個我們可以直接在nacos圖形化界面進行配置,點擊編輯后,即可在彈出的彈窗進行權重配置。

在這里插入圖片描述
我們還可以在yml文件中進行配置:

spring:cloud:nacos:discovery:weight: 0.1

3.環境隔離

在實際的開發過程中,可能會存在很多個軟件環境:開發環境、測試環境、生產環境。

nacos也是支持多環境隔離配置的,在nacos中是通過namespace來實現多環境的隔離。

完整的服務注冊數據存儲結構如下所示:

在這里插入圖片描述
namespace + group 才可以確定具體的微服務實例。默認情況下,所有service、group都在同一個namespace,名為public。

在nacos的圖形化界面就可以進行namespace的添加。

在這里插入圖片描述

給微服務添加名稱空間的配置,來指定該微服務所屬環境,這里修改order的application.yml文件,改為dev:

spring:# 配置nacos注冊中心的地址cloud:nacos:discovery:namespace: dev # 配置服務實例所屬名稱空間

這個時候order和其他的user實例已經不在同一個namespace命名空間下了,這個時候我們再次訪問接口就會報錯,因為訪問不到了。

在這里插入圖片描述
控制臺報錯找不到對應的實例:

在這里插入圖片描述

我們也可以分配組,在yml配置文件中進行配置:

spring:# 配置nacos注冊中心的地址cloud:nacos:discovery:namespace: dev # 配置服務實例所屬名稱空間group: ORDER_GROUP

如何啟動集群節點

我們啟動多個user節點,讓order服務負載調用user節點。

本地啟動多個節點方法

我們對原本的user服務右鍵點擊,選擇Copy Configuration來拷貝配置,進而修改新的配置,我們這里修改端口,防止端口沖突啟動不起來。
在這里插入圖片描述
服務名稱可改可不改使用默認的也可以,但是一定要覆蓋配置文件中的端口號。
在這里插入圖片描述
選擇Override configuration properties后,添加以下配置來覆蓋原有的配置,約定大于配置,走的就是我們這里配置的端口。
在這里插入圖片描述
配置完畢后,啟動就是下圖所示的結果。
在這里插入圖片描述

LoadBalancer

集成LoadBalancer

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

Spring Cloud LoadBalancer 是Spring Cloud中負責客戶端負載均衡的模塊,其主要原理是通過選擇合適的服務實例來實現負載均衡

客戶端負載均衡:就是負載均衡算法由客戶端提供,默認是輪詢負載均衡,就是每個服務被依次調用。

我們多此訪問我們項目的接口,可以從控制臺中發現,三個用戶服務的控制臺中各有一條SQL查詢信息,說明每個都被調用了一次。

http://localhost:10200/api/order/findOrderByOrderId/101

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

LoadBalancer流程

Spring Cloud LoadBalancer的底層采用了一個攔截器【LoadBalancerInterceptor】,攔截了RestTemplate發出的請求,對地址做了修改。
在這里插入圖片描述
執行流程說明:

  1. 通過 LoadBalancerInterceptor 請求攔截器攔截我們的 RestTemplate請求:http://ssgw-cloud-user/api/user/findUserByUserId/1

  2. 獲取請求的url,然后,從請求的url中獲取服務提供方的主機名稱(ssgw-cloud-user)

  3. 然后,調用LoadBalancerClient中的execute方法,將服務提供方的名稱傳遞過去

  4. 在LoadBalancerClient的choose方法中通過ReactiveLoadBalancer.Factory從Nacos注冊中心中獲取服務列表以及負載均衡算法實例對象

  5. 通過ReactiveLoadBalancer從服務列表中選擇一個服務實例地址,然后,發起遠程調用

源碼跟蹤

首先我們進入到 LoadBalancerInterceptorintercept 方法,可以看到我們調用遠程服務的uri和服務名稱serviceName。

在這里插入圖片描述
緊接著進入到 LoadBalancerClientexecute 方法,這個方法主要來處理服務id和用戶請求,我們主要看他的 choose 方法。

在這里插入圖片描述

我們從choose方法可以看出來,我們的負載均衡器是我們在配置文件中配置的 NacosLoadBalancer 負載均衡器。

在這里插入圖片描述

緊接著調用負載均衡器的 choose 方法,從服務列表中選擇一個服務實例對象

在這里插入圖片描述

如果我們注釋掉配置文件中的集成nacos的負載均衡算法,我們可以得到負載均衡器變成了默認的RR負載均衡器也就是輪詢調度負載均衡器(RoundRobinLoadBalancer)。
在這里插入圖片描述

自定義負載均衡算法

詳細注釋在代碼中都有,這里不多贅述。

public class CustomLoadBalancerConfiguration {/*** @param environment: 用于獲取環境屬性配置,其中LoadBalancerClientFactory.PROPERTY_NAME表示該負載均衡器要應用的服務名稱。* @param loadBalancerClientFactory: 是Spring Cloud中用于創建負載均衡器的工廠類,通過getLazyProvider方法獲取ServiceInstanceListSupplier對象,以提供可用的服務列表。* ServiceInstanceListSupplier:用于提供ServiceInstance列表的接口,可以從DiscoveryClient或者其他注冊中心中獲取可用的服務實例列表。* @return*/@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

使用自定義負載均衡算法

這里使用的是 RestTemplate 來遠程調用其他的服務接口(后期會換成 OpenFeign),所以我們在 RestTemplateConfiguration 類上面加上 @LoadBalancerClients 注解來指定我們要調用哪個服務實例,指定使用我們自定義的負載均衡算法來進行調用。

@Configuration
@LoadBalancerClients(value = {@LoadBalancerClient(name = "ssgw-cloud-user", configuration = CustomLoadBalancerConfiguration.class)
})
public class RestTemplateConfiguration {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

結語

至此我們就完成了我們的主題《SpringCloud服務拆分:Nacos服務注冊中心 + LoadBalancer服務負載均衡使用》,更多的細節和使用方法還等著我們去探索,加油吧👍!

請添加圖片描述

——👦[作者]:向陽256
——?[更新]:2025.5.8
——🥰本人技術有限,如果有不對指正需要更改或者有更好的方法,歡迎到評論區留言。

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

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

相關文章

網絡安全系列--《文章1:網絡安全基礎與核心概念》

課程1&#xff1a;網絡安全基礎與核心概念 學習內容 1. 網絡安全定義 網絡安全是通過技術、管理及法律手段保護網絡系統的硬件、軟件及數據&#xff0c;使其免受破壞、篡改或泄露&#xff0c;確保系統穩定運行并提供可靠服務。其核心目標包括保密性、完整性、可用性、可控性及…

C++:掃雷游戲

一.掃雷游戲項目設計 1.文件結構設計 首先我們要先定義三個文件 ①test.c //文件中寫游戲的測試邏輯 ②game.c //文件中寫游戲中函數的實現等 ③game.h //文件中寫游戲需要的數據類型和函數聲明等 2.掃雷游戲的主體結構 使?控制臺實現經典的掃雷游戲 ?游戲可以通過菜單…

[人機交互]識別需要和建立需求

*一.需要選擇的產品特征&#xff08;或屬性&#xff09;可概括為兩類 1.1外部特征&#xff08;屬性&#xff09; 對用戶而言&#xff0c;可見及可度量的屬性 1.2內部特征&#xff08;屬性&#xff09; 對用戶而言是不可見或不可度量的 二.什么是需求 需求是有關目標的陳述…

Lua學習筆記

文章目錄 前言1. Lua的數據類型2. Lua的控制結構2.1 循環2.1.1 for2.1.1.1 數值循環2.1.1.2 迭代循環2.1.2 while2.1.3 repeat-until 2.2 條件語句2.3 函數 3. Lua中的變量作用域 前言 Lua是一種輕量級的、高效的、可擴展的腳本語言&#xff0c;由巴西里約熱內盧天主教大學&am…

學習c語言的鏈表的概念、操作(另一篇鏈表的筆記在其他的欄目先看這個)

在學習Linux之間我們先插入一下鏈表的知識 學習鏈表&#xff08;一種數據結構思想&#xff09; 鏈表和數組的區別和實現&#xff1a; 鏈表&#xff08;鏈表是個好東西&#xff09; 鏈表概念&#xff08;什么是鏈表&#xff09;&#xff1f; 鏈表就是數據結構->數據的存儲…

NVM完全指南:安裝、配置與最佳實踐

發布于 2025年5月7日 ? 閱讀時間&#xff1a;10分鐘 &#x1f4a1; TL;DR: 本文詳細介紹了如何完整卸載舊版Node.js&#xff0c;安裝NVM&#xff0c;配置阿里云鏡像源&#xff0c;以及設置node_global與node_cache目錄&#xff0c;打造高效Node.js開發環境。 &#x1f4cb; 目…

轉換算子和行動算子的區別

轉換算子和行動算子主要是在分布式計算框架&#xff08;如 Apache Spark&#xff09;里常用的概念&#xff0c;它們在功能、執行機制、返回結果等方面存在明顯區別&#xff0c;以下為你詳細介紹&#xff1a; 定義與功能 返回結果 如何在使用轉換算子和行動算子時避免出現內存溢…

Windows命令行軟件管理器:Chocolatey

文章目錄 Windows命令行軟件管理器&#xff1a;Chocolatey1.Chocolatey使用1.1 安裝1.2 常用命令1.3 使用流程 2.常用shell命令匯總 Windows命令行軟件管理器&#xff1a;Chocolatey Chocolatey 是一款強大的 Windows 命令行軟件管理器&#xff0c;目前在 GitHub 上已斬獲 10.…

MySQL 8.0 OCP(1Z0-908)英文題庫(11-20)

目錄 第11題題目分析正確答案 第12題題目分析正確答案 第13題題目分析正確答案 第14題題目分析正確答案 第15題題目分析正確答案 第16題題目分析正確答案 第17題題目分析正確答案&#xff1a; 第18題題目分析正確答案 第19題題目分析正確答案 第20題題目分析正確答案 第11題 W…

mac 使用 Docker 安裝向量數據庫Milvus獨立版的保姆級別教程

Milvus 特點&#xff1a;開源的云原生向量數據庫&#xff0c;支持多種索引類型和GPU加速&#xff0c;能夠在億級向量規模下實現低延遲高吞吐。具有靈活的部署選項和強大的社區支持。 適用場景&#xff1a;適合處理超大規模數據和高性能需求的應用&#xff0c;如圖像搜索、推薦…

一款獨立于游戲外的鍵盤源按鍵輔助工具他來了

一款獨立于游戲外的鍵盤源按鍵輔助工具 一&#xff01;不需要安裝&#xff0c;下載即用 二&#xff01;只要熟悉hekili體系 三&#xff01;略懂wa定制 四&#xff01;知道如何循環并且會自行模擬 五&#xff01;會simc最好 直接就上手了&#xff01; 我們的不是一鍵宏&…

python學生作業提交管理系統-在線作業提交系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…

Spring Boot + Vue 實現在線視頻教育平臺

一、項目技術選型 前端技術&#xff1a; HTML CSS JavaScript Vue.js 前端框架 后端技術&#xff1a; Spring Boot 輕量級后端框架 MyBatis 持久層框架 數據庫&#xff1a; MySQL 5.x / 8.0 開發環境&#xff1a; IDE&#xff1a;Eclipse / IntelliJ IDEA JDK&…

引文索引數據庫在科研中的應用

如何利用引文索引數據庫高效檢索、分析研究論文&#xff0c;發現高水平論文&#xff0c;鎖定特定領域的經典文獻&#xff1f;如何跟蹤最新研究進展&#xff1f; 回放鏈接 image.png image.png image.png image.png image.png image.png image.png image.png image.png image.pn…

《供應鏈網絡攻擊的風險與防范》

中國古語有云&#xff1a;“千里之堤&#xff0c;潰于蟻穴。”供應鏈攻擊正是利用這種系統性弱點發起攻勢。近年來&#xff0c;隨著國內數字化轉型加速&#xff0c;供應鏈安全問題頻發。從某盟刪庫事件到某頭部物流企業數據泄露&#xff0c;從某國產工業軟件遭惡意代碼植入到某…

ETL介紹及kettle等工具學習

ETL介紹及kettle等工具學習 1. 什么是ETL&#xff1f; ETL&#xff08;Extract, Transform, Load&#xff09;是數據集成領域的核心流程&#xff0c;用于將數據從多個分散的源系統中抽取、清洗、轉換后加載到目標數據倉庫或數據湖中&#xff0c;以支持分析、報表和決策。其核…

圖形渲染+事件處理最終版

基于之前做的項目圖形移動處理-CSDN博客添加了相機&#xff0c;透視投影&#xff0c;鼠標控制圖形旋轉。雖然個人感覺這個項目用的是一個二維的三角形&#xff0c;給他加透視投影和相機意義不大&#xff0c;因為透視投影是近大遠小&#xff0c;我這個程序設置了放大縮小的限制&…

G口大帶寬服務器線路怎么選

G口大帶寬服務器線路選擇指南 ??一、線路類型與特點?? ??單線&#xff08;電信/聯通/移動&#xff09;?? ??優勢??&#xff1a;帶寬獨享、價格低、延遲穩定&#xff0c;適合單一運營商用戶集中場景。??劣勢??&#xff1a;跨運營商訪問延遲高&#xff08;如電信…

HTML10:iframe內聯框架

iframe內部框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>內聯框架學習</title> </head> <body> <!--iframe內聯框架 src:地址 width-height:高度寬度 --> <iframe…

基于 Spring Boot 瑞吉外賣系統開發(十一)

基于 Spring Boot 瑞吉外賣系統開發&#xff08;十一&#xff09; 菜品啟售和停售 “批量啟售”、“批量停售”、操作列的售賣狀態綁定單擊事件&#xff0c;觸發單擊事件時&#xff0c;最終攜帶需要修改售賣狀態的菜品id以post請求方式向“/dish/status/{params.status}”發送…