分布式配置中心預研


一、為什么要集中配置

  • 現在基本都是微服務架構,隨着服務越來越多,程序功能越來越復雜需要一個程序來集中管理
  • 並且對配置的期望也越來越高,配置修改后實時生效,灰度發布,分環境、分集群管理配置,完善的權限、審核機制。。。
  • 項目之間的相互引用隨着服務的不斷增多,相互之間的調用復雜度成指數升高,每次投產或者上線新的項目時苦不堪言,因此需要引用配置中心治理。

二、主流配置中心對比

現在主流的配置中心有以下幾個:
1.spring-cloud-config

https://github.com/spring-cloud/spring-cloud-config
Spring Cloud組件之一,可以跟Spring Cloud項目無縫銜接

2.淘寶 diamond

https://github.com/takeseem/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.引入依賴
  1. <dependencies> 
  2. <dependency> 
  3. <groupId>org.springframework.boot</groupId> 
  4. <artifactId>spring-boot-starter-web</artifactId> 
  5. </dependency> 
  6.  
  7. <dependency> 
  8. <groupId>org.springframework.boot</groupId> 
  9. <artifactId>spring-boot-starter-test</artifactId> 
  10. <scope>test</scope> 
  11. </dependency> 
  12.  
  13. <dependency> 
  14. <groupId>com.alibaba.cloud</groupId> 
  15. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> 
  16. <version>1.5.1.RELEASE</version> 
  17. <exclusions> 
  18. <exclusion> 
  19. <groupId>com.alibaba.nacos</groupId> 
  20. <artifactId>nacos-client</artifactId> 
  21. </exclusion> 
  22. </exclusions> 
  23. </dependency> 
  24. <!-- 這里是為了升級客戶端版本--> 
  25. <dependency> 
  26. <groupId>com.alibaba.nacos</groupId> 
  27. <artifactId>nacos-client</artifactId> 
  28. <version>1.2.0</version> 
  29. </dependency> 
  30. </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文件添加配置
  1. spring: 
  2. application: 
  3. name: nacos-demo 
  4. cloud: 
  5. nacos: 
  6. config: 
  7. server-addr: 127.0.0.1:8848 
  8. file-extension: yaml 
  9. namespace: public 
  • 4.測試Controller
  1. /** 
  2. * @author Ship 
  3. * @date 2020-04-20 18:01 
  4. */ 
  5. @RestController 
  6. @RequestMapping("test") 
  7. @RefreshScope 
  8. public class TestController { 
  9.  
  10. @Value("${test.enabled}") 
  11. private boolean testEnabled; 
  12.  
  13. @GetMapping 
  14. public String test() { 
  15. return testEnabled + ""; 
  16. } 
  17. } 

通過 Spring Cloud 原生注解 @RefreshScope 實現配置自動更新。

  • 5.設置項目啟動環境為dev
    方式一(推薦):
    enter description here
    方式二:
    enter description here

  • 6.在nacos管理后台添加配置文件
    enter description here

注意:

在 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。

 

版本關系
版本關系

 

參考:官方文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM