一、背景介紹
Nacos 作為服務注冊中心的使用方式,同時 Nacos 還可以作為服務配置中心,用于集中式維護各個業務微服務的配置資源。
作為服務配置中心的交互流程圖如下。
這樣設計的目的,有一個明顯的好處就是:有利于對各個微服務的配置資源進行統一維護和管理,尤其是要更新某個配置參數時,能避免大量人肉運維工作。
今天通過一些案例我們一起來了解一下,如何使用 Nacos 來實現服務配置中心的管理。
二、方案實踐
2.1、創建配置
Nacos 安裝過程與之前介紹的一樣,Nacos 服務端啟動后,進入到服務端管理頁面,在“配置列表”功能頁面中,點擊右上角的“+”按鈕,進入“新建配置”頁面,創建配置內容,示例如下:
為了便于演示,在上文中我們創建了一個 dataId 為nacos-config-client.properties
,Group 為DEFAULT_GROUP
,內容為blog.name=張三
的配置信息。
在下文中,我們將會用到它。
2.2、創建客戶端應用
首先,創建一個 Maven 工程,命名為nacos-config-client
,并在pom.xml
中引入相關的依賴內容,示例如下:
<properties><spring-boot.version>2.2.5.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.SR3</spring-cloud.version><spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties><dependencies><!-- SpringBoot web --><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-config</artifactId></dependency>
</dependencies><dependencyManagement><dependencies><!-- 引入 springBoot 版本號 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- 引入 spring cloud 版本號 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- 引入 spring cloud alibaba 適配的版本號 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
接著,創建一個服務啟動類。
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}
然后,創建一個 web 接口,以便測試上文創建的配置變量是否能生效。
@RestController
@RefreshScope
public class HelloController {@Value("${blog.name}")private String name;@RequestMapping("/hello")public String hello() {return name;}
}
最后,在application.properties
配置文件中,添加 Nacos 服務配置中心地址,示例如下:
spring.application.name=nacos-config-client
server.port=9012# 設置Nacos配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
2.3、服務測試
將nacos-config-client
客戶端服務啟動起來,在瀏覽器中訪問http://127.0.0.1:9012/hello
,如果不出意外的話,會返回如下結果。
此時說明 SpringBoot 已成功從 Nacos 服務端獲取到相關的配置變量。
下面我們在 Nacos 中將blog.name
配置內容稍微修改一下,驗證一下客戶端的配置變量是否能動態刷新。
再次訪問http://127.0.0.1:9012/hello
,返回結果如下圖。
說明在 Nacos 中修改配置變量后,SpringBoot 也會自動刷新這個配置信息。
之所以能實現這種效果,主要得益于@RefreshScope
注解,它可以動態的從 Nacos 服務端獲取最新的配置信息,并將其注入到 SpringBoot 中。
三、配置規則介紹
在上文中,我們簡單的介紹了 Nacos 作為配置中心的使用方式。
例子中我們只配置了 Nacos 的配置中心地址信息,并沒有配置任何其他規則就能成功的使用 Nacos 配置中心,它是如何做到的呢?
在 Nacos Spring Cloud 中有 5 個核心配置項,下面我們一起來看看它的作用。
spring.cloud.nacos.config.server-addr
:對應 Nacos 服務端地址spring.cloud.nacos.config.prefix
:對應 DataId 的前綴,默認值為應用名稱,即spring.application.name
變量值spring.cloud.nacos.config.file-extension
:對應 DataId 的后綴,同時也是配置內容的文件格式,默認值為properties
spring.cloud.nacos.config.group
:對應 Group 參數,默認值為DEFAULT_GROUP
spring.cloud.nacos.config.namespace
:對應配置的命名空間,默認為空;常用于不同環境的配置隔離,如開發測試環境和生產環境的資源隔離等
默認情況下,Nacos Spring Cloud 加載出來的 dataId 完整格式如下:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
因此,在不做任何配置項目的情況下,當 DataId 的前綴和 Spring Boot 應用名稱一致,就可以成功加載對應的配置項。
如果我們不想通過應用服務名稱來加載 DataId,可以借助spring.cloud.nacos.config.prefix
相關規則來實現指定配置項的加載。
需要特別注意的是:由于 Spring Boot 加載順序的緣故,自定義的配置項參數必須放在bootstrap.properties
文件或者bootstrap.yaml
文件中才能生效。
下面我們還是通過一個例子,來快速了解 Nacos Spring Cloud 相關配置規則的應用。
3.1、應用實踐
下面我們以加載myConfig-dev.yaml
配置項為例,具體實現如下。
首先,創建一個myConfig-dev
配置項。
接著,創建一個bootstrap.properties
文件,并指定相關配置項,內容如下:
spring.application.name=nacos-config-client
server.port=9012# 指定運行環境
spring.profiles.active=dev# 設置Nacos配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 對應 DataId 的前綴,如果不設置默認取【spring.application.name】
spring.cloud.nacos.config.prefix=myConfig
# 對應 DataId 的后綴,同時也是配置內容的文件格式,默認值為properties
spring.cloud.nacos.config.file-extension=yaml
# 對應 Group 參數,默認值為DEFAULT_GROUP
spring.cloud.nacos.config.group=DEFAULT_GROUP
# 對應配置的命名空間,默認為空
spring.cloud.nacos.config.namespace=
然后,創建一個 web 接口,以便驗證配置變量是否能生效。
@RestController
@RefreshScope
public class HelloController {@Value("${user.id}")private String id;@Value("${user.name}")private String name;@RequestMapping("/test")public String test() {return "id" + id + ",name:" + name;}
}
最后,再次啟動服務,在瀏覽器中訪問http://127.0.0.1:9012/hello
,如果不出意外的話,會返回如下內容。
說明,Spring Boot 已成功加載了指定配置項。
四、高級特性介紹
4.1、多環境配置介紹
在 Nacos 服務端,其實還隱含有三個核心的參數,分別是:Data ID
、Group
、Namespace
,我們可以利用它來實現更高級的功能。
這三個參數的層級關系,可以用如下圖來概括。
每個參數的作用如下:
Namespace
:表示命名空間,通常用于不同環境的配置隔離,如開發測試環境和生產環境的資源隔離等Group
:表示分組管理Data ID
:也就是我們常說的配置項,也可以簡單理解為我們所說的配置文件
實際上,我們可以利用這些層級概念的關系,根據自己的需要來實現多環境的管理。
下面我們一起來看看,幾種常見的環境隔離配置實現。
4.1.1、profiles 隔離實現
在上文中我們也提到了 dataId 完整格式生成規則。
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
因此,我們可以借助spring.profiles.active
來實現配置資源的隔離。
同時,profiles 隔離實現也在一種最常見的做法。
4.1.2、Group 隔離實現
Group 隔離實現就比較簡單了,在 Nacos 服務管理平臺新建配置的時候,填寫所屬分組。
最后,在客戶端應用下填寫對應的 Group 參數即可。
# 對應 Group 參數
spring.cloud.nacos.config.group=DEFAULT_GROUP
4.1.3、Namespace 隔離實現
Namespace 隔離實現主要通過命名空間來完成,在 Nacos 服務管理平臺的命令空間下創建。
創建完成之后,在配置列表的最上方可以看到除了 public 之外,多了一個剛才創建的 Namepsace。
點擊test
就可以切換到對應的命名空間,然后新建相關的配置項。
最后,在客戶端應用下填寫對應的 Namespace 參數即可。
# 對應配置的命名空間
spring.cloud.nacos.config.namespace=0c85c5cf-4421-4839-9998-ace7d8ecf5a8
需要注意的是,這里填寫不是命名空間的名稱,而是命名空間ID。
4.2、多文件加載介紹
在上文中我們介紹的都是單個配置文件的加載,而在實際的業務開發中,我們常常會碰到多個配置文件一起加載的場景,例如加載 Redis、RabbitMQ 等配置資源。
下面我們一起來看看相關的實現方式。
4.2.1、多個配置加載介紹
對于多個配置的加載,我們只需要做以下兩步,就可以實現這個需求。
第一步:在 Nacos 中創建Data ID=redis.properties
和Data ID=rabbitmq.properties
的配置內容。
第二步:在 Spring Cloud 應用bootstrap.properties
文件中,通過spring.cloud.nacos.config.extension-configs
參數配置需要加載的文件,具體如下。
# 設置多文件加載,并支持動態刷新
spring.cloud.nacos.config.extension-configs[0].data-id=redis.properties
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=rabbitmq.properties
spring.cloud.nacos.config.extension-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[1].refresh=true
當服務啟動的時候,Nacos 客戶端會自動從服務端獲取相關的配置資源加載到 Spring Boot 應用中。
4.2.2、共享配置加載介紹
通過上面加載多個配置文件的例子,我們已經可以實現不同的應用共享配置的需求了。
對于共享配置使用,Nacos 還提供了另一種更便捷的配置方式,比如下面的配置與上面使用的多文件加載配置,作用是等價的。
# 設置多個共享配置文件加載,并支持動態刷新
spring.cloud.nacos.config.shared-configs[0].data-id=redis.properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true
spring.cloud.nacos.config.shared-configs[1].data-id=rabbitmq.properties
spring.cloud.nacos.config.shared-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[1].refresh=true
4.2.3、配置加載的優先級介紹
當我們加載多個配置的時候,如果存在相同的 key,配置加載的優先級是怎樣的呢?
Nacos Config 目前提供了三種配置能力從 Nacos 拉取相關的配置,分別如下:
- A:通過
spring.cloud.nacos.config.shared-dataids
定義的共享配置 - B:通過
spring.cloud.nacos.config.ext-config[n].data-id
定義的擴展配置 - C:通過內部相關規則(
應用名、應用名+ Profile
)生成的配置
當三種方式同時存在的時候,他們的優先級關系為A < B < C
,也就是說優先級高的會覆蓋優先級底的配置。
五、小結
最后總結一下,Nacos 是 Spring Cloud Alibaba 體系中最重要的組件之一,既可以用于服務注冊中心,也可以用于服務配置中心。在微服務技術體系中,應用非常廣泛,因此掌握 Nacos 相關技術的使用,對我們項目的開發會有顯著的幫助。
六、實戰
1. 安裝與啟動 Nacos
下載 Nacos
從 Nacos 的 GitHub 倉庫(https://github.com/alibaba/nacos/releases)下載適合你系統的版本,解壓下載好的壓縮包。
啟動 Nacos
- Windows 系統:打開命令提示符,進入 Nacos 的
bin
目錄,執行以下命令啟動 Nacos:
startup.cmd -m standalone
- Linux/Mac 系統:打開終端,進入 Nacos 的
bin
目錄,執行以下命令啟動 Nacos:
?
這里的 -m standalone
表示以單機模式啟動。啟動成功后,在瀏覽器中訪問 http://localhost:8848/nacos
,使用默認用戶名 nacos
和密碼 nacos
登錄 Nacos 控制臺。
2. 創建配置
登錄 Nacos 控制臺
打開瀏覽器,訪問 http://localhost:8848/nacos
,輸入用戶名 nacos
和密碼 nacos
登錄。
創建配置文件
在控制臺左側導航欄中選擇 “配置管理” -> “配置列表”,點擊 “+” 號創建新的配置。填寫以下信息
?
- Data ID:配置文件的唯一標識,通常采用
應用名.properties
或應用名.yml
的格式,例如example-service.properties
。 - Group:配置分組,默認為
DEFAULT_GROUP
。 - 配置格式:根據實際情況選擇
properties
或yaml
。 - 配置內容:輸入具體的配置信息,例如在
example-service.properties
中可以添加如下內容:
?
properties
server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/example_db
spring.datasource.username=root
spring.datasource.password=123456
3. 在微服務中集成 Nacos 配置中心
添加依賴
以 Spring Boot 項目為例,在 pom.xml
中添加 Nacos 配置中心的依賴:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置 Nacos 客戶端
在 src/main/resources
目錄下創建 bootstrap.properties
或 bootstrap.yml
文件,添加以下配置:
spring.application.name=example-service
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
?
這里的 spring.application.name
要與在 Nacos 控制臺創建的配置文件的 Data ID
中的應用名一致,spring.cloud.nacos.config.server-addr
是 Nacos 服務器的地址,spring.cloud.nacos.config.file-extension
是配置文件的格式。
獲取配置信息
在 Spring Boot 項目中,可以使用 @Value
注解或 @ConfigurationProperties
注解來獲取配置信息。以下是使用 @Value
注解的示例:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ConfigController {@Value("${server.port}")private String serverPort;@GetMapping("/config")public String getConfig() {return "Server port: " + serverPort;}
}
4. 動態刷新配置
開啟動態刷新
在需要動態刷新配置的類上添加 @RefreshScope
注解,例如:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RefreshScope
public class ConfigController {@Value("${server.port}")private String serverPort;@GetMapping("/config")public String getConfig() {return "Server port: " + serverPort;}
}
測試動態刷新
當在 Nacos 控制臺修改配置信息并發布后,無需重啟微服務,調用 /config
接口即可獲取到最新的配置信息。
5. 多環境配置管理
創建不同環境的配置文件
在 Nacos 控制臺分別創建不同環境(如開發、測試、生產)的配置文件,例如 example-service-dev.properties
、example-service-test.properties
、example-service-prod.properties
。
根據環境加載配置
在 bootstrap.properties
中添加 spring.profiles.active
屬性來指定當前環境,例如:
spring.application.name=example-service
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
spring.profiles.active=dev
這樣,微服務將加載 example-service-dev.properties
中的配置信息。
通過以上步驟,你就可以使用 Nacos 打造一個功能完善的微服務配置中心,實現配置的集中管理和動態刷新。