大家好,我是小悟。
Nacos 是什麼?讓我們用外賣來理解!
假如你是個吃貨(程序員),在美食廣場(微服務架構)裏:
沒有 Nacos 的情況:
- "老闆,紅燒肉在哪家店?" "不知道"
- "奶茶店電話多少?" "我找找小紙條..."
- "這家店搬走了?怎麼不告訴我!"
有了 Nacos 的情況:
- Nacos 就像美食廣場的智能大屏幕 + 廣播系統
- 所有店鋪(服務)自動登記:"我是賣奶茶的,位置在A區3號"
- 想喝奶茶?看屏幕(服務發現)直接去
- 店鋪打烊?自動廣播(服務下線)通知大家
- 還能告訴你:"今天奶茶半價!"(配置管理)
簡單説,Nacos = 服務註冊中心 + 配置中心,微服務的"居委會大媽"——啥都知道,啥都管!
整合步驟:讓我們開始"組裝"吧!
第1步:先來點"開胃菜"——環境準備
# 1. 安裝Nacos(比泡麪還簡單)
# 下載地址:https://github.com/alibaba/nacos/releases
# 解壓後,單機模式啓動:
sh nacos/bin/startup.sh -m standalone # Linux/Mac
cmd nacos/bin/startup.cmd -m standalone # Windows
# 訪問 http://localhost:8848/nacos
# 賬號/密碼:nacos/nacos
# 看到登錄頁面?恭喜!Nacos啓動成功!
第2步:創建SpringBoot項目(我們的"美食攤位")
<!-- pom.xml 添加這些依賴(我們的"食材清單")-->
<dependencies>
<!-- SpringBoot基礎套餐 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos服務發現(找店鋪功能) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.5.0</version>
</dependency>
<!-- Nacos配置中心(看菜單功能) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.0.5.0</version>
</dependency>
<!-- 健康檢查(看看攤位還營業嗎) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
第3步:配置文件(我們的"攤位裝修方案")
# bootstrap.yml(優先級高,先加載)
# 這個文件專門用來和Nacos"打招呼"
spring:
application:
name: foodie-service # 給服務起個名,我是"吃貨服務"
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos居委會地址
group: DEFAULT_GROUP # 默認分組(就像"中餐區")
namespace: public # 命名空間("美食廣場一樓")
ephemeral: true # 臨時實例(擺攤的,隨時可能收攤)
config:
server-addr: localhost:8848 # 配置中心也找同一個Nacos
file-extension: yaml # 配置格式用yaml(菜單用中文寫)
group: DEFAULT_GROUP
namespace: public
refresh-enabled: true # 動態刷新(菜單改了馬上知道)
config:
import:
- optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
# 這句話意思是:"Nacos大媽,我要讀取我的配置文件!"
# application.yml(常規配置)
server:
port: 8080 # 我的攤位在8080號位置
management:
endpoints:
web:
exposure:
include: "*" # 暴露健康檢查端點(告訴大家我還活着)
第4步:主啓動類("攤位開張儀式")
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient // 開啓服務發現(舉起牌子:"我開張啦!")
public class FoodieApplication {
public static void main(String[] args) {
SpringApplication.run(FoodieApplication.class, args);
System.out.println("""
吃貨服務啓動成功!
攤位號:8080
已向Nacos居委會登記
開始營業!
""");
}
}
第5步:寫個Controller("製作美食")
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
@RestController
@RefreshScope // 這個註解讓配置動態刷新(菜單改了立即生效)
public class FoodController {
@Value("${food.special:紅燒肉}") // 默認值紅燒肉
private String specialFood;
@Value("${food.price:25}")
private Integer price;
@PostConstruct
public void init() {
System.out.println("今日特價:" + specialFood + ",僅售" + price + "元!");
}
@GetMapping("/order")
public String order() {
return String.format("""
訂單詳情:
菜品:%s
價格:%d元
製作中...請稍候!
(本消息來自服務:%s)
""", specialFood, price, "吃貨服務");
}
@GetMapping("/health")
public String health() {
return "本攤位營業中,歡迎光臨!";
}
}
第6步:在Nacos添加配置("製作菜單")
- 訪問 http://localhost:8848/nacos
- 進入 配置管理 → 配置列表
- 點擊 + 新建配置:
Data ID: foodie-service.yaml # 必須和bootstrap.yml裏的一致
Group: DEFAULT_GROUP
配置格式: YAML
配置內容:
food:
special: "麻辣小龍蝦" # 今日特價菜
price: 88 # 特價
discount: "8折" # 折扣信息
spring:
profiles:
active: dev # 環境配置
第7步:測試一下("顧客點單")
# 1. 啓動SpringBoot應用
# 2. 查看Nacos控制枱 - 服務管理 - 服務列表
# 應該能看到 foodie-service,狀態為"健康"
# 3. 訪問測試:
curl http://localhost:8080/order
# 輸出應該顯示"麻辣小龍蝦",價格88元
# 而不是默認的紅燒肉25元!
# 4. 動態刷新測試:
# 去Nacos修改配置,把price改成66
# 不用重啓服務,直接再次訪問:
curl http://localhost:8080/order
# 價格已經變成66了!神奇吧?
第8步:服務發現("找其他攤位")
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class FindRestaurantController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/find/drinks")
public String findDrinkShop() {
// 發現所有服務
List<String> services = discoveryClient.getServices();
// 過濾出飲料相關的服務(實際項目會用更復雜的邏輯)
List<ServiceInstance> instances = discoveryClient.getInstances("drink-service");
if (!instances.isEmpty()) {
String url = instances.get(0).getUri() + "/menu";
return new RestTemplate().getForObject(url, String.class);
}
return "沒有找到飲料店,Nacos居委會也不知道在哪";
}
}
高級玩法
多環境配置("分樓層經營")
# Nacos中可以創建不同命名空間
# 1. 命名空間管理 → 新建命名空間
# dev: 開發環境(一樓試營業)
# test: 測試環境(二樓內測)
# prod: 生產環境(三樓正式營業)
# bootstrap.yml 切換環境:
spring:
cloud:
nacos:
config:
namespace: dev-id # 填Nacos生成的命名空間ID
配置共享("通用調料配方")
# 在Nacos創建 Data ID: common.yaml
# 所有服務都可以讀取這個公共配置
# 服務配置裏可以這樣用:
spring:
cloud:
nacos:
config:
shared-configs:
- data-id: common.yaml
group: DEFAULT_GROUP
refresh: true
總結:Nacos帶給我們的"美食體驗"
優點("為什麼選擇這個美食廣場"):
- 一站式服務:服務註冊、配置管理、服務發現全搞定,不用東奔西跑
- 動態刷新:改配置不用重啓服務,就像換菜單不用關店
- 健康檢查:自動剔除"不營業的攤位",保證你總能吃到新鮮熱乎的
- 多環境支持:開發、測試、生產環境完美隔離,不會把"試吃品"端給顧客
- 易於使用:控制枱友好,API豐富,中文文檔齊全(阿里出品,必屬精品)
注意事項("經營須知"):
- 網絡穩定:Nacos掛了,服務就"失聯"了,確保高可用部署
- 權限管理:生產環境一定要配置權限,別讓路人隨便改"菜單"
- 配置規範:命名規範要統一,不然找配置像"海底撈針"
- 版本兼容:SpringCloud Alibaba版本要和SpringBoot版本匹配,不然會"食物相剋"
最後:
問:為什麼程序員喜歡用Nacos? 答:因為他們再也不用在代碼裏寫死配置了,現在可以理直氣壯地説:"這個配置Nacos管,我不知道!"
問:Nacos和Eureka有什麼區別? 答:Eureka像老式電話本,Nacos像智能手機通訊錄——還能視頻通話(動態刷新)!
🏁 建議
SpringBoot整合Nacos就像給大排檔裝上智能點餐系統:
- 簡單:幾行配置就搞定
- 強大:功能豐富,滿足各種需求
- 穩定:經過阿里大規模生產驗證
- 活躍:社區活躍,更新及時
現在可以試試,讓你的微服務像外賣一樣:隨時點單,準時送達,還能實時跟蹤進度!
好的架構師就像好的廚師:不僅要會做菜,還要懂得如何高效管理廚房!Nacos就是你的"智能廚房管理系統"!
謝謝你看我的文章,既然看到這裏了,如果覺得不錯,隨手點個贊、轉發、在看三連吧,感謝感謝。那我們,下次再見。
您的一鍵三連,是我更新的最大動力,謝謝
山水有相逢,來日皆可期,謝謝閲讀,我們再會
我手中的金箍棒,上能通天,下能探海