一、為什么要集中配置
- 現在基本都是微服務架構,隨着服務越來越多,程序功能越來越復雜需要一個程序來集中管理
- 並且對配置的期望也越來越高,配置修改后實時生效,灰度發布,分環境、分集群管理配置,完善的權限、審核機制。。。
- 項目之間的相互引用隨着服務的不斷增多,相互之間的調用復雜度成指數升高,每次投產或者上線新的項目時苦不堪言,因此需要引用配置中心治理。
二、主流配置中心對比
現在主流的配置中心有以下幾個:
1.spring-cloud-config
https://github.com/spring-cloud/spring-cloud-config
Spring Cloud組件之一,可以跟Spring Cloud項目無縫銜接
2.淘寶 diamond
3.disconf
https://github.com/knightliao/disconf
java開發,螞蟻金服技術專家發起,業界使用廣泛包括百度,順豐等。
4.ctrip apollo
https://github.com/ctripcorp/apollo/
Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,具備規范的權限、流程治理等特性。
5.阿里nacos
https://github.com/alibaba/nacos
Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。
spring-cloud-config是將配置文件保存到github倉庫而且功能單一基本沒人用,diamond已經沒有維護了所以也不考慮,下面主要比較disconf、apollo、nacos這三個。
功能點 | 優先級 | disconf | apollo | nacos |
---|---|---|---|---|
統一管理 | 高 | 支持 | 支持 | 支持 |
多環境 | 高 | 支持 | 支持 | 支持 |
多集群 | 高 | 支持 | 支持 | 支持 |
多語言 | 中 | Java | 支持 | 支持 |
本地配置緩存 | 高 | 支持 | 支持 | 支持 |
配置校驗 | 中 | 無 | 無 | 無 |
配置更新推送 | 高 | 支持 | 支持 | 支持 |
配置定時拉取 | 高 | 支持 | 支持 | 支持 |
版本管理 | 高 | 操作記錄有落數據庫,但無查詢接口 | 支持 | 支持 |
配置回滾 | 高 | 不支持 | 支持 | 支持 |
用戶權限管理 | 高 | 支持 | 支持 | 支持 |
灰度發布 | 中 | 不支持部分更新 | 支持 | 待支持 |
告警通知 | 中 | 支持,郵件方式告警 | 支持,郵件方式告警 | 支持,可以暴露metrics數據 |
單機讀 | 高 | 暫無數據 | 9000 | 15000 |
單機寫 | 高 | 暫無數據 | 1100 | 1800 |
相比之下disconf功能不夠豐富,Apollo(阿波羅)和nacos功能差不多,但是nacos因為使用了HTTP異步通知的方式性能更高,而且當Spring Boot版本升級到2.X時可以用到作為注冊中心(Eureka只支持Spring Boot 1.X版本),所以選擇了nacos。
三、初探nacos
nacos是Spring Cloud Alibaba的開源項目之一,主要用於服務注冊和發現,配置管理。
3.1基本概念
命名空間
用於進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源隔離等。
配置ID
dataId就是這個配置的ID,需要保證全局唯一,整合Spring Cloud時有一個默認的命名規則。
配置分組
Nacos 中的一組配置集,是組織配置的維度之一。通過一個有意義的字符串(如 Buy 或 Trade )對配置集進行分組,從而區分 Data ID 相同的配置集。當您在 Nacos 上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認采用 DEFAULT_GROUP 。配置分組的常見場景:不同的應用或組件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。
它們三者之間的關系如下圖:

3.2安裝nacos server
1.下載nacos server(nacos-server-1.2.1.zip),地址 https://github.com/alibaba/nacos/releases
2.windos系統解壓之后的目錄如下

3.執行 conf/nacos-mysql.sql創建nacos數據庫( 數據庫版本要求:5.6.5+)
4.nacos默認使用derby數據庫作數據持久化,所以還需要修改配置文件,在 conf/application.properties添加如下內容
#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=1234
5.進入bin目錄,運行startup.cmd命令啟動即可。
6.游覽器輸入http://localhost:8848/nacos/index.html即看到登錄頁面,默認賬號密碼nacos/nacos,建議修改。

3.3編碼
- 1.創建Spring Boot項目nacos-demo
- 2.引入依賴
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- <version>1.5.1.RELEASE</version>
- <exclusions>
- <exclusion>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- 這里是為了升級客戶端版本-->
- <dependency>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- <version>1.2.0</version>
- </dependency>
- </dependencies>
注意: 版本 2.1.x.RELEASE 對應的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 對應的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 對應的是 Spring Boot 1.5.x 版本。
- 3.在bootstrap.yml文件添加配置
- spring:
- application:
- name: nacos-demo
- cloud:
- nacos:
- config:
- server-addr: 127.0.0.1:8848
- file-extension: yaml
- namespace: public
- 4.測試Controller
- /**
- * @author Ship
- * @date 2020-04-20 18:01
- */
- "test")
(
- public class TestController {
- "${test.enabled}")
( - private boolean testEnabled;
-
- public String test() {
- return testEnabled + "";
- }
- }
通過 Spring Cloud 原生注解 @RefreshScope 實現配置自動更新。
-
5.設置項目啟動環境為dev
方式一(推薦):
方式二:
-
6.在nacos管理后台添加配置文件
注意:
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
- prefix 默認為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置。
- spring.profile.active 即為當前環境對應的 profile,詳情可以參考 Spring Boot文檔。 注意:當 spring.profile.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
- file-exetension 為配置內容的數據格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 類型。
3.4測試
1.啟動nacos-demo,訪問地址http://localhost:9000/test,返回結果為true
2.修改nacos-demo-dev.yaml中test.enabled的值為false,再次訪問結果為false,說明配置實時更新了。
3.5遇到的問題
將application.properties上的nacos.core.auth.enabled改為true,開啟權限認證后項目就讀取不到配置了,配置了用戶名和密碼也無效。
com.alibaba.nacos.api.exception.NacosException: <html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Sun Apr 26 16:06:15 CST 2020</div><div>There was an unexpected error (type=Forbidden, status=403).</div><div>unknown user!</div></body></html>
在github上 Issue發現該問題是因為現有的Spring Cloud版本不支持nacos server 1.2.0。

參考:官方文檔