大家好,我是小悟。


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添加配置("製作菜單")

  1. 訪問 http://localhost:8848/nacos
  2. 進入 配置管理 → 配置列表
  3. 點擊 + 新建配置:
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帶給我們的"美食體驗"

優點("為什麼選擇這個美食廣場"):

  1. 一站式服務:服務註冊、配置管理、服務發現全搞定,不用東奔西跑
  2. 動態刷新:改配置不用重啓服務,就像換菜單不用關店
  3. 健康檢查:自動剔除"不營業的攤位",保證你總能吃到新鮮熱乎的
  4. 多環境支持:開發、測試、生產環境完美隔離,不會把"試吃品"端給顧客
  5. 易於使用:控制枱友好,API豐富,中文文檔齊全(阿里出品,必屬精品)

注意事項("經營須知"):

  1. 網絡穩定:Nacos掛了,服務就"失聯"了,確保高可用部署
  2. 權限管理:生產環境一定要配置權限,別讓路人隨便改"菜單"
  3. 配置規範:命名規範要統一,不然找配置像"海底撈針"
  4. 版本兼容:SpringCloud Alibaba版本要和SpringBoot版本匹配,不然會"食物相剋"

最後:

問:為什麼程序員喜歡用Nacos? 答:因為他們再也不用在代碼裏寫死配置了,現在可以理直氣壯地説:"這個配置Nacos管,我不知道!"

問:Nacos和Eureka有什麼區別? 答:Eureka像老式電話本,Nacos像智能手機通訊錄——還能視頻通話(動態刷新)!

🏁 建議

SpringBoot整合Nacos就像給大排檔裝上智能點餐系統:

  • 簡單:幾行配置就搞定
  • 強大:功能豐富,滿足各種需求
  • 穩定:經過阿里大規模生產驗證
  • 活躍:社區活躍,更新及時

現在可以試試,讓你的微服務像外賣一樣:隨時點單,準時送達,還能實時跟蹤進度!

好的架構師就像好的廚師:不僅要會做菜,還要懂得如何高效管理廚房!Nacos就是你的"智能廚房管理系統"!

SpringBoot 整合 Nacos,讓微服務像外賣點單一樣簡單_Nacos

謝謝你看我的文章,既然看到這裏了,如果覺得不錯,隨手點個贊、轉發、在看三連吧,感謝感謝。那我們,下次再見。

您的一鍵三連,是我更新的最大動力,謝謝

山水有相逢,來日皆可期,謝謝閲讀,我們再會

我手中的金箍棒,上能通天,下能探海