📢 本文由 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].yaml 不包含環境資訊,可以被多個環境共享
設定優先順序:[spring.application.name]-[spring.profiles.active].yaml > [spring.application.name].yaml > 本地設定