Nacos 核心功能實戰筆記(超詳細)

Nacos 核心功能實戰筆記

一、Nacos 簡介

1. 是什么?

  • 全稱:Nacos = Naming and Configuration Service
  • 定位:阿里巴巴開源的 動態服務發現、配置管理、服務管理平臺
  • 核心功能:服務注冊與發現 + 統一配置管理 + 服務健康監測
  • 適用場景:微服務架構、云原生應用(如 Spring Cloud、Dubbo)

2. 同類產品對比

產品主要功能優勢局限性典型場景
Nacos服務發現 + 配置管理功能全面,支持動態配置、AP/CP模式切換學習成本略高需要統一管理服務與配置的場景
Eureka服務發現簡單輕量,AP模型保證高可用無配置管理功能,已停止維護純服務發現場景
Consul服務發現 + 配置管理 + 健康檢查支持多數據中心,安全性強配置管理功能較弱復雜分布式系統
Zookeeper服務發現 + 分布式協調強一致性(CP模型)配置管理需自行實現,運維復雜強一致性要求的場景

二、Nacos 核心功能詳解

1. 服務注冊與發現

  • 工作原理

    1. 服務啟動時向Nacos注冊自己的元數據(IP、端口、健康狀態)
    2. 消費者通過Nacos查詢可用服務實例列表
  1. 內置心跳機制自動剔除故障節點
  • 示例場景

    // 訂單服務注冊到Nacos
    @SpringBootApplication
    @EnableDiscoveryClient  // 關鍵注解
    public class OrderServiceApplication { ... }// 用戶服務調用訂單服務
    @Autowired
    private RestTemplate restTemplate;public String getOrder() {// 直接使用服務名調用(需配合@LoadBalanced)return restTemplate.getForObject("http://order-service/orders", String.class);
    }
    

2. 動態配置管理

  • 核心特性
    • 配置熱更新:修改Nacos控制臺配置 → 應用實時生效(無需重啟)
    • 多環境支持:通過 Namespace 隔離開發/測試/生產環境
    • 灰度發布:支持按IP或分組推送特定配置

3. 服務健康監測

  • 機制

    • 客戶端每5秒發送心跳包到Nacos服務器
    • 超過15秒未收到心跳標記為"不健康"
    • 30秒未恢復則從服務列表移除
  • 擴展能力

    // 自定義健康檢查規則
    @Component
    public class CustomHealthChecker implements HealthIndicator {@Overridepublic Health health() {// 檢查數據庫連接等自定義邏輯return Health.up().withDetail("db", "connected").build();}
    }
    

三、為什么選擇 Nacos?

1. 核心優勢

  • 一站式解決方案:同時解決服務發現與配置管理問題
  • 靈活性:支持AP(高可用)和CP(強一致)模式動態切換
  • 生態整合:無縫對接Spring Cloud、Dubbo、K8s
  • 易用性:提供可視化控制臺,降低運維復雜度

2. 典型應用場景

  1. 微服務架構:統一管理上百個服務的注冊與配置
  2. 配置灰度發布:只對部分服務實例推送新配置
  3. 多環境管理:通過Namespace快速切換開發/測試/生產環境
  4. 服務熔斷:結合Sentinel實現流量控制

附:快速命令備忘

# 啟動Nacos服務器(單機模式)
startup.sh -m standalone

四、注冊中心實戰

遠程調用 - 基本流程

在這里插入圖片描述

1. 基礎配置

步驟:

  1. 添加依賴
<!-- pom.xml -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.配置Nacos地址

在這里插入圖片描述

# Nacos服務器中顯示的名稱
spring.application.name=service-order
# 該模塊啟動占用的端口
server.port=8000
# application.yml
server:port: 8000
spring:application:name: order-servicespring:cloud:nacos:discovery:server-addr: localhost:8848  # Nacos服務地址

3.開啟服務發現
在啟動類添加注解:

@SpringBootApplication
@EnableDiscoveryClient  // 開啟服務注冊與發現
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}
}

查看注冊中心效果 訪問 http://localhost:8848/nacos

集群模式啟動測試 單機情況下通過改變端口模擬微服務集群


2. 擴展功能

1. 獲取服務實例列表
通過 DiscoveryClient 查詢服務實例:(Spring提供的,NacosDiscoveryClient是DiscoveryClient的實現)

@Autowired
private DiscoveryClient discoveryClient;public void listServices() {List<String> services = discoveryClient.getServices();  // 獲取所有服務名List<ServiceInstance> instances = discoveryClient.getInstances("order-service");  // 獲取指定服務的實例
}

2. 負載均衡調用
引入依賴:

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

使用 LoadBalancerClient 選擇實例:

//負載均衡基礎版
@Configuration
public class OrderConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}//負載均衡發送請求public Product getProductFromRemoteWithLoadBalancer(Long productId){//1.獲取服務實例ServiceInstance choose = loadBalancerClient.choose("service-product");//2.獲取服務實例的uriString url = "http://"+choose.getHost()+":"+choose.getPort()+"/product/"+productId;log.info("請求地址:{}",url);//3.發送請求Product product = restTemplate.getForObject(url, Product.class);return product;}
//進階基于注解的負載均衡
@Configuration
public class OrderConfig {@LoadBalanced//使用注解,自動實現負載均衡@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
private Product getProductFromRemqteWithLoadBalanceAnnotation(Long productId) {String url="http://service-product/product/"+productId;//給遠程發送請求;service-product會被動態替換Product product = restTemplate.getForObject(url,Product.class);return product;
}

3.遠程調用 - 面試題

思考:注冊中心宕機,遠程調用還能成功嗎?
在這里插入圖片描述

1.調用過:遠程調用雖然不在依賴中心,但是可以通過。

2.沒調用過:相當于第一次發起遠程調用,不能通過。


五、配置中心實戰

1. 配置中心 - 基本使用

步驟:

  1. 添加依賴
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

? 2.配置Nacos地址

spring.application.name=service-product # 在Nacos中展示的模塊名稱
server.port=9000 # 項目啟動的默認端口號spring.cloud.nacos.server-addr=127.0.0.1:8848 # Nacos占用的端口號
spring.config.import=nacos:service-order.properties  # 導入Nacos中的配置

補充:

# nacos禁用導入檢查
spring.nacos.config.import-check.enabled=false  

2.1動態讀取配置
使用 @Value + @RefreshScope 實現動態刷新(在Nacos中更新,就會立即在項目中更新):

@RestController
@RefreshScope  // 支持配置熱更新
public class UserController {@Value("${app.maxRetry:3}")  // 默認值3private int maxRetry;
}

? 2.2批量綁定配置
使用 @ConfigurationProperties

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@ConfigurationProperties(prefix = "order")//配置批量綁定在nacos下,可以無需@RefreshScope注解就能實現自動刷新
@Component
@Data
public class OrderProperties {String timeout;String autoConfirm;
}

優點:

? 1.代碼更簡潔,使用的時候直接注入即可。

? 2.使用批量綁定配置,spring的底層會自動實現動態刷新,不用再加@RefreshScope注解。

3.在Nacos中配置數據集:

例如:service-order.properties

# Nacos中的配置service-order.properties
order.timeout=10min
order.auto-confirm=7d

4.如何在NacosConfigManager 監聽配置變化?

? 1、項目啟動就監聽配置文件變化
? 2、發生變化后拿到變化值
? 3、發送郵件

@EnableDiscoveryClient//開啟服務發現功能
@SpringBootApplication
public class OrderMainApplication {public static void main(String[] args) {SpringApplication.run(OrderMainApplication.class, args);}//1、項目啟動就監聽配置文件變化//2、發生變化后拿到變化值//3、發送郵件@BeanApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager){return (ApplicationArguments args )-> {ConfigService configService = nacosConfigManager.getConfigService();configService.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {@Overridepublic void receiveConfigInfo(String configInfo) {System.out.println("配置文件發生變化:"+configInfo);System.out.println("郵件通知");}@Overridepublic Executor getExecutor() {return Executors.newFixedThreadPool(4);}});System.out.println("啟動成功");};}
}

5.思考: Nacos中的數據集和application.properties 有相同的配置項,哪個生效?

答:Nacos中的數據集生效,因為在spring中導入優先級遵循:先導入優先,外部優先。


2. 配置中心 - 數據隔離

需求描述

? ? 項目有多套環境:dev,test,prod

? ? 每個微服務,同一種配置,在每套環境的值都不一樣。

	? 如:database.properties 

? ? 如:common.properties

? ? 項目可以通過切換環境,加載本環境的配置

? ? **難點 **

? ? 區分多套環境

? ? 區分多種微服務

? ? 區分多種配置

? ? 按需加載配置

1.在Nacos中 配置優先級

  • Namespace:區分環境(如 dev/test/prod)
  • Group:區分微服務(如product-service/order-service)
  • Data ID:具體配置文件(如 commom.properties)

示例:

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

  1. 在Nacos中創建配置

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

# 例在Nacos中創建配置:
Data ID: commom.properties
Group: order  
Namespace: dev
配置內容:order.timeout=1minorder.auto-confirm=1h

3.在項目中按需加載配置

spring:application:name: order-servicecloud:nacos:server-addr: 127.0.0.1:8848config:namespace: devconfig:import:- nacos:common.properties?group=order

三、總結

功能核心步驟擴展能力
注冊中心1. 引入依賴 2. 配置地址 3. 啟用 @EnableDiscoveryClient1. 服務實例查詢(DiscoveryClient) 2. 負載均衡調用(LoadBalancerClient+RestTemplate
配置中心1. 引入依賴 2. 配置地址+導入數據集 3. 使用 @Value+@RefreshScope實現綁定屬性以及動態刷新1. 多環境隔離(Namespace/Group/Data ID) 2. 批量綁定(@ConfigurationProperties

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

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

相關文章

安裝remixd,在VScode創建hardhat

在終端&#xff0c;以管理員身份&#xff0c;cmd 需要科學上網 npm install -g remix-project/remixd 在vscode插件中&#xff0c;安裝solidity插件&#xff0c;是暗灰色那款 1.將nodeJs的版本升級至18以上 2.在vscode打開一個新的文件&#xff0c;在終端輸入 npx hardhat 3.…

unity pico開發 四 物體交互 抓取 交互層級

文章目錄 手部設置物體交互物體抓取添加抓取抓取三種類型抓取點偏移抓取事件抓取時不讓物體吸附到手部 射線抓取交互層級 手部設置 為手部&#xff08;LeftHandController&#xff09;添加XRDirInteractor腳本 并添加一個球形碰撞盒&#xff0c;勾選isTrigger,調整大小為0.1 …

CyberRT(apollo) 定時器模塊簡述及bug分析

timer 模塊 timer的定義&#xff0c;cyberrt中timer模塊用于設置定時器任務&#xff0c;字面意思&#xff0c;設置設置定時周期及出發頻次&#xff08;周期 or oneshot)&#xff0c;到達指定時間時間觸發callback time wheel 時鐘節拍輪&#xff0c;常見的定時器設計&#x…

java八股文之消息中間件

1.RabbitMQ如何保證消息不丟失 開啟生產者確認機制&#xff0c;確保生產者的消息能到達隊列開啟持久化功能&#xff0c;確保消息未消費前在隊列中不會丟失&#xff08;交換機&#xff0c;隊列&#xff0c;消息都需要開啟持久化功能&#xff09;開啟消費者確認機制為auto,由spr…

Win7重裝不翻車!ISO鏡像安全下載渠道+BIOS設置避雷手冊

一、寫在前面&#xff1a;為什么你需要這份教程&#xff1f; 當電腦頻繁藍屏、系統崩潰甚至無法開機時&#xff0c;重裝系統可能是最后的救命稻草。但市面上的教程往往存在三大痛點&#xff1a; ?? 鏡像來源不明導致系統被植入后門 ?? 啟動盤制作失敗反復折騰 ?? 操作失…

大學至今的反思與總結

現在是2025年的3月5日&#xff0c;我大三下學期。 自大學伊始&#xff0c;我便以考研作為自己的目標&#xff0c;有時還會做自己考研上岸頭部985,211&#xff0c;offer如潮水般涌來的美夢。 但是我卻忽略了一點&#xff0c;即便我早早下定了決心去考研&#xff0c;但并沒有早…

SpringBoot 全局異常處理

文章目錄 異常處理全局異常處理(推薦)局部異常處理高級技巧設置返回狀態碼處理404異常異常處理 全局異常處理(推薦) 創建一個全局異常處理類,使用 @RestControllerAdvice 注解標記。 在方法上使用 @ExceptionHandler 聲明當前方法可處理的異常類型。當系統發生異常時,…

【四.RAG技術與應用】【11.阿里云百煉應用(上):RAG在云端的實踐】

一、為什么需要RAG?大模型的“知識困境”與破局之道 大模型雖然“博學”,但它的知識庫存在兩個致命短板: 缺乏私有知識:比如企業內部的產品手冊、客戶數據、行業報告等;知識更新滯后:大模型的訓練數據往往停留在某個時間點,無法實時獲取最新信息(比如今天的股票行情或…

使用wifi連接手機adb進行調試|不使用數據線adb調試手機|找應用錯誤日志和操作日志

手機在開發者選項里要開啟無線調試 在手機設置中查看WiFi的IP地址 設置 -> WLAN -> 已連接的WiFi -> IP地址 使用手機的IP地址連接 adb connect 192.168.1.12:xxxxx 檢查連接狀態 adb devices 斷開特定設備 adb disconnect 192.168.x.x:xxxxx 斷開所有設備 …

mapbox高階,結合threejs(threebox)添加三維球體

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??threebox Sphere靜態對象二、??使用t…

游戲引擎學習第140天

回顧并為今天的內容做準備 目前代碼的進展到了聲音混音的部分。昨天我詳細解釋了聲音的處理方式&#xff0c;聲音在技術上是一個非常特別的存在&#xff0c;但在游戲中進行聲音混音的需求其實相對簡單明了&#xff0c;所以今天的任務應該不會太具挑戰性。 今天我們會編寫一個…

golang并發編程如何學習

《掌握 Golang 并發編程的通關秘籍》 在當今的編程世界中&#xff0c;Golang 并發編程正以其獨特的魅力和強大的能力吸引著眾多開發者。然而&#xff0c;對于許多小伙伴來說&#xff0c;如何學好這門技術卻成了一個頭疼的問題。別擔心&#xff0c;今天就讓我來為大家揭開 Gola…

SpringMVC學習(controller層加載控制與(業務、功能)bean加載控制、Web容器初始化配置類)(3)

目錄 一、SpringMVC、Spring的bean加載控制。 &#xff08;1&#xff09;實際開發的包結構層次。 &#xff08;2&#xff09;如何"精準"控制兩個容器分別加載各自bean。(分析) <1>SpringMVC相關bean加載控制。(方法) <2>Spring相關bean加載控制。(方法) …

fastapi+mysql實現增刪改查

說明&#xff1a; 我計劃用python的fastapi框架&#xff0c;實現操作MySQL數據庫的表&#xff0c;實現增刪改查的操作&#xff0c;并且在postman里面測試 step1: 安裝數據庫依賴 pip install fastapi uvicorn pymysqlstep2:C:\Users\Administrator\PycharmProjects\FastAPIPro…

Linux系統之配置HAProxy負載均衡服務器

Linux系統之配置HAProxy負載均衡服務器 前言一、HAProxy介紹1.1 HAProxy簡介1.2 主要特點1.3 使用場景二、本次實踐介紹2.1 本次實踐簡介2.2 本次實踐環境規劃三、部署兩臺web服務器3.1 運行兩個Docker容器3.2 編輯測試文件3.3 訪問測試四、安裝HAProxy4.1 更新系統軟件源4.2 安…

CS144 Lab Checkpoint 2: the TCP receiver

Overview TCPReceiver 從對等的sender接收消息&#xff0c;使用 receive() 方法&#xff0c;然后調用 Reassembler() 方法&#xff0c;后者寫入 ByteStream 中 然后應用程序從 ByteSteam 中讀取。 同時&#xff0c;TCPReceiver 還會通過 send() 方法給sender發送消息&#xff…

Spring Boot 3.x 核心注解詳解與最佳實踐

Spring Boot 3.x 核心注解詳解與最佳實踐 前言 隨著Spring Boot 3.x的正式發布&#xff0c;這個基于Spring Framework 6的里程碑版本帶來了諸多新特性。本文將深入剖析Spring Boot 3.x的核心注解體系&#xff0c;結合代碼示例講解其作用及使用場景&#xff0c;助您快速掌握新…

PHP之常量

在你有別的編程語言的基礎下&#xff0c;你想學習PHP&#xff0c;可能要了解的一些關于常量的信息。 PHP中的常量不用指定數據類型&#xff0c;可以使用兩次方法定義。 使用const //定義常量 const B 2; echo B . PHP_EOL;使用define define("A", 1); echo A . P…

計算機網絡——子網掩碼

一、子網掩碼是什么&#xff1f;它長什么樣&#xff1f; 子網掩碼的定義 子網掩碼是一個32位的二進制數字&#xff0c;與IP地址“配對使用”&#xff0c;用于標識IP地址中哪部分屬于網絡地址&#xff0c;哪部分屬于主機地址。 示例&#xff1a;IP地址 192.168.1.10&#xff0c;…

Tomcat-web服務器介紹以及安裝部署

一、Tomcat簡介 Tomcat是Apache軟件基金會&#xff08;Apache Software Foundation&#xff09;的Jakarta 項目中的一個核心項目&#xff0c;由Apache、Sun和其他一些公司及個人共同開發而成。 Tomcat服務器是一個免費的開放源代碼的Web應用服務器&#xff0c;屬于輕量級應用…