Nacos 註冊中心

📢 本文由 gemini-3-flash-preview 翻譯

需先安裝軟體,官網: https://nacos.io/zh-cn/

conf/application.properties 檔案中可以更改連接埠,預設為 8848

註冊服務

父專案中新增管理相依性

1
2
3
4
5
6
7
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

註解掉 Eureka 的相依性,並新增 Nacos 用戶端的相依性

1
2
3
4
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

修改 application.yml,新增 Nacos 位址,註解掉 Eureka 位址

1
2
3
4
spring:
  cloud:
    nacos:
      server-addr: localhost:8848

啟動 Nacos

1
2
startup.cmd -m standalone
# 參數為單機啟動

存取 http://localhost:8848/nacos/ 登入帳號密碼皆為 nacos

分級儲存模型

服務分為多個叢集,每個叢集有多個實例,叢集可以按地區分配,以提高存取速度

相對的,Eureka 只有 服務-實例,沒有叢集

服務呼叫應盡可能選擇本地叢集的服務,跨叢集呼叫延遲較高。當本地叢集不可存取時,再去存取其他叢集

可以透過 application.yml 設定叢集

1
2
3
4
5
6
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: Shanghai # 叢集名稱

然後將 Ribbon 的策略設定為 Nacos 的策略

1
2
3
4
5
# 為某個微服務設定負載平衡規則,這裡是以 userService 服務為例
userService:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.Nac # 負載平衡規則

接著可以在 Nacos 設定實例的權重 (0-1),權重越大,存取頻率越高

環境隔離

Nacos 中服務儲存和資料儲存的最外層都是一個名為 namespace 的東西,用來做最外層隔離

可以在 Nacos 中新建一個命名空間,例如 dev,然後修改 application.yml

1
2
3
4
5
6
7
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: Shanghai # 叢集名稱
        namespace: UUID # 此處為命名空間的 UUID

不同 namespace 下的服務互相不可見,無法存取

臨時實例與非臨時實例

對於臨時實例,Nacos 的處理方式與 Eukera 一致

對於非臨時實例,Nacos 會主動詢問是否存活,服務不可用時不會刪除,在服務不可用時,Nacos 會主動通知消費者

設定非臨時實例:

1
2
3
4
5
spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 設定為非臨時實例

Nacos 設定管理

當微服務部署的實例變多時,逐個更改設定非常麻煩,可以使用 Nacos 將設定集中管理,並且支援熱更新

簡單使用

在 Nacos 控制台的設定管理中新增設定,其中 Data ID 為設定檔的 ID,格式為 [服務名稱]-[profile].[副檔名],例如 userService-dev.yaml

然後在設定內容中撰寫設定即可,例如:

1
2
pattern: 
  dateformat: yyyy-MM-dd HH:mm:ss

引入 Nacos 的設定管理用戶端相依性

1
2
3
4
5
<!--nacos 設定管理相依性-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

取得設定的步驟

專案啟動 -> bootstrap.yml -> Nacos 設定檔 -> 本地 application.yml -> 建立 Spring 容器 -> 載入 bean

新增 bootstrap.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
spring:
  application:
    name: userService # 服務名稱
  profiles:
    active: dev # 開發環境,這裡設定為 dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos 位址
      config:
        file-extension: yaml # 檔案副檔名

測試

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@RestController
@RequestMapping("/user")
public class UserController{
    
    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("/now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat))
    }
}

存取頁面查看效果

熱更新

可以透過兩種方式實現

方式一:在 @Value 注入的變數所在類別上加上註解 @RefreshScope

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
@RefreshScope // 設定自動刷新
@RestController
@RequestMapping("/user")
public class UserController{
    
    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("/now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat))
    }
}

方式二:使用 @ConfigurationProperties

新建設定類別

1
2
3
4
5
6
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

Controller 類別

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// @RefreshScope // 設定自動刷新
@RestController
@RequestMapping("/user")
public class UserController{
    
    // @Value("${pattern.dateformat}")
    // private String dateformat;
    
    @Autowired
    private PatternProperties properties;
    
    @GetMapping("/now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()))
    }
}

設定共享

微服務啟動時,會從 Nacos 讀取多個設定檔

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userService-dev.yaml

  • [spring.application.name].yaml,例如:userService.yaml

而第二個 [spring.application.name].yaml 不包含環境資訊,可以被多個環境共享

設定優先順序:[spring.application.name]-[spring.profiles.active].yaml > [spring.application.name].yaml > 本地設定

This post is licensed under CC BY-NC-SA 4.0 by the author.
最後更新 2025-02-05 17:37 +0900