Nacos 核心功能實戰筆記
一、Nacos 簡介
1. 是什么?
- 全稱:Nacos = Naming and Configuration Service
- 定位:阿里巴巴開源的 動態服務發現、配置管理、服務管理平臺
- 核心功能:服務注冊與發現 + 統一配置管理 + 服務健康監測
- 適用場景:微服務架構、云原生應用(如 Spring Cloud、Dubbo)
2. 同類產品對比
產品 | 主要功能 | 優勢 | 局限性 | 典型場景 |
---|---|---|---|---|
Nacos | 服務發現 + 配置管理 | 功能全面,支持動態配置、AP/CP模式切換 | 學習成本略高 | 需要統一管理服務與配置的場景 |
Eureka | 服務發現 | 簡單輕量,AP模型保證高可用 | 無配置管理功能,已停止維護 | 純服務發現場景 |
Consul | 服務發現 + 配置管理 + 健康檢查 | 支持多數據中心,安全性強 | 配置管理功能較弱 | 復雜分布式系統 |
Zookeeper | 服務發現 + 分布式協調 | 強一致性(CP模型) | 配置管理需自行實現,運維復雜 | 強一致性要求的場景 |
二、Nacos 核心功能詳解
1. 服務注冊與發現
-
工作原理:
- 服務啟動時向Nacos注冊自己的元數據(IP、端口、健康狀態)
- 消費者通過Nacos查詢可用服務實例列表
- 內置心跳機制自動剔除故障節點
-
示例場景:
// 訂單服務注冊到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. 典型應用場景
- 微服務架構:統一管理上百個服務的注冊與配置
- 配置灰度發布:只對部分服務實例推送新配置
- 多環境管理:通過Namespace快速切換開發/測試/生產環境
- 服務熔斷:結合Sentinel實現流量控制
附:快速命令備忘
# 啟動Nacos服務器(單機模式)
startup.sh -m standalone
四、注冊中心實戰
遠程調用 - 基本流程
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. 配置中心 - 基本使用
步驟:
- 添加依賴
<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)
示例:
- 在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. 啟用 @EnableDiscoveryClient | 1. 服務實例查詢(DiscoveryClient ) 2. 負載均衡調用(LoadBalancerClient +RestTemplate ) |
配置中心 | 1. 引入依賴 2. 配置地址+導入數據集 3. 使用 @Value +@RefreshScope 實現綁定屬性以及動態刷新 | 1. 多環境隔離(Namespace/Group/Data ID) 2. 批量綁定(@ConfigurationProperties ) |