目錄:
- nacos Config是什麼?
- 快速接入
- 多環境隔離
- namespace 概念
- 分組 Group
- 用戶端配置檔案類型設定
- 項目配置實踐
- 共享配置 & 多配置檔案
- 配置中心的高可用叢集
一. Nacos Config
是什麼?
一. Nacos Config
Nacos 提供用于存儲配置和其他中繼資料的 key/value 存儲,為分布式系統中的外部化配置提供伺服器端和用戶端支援。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 應用的外部屬性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,用戶端和伺服器上的概念與 Spring Environment 和 PropertySource 有着一緻的抽象,在特殊的 bootstrap 階段,配置被加載到 Spring 環境中。當應用程式通過部署管道從開發到測試再到生産時,您可以管理這些環境之間的配置,并確定應用程式具有遷移時需要運作的所有内容。
二. 快速接入
1. Nacos 服務端添加配置
先安裝好 Nacos Server ,然後啟動。
在 配置管理 - 配置清單 中添加一個配置。如下圖所示:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SM3cjMlJmZxIWMkNDMwQTOzQDZ3IWO2YTYiZTZyQjN48CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
編輯好之後點選釋出即可。
- Data ID : 一般為應用名稱,對應 Spring Boot 項目中的
參數spring.application.name
- Group : 組,一般用來區分項目,此處直接用預設的公共組,後續會詳細說明
- 配置格式: 一般預設為 Properties 格式,你可以根據自己的喜好去切換。
2. 用戶端使用
以 Spring Boot 項目為例。先添加依賴:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在
resource
檔案夾中建立配置檔案
bootstrap.yml
來配置 Nacos Server 相關的參數,如下所示:
spring:
application:
name: nacos-config-base
main:
allow-bean-definition-overriding: true
cloud:
nacos:
# 權限認證,nacos.core.auth.enabled=true 時需要添加
username: nacos
password: James2020+
config:
# nacos config 的開關
# enabled: false
prefix: nacos-config-base
file-extension: yaml
group: DEFAULT_GROUP
建立啟動類
NacosConfigBaseApplication
,代碼如下所示:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.concurrent.TimeUnit;
@SpringBootApplication
public class NacosConfigBaseApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigBaseApplication.class, args);
while (true) {
// 當動态配置重新整理時,會更新到 Enviroment 中,是以這裡每隔一秒中從 Enviroment 中擷取配置
String userName = applicationContext.getEnvironment().getProperty("base.name");
String userAge = applicationContext.getEnvironment().getProperty("base.age");
System.err.println("name :" + userName + "; age: " + userAge);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
上面的代碼是每隔一秒,擷取一次
base.name
與
base.age
參數并列印。
applicationContext.getEnvironment().getProperty("base.age");
這是擷取參數的一種方式。還可以用過注解來擷取。
将啟動類的代碼注釋掉,建立一個
TestController
類,添加如下代碼:
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;
@RefreshScope
@RestController
public class TestController {
@Value("${base.name}")
String name;
@Value("${base.age}")
String age;
@GetMapping("/name")
public String getName() {
return name;
}
@GetMapping("/age")
public String getAge() {
return age;
}
}
我們可以把 Nacos Config 中配置的參數,當成本地參數一樣,使用
@Value("${}")
注解來擷取。同時加上
@RefreshScope
注解以保證可以實時更新。
三.多環境隔離
日常開發中,我們常常會有開發環境,測試環境,預釋出環境,生産環境等等。為了更好的差別這些環境,且防止配置混亂。官方及我個人都非常推薦使用 namespace 進行環境隔離。
注:Nacos Config 支援 profile 粒度的環境區分,但個人不建議這麼使用。使用 namespace 做環境隔離更徹底更安全,也更易于管理。
1. namespace 概念
這裡引用官方的概念說明:
用于進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生産環境的資源(如配置、服務)隔離等。
namespace 建立
打開 Nacos 控制台,在 命名空間 中可以對其進行管理,如下圖所示。
要注意的是,在項目中如果要指定命名空間,是通過
命名空間ID
的,而不是通過名稱。
配置好了命名空間後,再打開配置清單,則可以在上方看到目前所有的命名空間。不同的命名空間可以允許存在相同 Data ID 的配置。
namespace 在代碼中的配置如下:
spring:
cloud:
nacos:
config:
# 這裡使用的是命名空間 ID
namespace: 904174a3-d51f-43ed-a456-c4fd7386ecb3
2. 自定義 Group
一般我們會使用 namespace 區分環境,使用 Group 來區分項目,使用 Data ID 區配置設定置。以此來管理多項目,多環境下的配置檔案。
Group 一般沒有指定的話,預設為 DEFAULT_GROUP 。如果需要自定義的話,在 Nacos 控制台,建立配置檔案的時候自定義即可。在代碼中寫法如下:
spring:
cloud:
nacos:
config:
group: SPRING_CLOUD_EXAMPLE_GROUP
3. 用戶端配置檔案類型設定
1.在bootstrap.properties檔案中
spring:
profiles:
active: dev #${spring.profile.active}
application:
name: consumer-user #${prefix}
cloud:
nacos:
config:
server-addr: localhost:80
file-extension: yaml #${file-extension}
注意:
spring.cloud.nacos.config.file-extension=properties,yml,yaml
屬性聲明從配置中心中讀取的配置檔案格式
該配置的預設值為properties,即預設是讀取properties格式的配置檔案。當用戶端沒有配置該屬性,并且在nacos server添加的是yml格式的配置檔案,則給用戶端會讀取不到配置檔案,導緻啟動失敗。
非properties配置格式,必須添加如下配置才可生效
spring.cloud.nacos.config.file-extension=yml
2. 在Nacos管理中心添加配置,根據profile設定不同的環境配置
把application.yml的配置移動到nacos中
springboot中我們可以通過配置spring.profiles.active 實作在開發、測試、生産環境下采用不同的配置檔案
同樣,我們同科可以在nacos server分别建立
${application.name}-dev.properties
${application.name}-test.properties
${application.name}-prod.properties
然後通過指令啟動jar時 設定spring.profiles.active來實作不同環境下使用不同的配置檔案。
java -jar nacos-client-0.0.1-SNAPSHOT.jar --spring.profiles.active=test
同樣也适用于yml/yaml檔案,隻是用戶端設定spring.cloud.nacos.config.file-extension=yaml具體可見上一個說明
DataId格式為
${prefix}-${spring.profile.active}.${file-extension}
4. 項目配置實踐
在項目實際配置中,個人建議如下按照如下方式進行配置。
首先,配置檔案要按照如下方式建立:
- bootstrap.yml : 基礎配置,配置 Nacos Config 的基礎配置
- application.yml : 存儲一些不需要放在 Nacos Config 的配置
- bootstrap-dev.yml : 環境參數,開發環境
- bootstrap-test.yml : 環境參數,測試環境
- bootstrap-prod.yml : 環境參數,線上環境
配置内容分别如下:
bootstrap-dev.yml
nacos:
server-addr: 127.0.0.1:8848
username: username
password: password
# 開發環境的 namespace ID
namespace: 904174a3-d51f-43ed-a456-c4fd7386ecb3
bootstrap-test.yml
nacos:
server-addr: 192.168.9.10:8848
username: username
password: password
# 測試環境的 namespace ID
namespace: a463038a-525b-4ad0-988e-ec71ff043c22
bootstrap-prod.yml
nacos:
server-addr: 100.100.10.1:8848
username: username
password: password
# 生産環境的 namespace ID
namespace: 0d84f533-74ca-4ca5-9dd8-01e8866cd0c4
bootstrap.yml
spring:
profiles:
active: dev
application:
name: nacos-config-advanced
main:
allow-bean-definition-overriding: true
cloud:
nacos:
# 權限認證,nacos.core.auth.enabled=true 時需要添加
username: ${nacos.username}
password: ${nacos.password}
config:
server-addr: ${nacos.server-addr}
namespace: ${nacos.namespace}
prefix: nacos-config-base
file-extension: yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
共享配置 & 多配置檔案
日常開發中,多個子產品可能會有很多共用的配置,比如資料庫連接配接資訊,Redis 連接配接資訊,RabbitMQ 連接配接資訊,監控配置等等。
那麼此時,我們就希望可以加載多個配置,多個項目共享同一個配置之類等功能。Nacos Config 也确實支援。
我們可以使用
spring.cloud.nacos.config.shared-configs
和
spring.cloud.nacos.config.extension-configs
兩個參數節點來配置。
配置執行個體如下:
spring:
application:
name: nacos-config-multi
main:
allow-bean-definition-overriding: true
cloud:
nacos:
username: ${nacos.username}
password: ${nacos.password}
config:
server-addr: ${nacos.server-addr}
namespace: ${nacos.namespace}
# 用于共享的配置檔案
shared-configs:
- data-id: common-mysql.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
- data-id: common-redis.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
- data-id: common-base.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
# 正常配置檔案
# 優先級大于 shared-configs,在 shared-configs 之後加載
extension-configs:
- data-id: nacos-config-advanced.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
refresh: true
- data-id: nacos-config-base.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
refresh: true
參數解析:
- data-id : Data Id
- group:自定義 Data Id 所在的組,不明确配置的話,預設是 DEFAULT_GROUP。
- refresh: 控制該 Data Id 在配置變更時,是否支援應用中可動态重新整理, 感覺到最新的配置值。預設是不支援的。
這裡的Data ID 需要注意,後面是加字尾的,且不需要指定
.yaml
。這個有一個小坑,那就是在 Nacos 控制台添加配置檔案時,Data ID 的命名就要是
file-extension
這種帶字尾的。且字尾名要和配置類型想比對,否則将會讀取不到配置。
common-mysql.yaml
具體配置如下圖所示,可與之前章節的配置對比下,之前章節的 Data ID 是沒有帶字尾的。
關于多配置檔案的優先級問題:
- 後加載的優先級高;
- extension-configs 優先級大于 shared-configs,因為在 shared-configs 之後加載
- shared-configs 與 extension-configs 的配置清單中,在下面的配置優先級高。
四. nacos server的叢集部署
叢集部署架構圖
官方的推薦部署架構圖:
推薦使用者把所有服務清單放到一個vip(虛拟IP,主機當機後可以自動漂移到備用機器上)下面,然後挂到一個域名下面
http://ip1:port/openAPI 直連ip模式,機器挂則需要修改ip才可以使用。
http://VIP:port/openAPI 挂載VIP模式,直連vip即可,下面挂server真實ip,可讀性不好。
http://nacos.com:port/openAPI 域名+VIP模式,可讀性好,而且換ip友善,推薦模式
具體操作實踐
注:目前器群模式下不采用mysql作為配置檔案的存儲方式,是以需要先配置為采用mysql資料源模式,我在上nacos1.4.1安裝 中已經說明了,這裡不再介紹,直接配置叢集。
步驟如下:
1.conf檔案夾下的檔案如下圖所示,其中下載下傳的壓縮包解壓出來是沒有cluster.conf的,通過複制cluster.conf-example并修改檔案名得來。
修改cluster.conf,将部署nacos server的三台伺服器ip位址寫上即可
三台伺服器cluster.conf檔案相同,都是協商這三個IP位址即可
#it is ip
#example
114.116.137.***
132.232.159.***
47.107.122.***
2.分别啟動三台nacos server
修改用戶端,在用戶端的bootstrap.properties檔案中修改server的IP位址
注:修改成自己的三台伺服器ip位址,用逗号分隔
spring.cloud.nacos.config.server-addr=114.116.137.***:8848,132.232.159.***:8848,47.107.122.***:8848
``
3.啟動用戶端 發現可以正常啟動