1. 什么是配置中心
1.1 什么是配置
應用程序在啟動和運行的時候往往需要讀取一些配置信息,配置基本上伴隨着應用程序的整個生命周期,比如:數據庫連接參數、啟動參數等。
配置主要有以下幾個特點:
配置是獨立於程序的只讀變量
- 配置對於程序是只讀的,程序通過讀取配置來改變自己的行為,但是程序不應該去改變配置
配置伴隨應用的整個生命周期
- 配置貫穿於應用的整個生命周期,應用在啟動時通過讀取配置來初始化,在運行時根據配置調整行為。
- 比如:啟動時需要讀取服務的端口號、系統在運行過程中需要讀取定時策略執行定時任務等。
配置可以有多種加載方式
- 常見的有程序內部 hard code,配置文件,環境變量,啟動參數,基於數據庫等
配置需要治理
- 同一份程序在不同的環境(開發,測試,生產)、不同的集群(如不同的數據中心)經常需要有不同的配置,所以需要有完善的環境、集群配置管理
1.2 什么是配置中心
在微服務架構中,當系統從一個單體應用,被拆分成分布式系統上一個個服務節點后,配置文件也必須跟着遷移(分割),這樣配置就分散了,不僅如此,分散中還包含着冗余,如下圖:
下圖顯示了配置中心的功能,配置中心將配置從各應用中剝離出來,對配置進行統一管理,應用自身不需要自己去管理配置。
配置中心的服務流程如下:
1、用戶在配置中心更新配置信息。
2、服務A和服務B及時得到配置更新通知,從配置中心獲取配置。
總得來說,配置中心就是一種統一管理各種應用配置的基礎服務組件。
在系統架構中,配置中心是整個微服務基礎架構體系中的一個組件,如下圖,它的功能看上去並不起眼,無非就是配置的管理和存取,但它是整個微服務架構中不可或缺的一環。
總結一下,在傳統巨型單體應用紛紛轉向細粒度微服務架構的歷史進程中,配置中心是微服務化不可缺少的一個系
統組件,在這種背景下中心化的配置服務即配置中心應運而生,一個合格的配置中心需要滿足如下特性:
- 配置項容易讀取和修改
- 分布式環境下應用配置的可管理性,即提供遠程管理配置的能力
- 支持對配置的修改的檢視以把控風險
- 可以查看配置修改的歷史記錄
- 不同部署環境下應用配置的隔離性
2 Nacos 簡介
2.1 主流配置中心對比
目前市面上用的比較多的配置中心有:Spring Cloud Config、Apollo、Nacos和Disconf等。由於Disconf不再維護,下面主要對比一下Spring Cloud Config、Apollo和Nacos。
對比項目 | Spring Cloud Config | Apollo | Nacos |
配置實時推送 | 支持(Spring Cloud Bus) |
支持(HTTP長輪詢1s內) | 支持(HTTP長輪詢1s內) |
版本管理 | 支持(Git) | 支持 | 支持 |
配置回滾 | 支持(Git) | 支持 | 支持 |
灰度發布 | 支持 | 支持 | 不支持 |
權限管理 | 支持(依賴Git) | 支持 | 不支持 |
多集群 | 支持 | 支持 | 支持 |
多環境 | 支持 | 支持 | 支持 |
監聽查詢 | 支持 | 支持 | 支持 |
多語言 | 只支持Java | 主流語言,提供了Open API |
主流語言,提供了Open API |
配置格式校驗 | 不支持 | 支持 | 支持 |
單機讀(QPS) | 7(限流所致) | 9000 | 15000 |
單擊寫(QPS) | 5(限流所致) | 1100 | 1800 |
3節點讀 (QPS) |
21(限流所致) | 27000 | 45000 |
3節點寫 (QPS) |
5(限流所致) | 3300 | 5600 |
從配置中心角度來看,性能方面Nacos的讀寫性能最高,Apollo次之,Spring Cloud Config依賴Git場景不適合開放的大規模自動化運維API。功能方面Apollo最為完善,nacos具有Apollo大部分配置管理功能,而Spring Cloud
Config不帶運維管理界面,需要自行開發。Nacos的一大優勢是整合了注冊中心、配置中心功能,部署和操作相比Apollo都要直觀簡單,因此它簡化了架構復雜度,並減輕運維及部署工作。
綜合來看,Nacos的特點和優勢還是比較明顯的,下面我們一起進入Nacos的世界。
2.2 Nacos簡介
Nacos是阿里的一個開源產品,它是針對微服務架構中的服務發現、配置管理、服務治理的綜合型解決方案。
官方介紹是這樣的:
Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您實現動態服務發現、服務配置管理、服務及流量管理。 Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平台。
Nacos 是構建以“服務”為中心的現代應用架構的服務基礎設施。
官網地址:https://nacos.io
2.3 Nacos特性
Nacos主要提供以下四大功能:
1. 服務發現與服務健康檢查
Nacos使服務更容易注冊,並通過DNS或HTTP接口發現其他服務,Nacos還提供服務的實時健康檢查,以防止向不健康的主機或服務實例發送請求。
2. 動態配置管理
動態配置服務允許您在所有環境中以集中和動態的方式管理所有服務的配置。Nacos消除了在更新配置時重新部署應用程序,這使配置的更改更加高效和靈活。
3. 動態DNS服務
Nacos提供基於DNS 協議的服務發現能力,旨在支持異構語言的服務發現,支持將注冊在Nacos上的服務以域名的方式暴露端點,讓三方應用方便的查閱及發現。
4. 服務和元數據管理
Nacos 能讓您從微服務平台建設的視角管理數據中心的所有服務及元數據,包括管理服務的描述、生命周期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略。這里動態配置管理的特性說明了Naocs的配置管理能力。
3 Nacos快速入門
3.1 安裝Nacos Server
3.1.1 預備環境准備
Nacos 依賴 Java 環境來運行。如果您是從代碼開始構建並運行Nacos,還需要為此配置 Maven環境,請確保是在以下版本環境中安裝使用:
1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac。
2. 64 bit JDK 1.8+;
3. Maven 3.2.x+;
3.1.2 下載源碼或者安裝包
你可以通過源碼和發行包兩種方式來獲取 Nacos。
從 Github 上下載源碼方式
git clone https://github.com/alibaba/nacos.git cd nacos/ mvn ‐Prelease‐nacos clean install ‐U ls ‐al distribution/target/ // change the $version to your actual path cd distribution/target/nacos‐server‐$version/nacos/bin
下載編譯后壓縮包方式
您可以從 最新穩定版本 下載 nacos-server-$version.zip 包,本教程使用nacos-server-1.1.3版本。
下載地址:https://github.com/alibaba/nacos/releases
下載后解壓
[root@iZ1la3d1xbmukrZ ~]# unzip nacos-server-1.1.3.zip Archive: nacos-server-1.1.3.zip creating: nacos/ creating: nacos/target/ creating: nacos/conf/ creating: nacos/bin/ inflating: nacos/LICENSE inflating: nacos/bin/startup.sh inflating: nacos/NOTICE inflating: nacos/conf/application.properties inflating: nacos/target/nacos-server.jar inflating: nacos/conf/schema.sql inflating: nacos/bin/startup.cmd inflating: nacos/conf/nacos-mysql.sql inflating: nacos/bin/shutdown.sh inflating: nacos/conf/application.properties.example inflating: nacos/bin/shutdown.cmd inflating: nacos/conf/nacos-logback.xml inflating: nacos/conf/cluster.conf.example
3.1.3 啟動服務器
nacos的默認端口是8848,需要保證8848默認端口沒有被其他進程占用。
進入安裝程序的bin目錄:
使用默認用戶名:nacos,默認密碼:nacos 登錄即可打開主頁面。
[root@iZ1la3d1xbmukrZ ~]# cd nacos [root@iZ1la3d1xbmukrZ nacos]# ll total 36 drwxr-xr-x 2 root root 4096 Aug 6 2019 bin drwxr-xr-x 2 root root 4096 Aug 1 2019 conf -rw-r--r-- 1 root root 17336 May 13 2019 LICENSE -rw-r--r-- 1 root root 1305 May 13 2019 NOTICE drwxr-xr-x 2 root root 4096 Aug 6 2019 target [root@iZ1la3d1xbmukrZ nacos]# cd bin [root@iZ1la3d1xbmukrZ bin]# ll total 20 -rwxr-xr-x 1 root root 954 May 13 2019 shutdown.cmd -rwxr-xr-x 1 root root 884 May 13 2019 shutdown.sh -rwxr-xr-x 1 root root 2716 Jun 12 2019 startup.cmd -rwxr-xr-x 1 root root 4801 Jul 30 2019 startup.sh [root@iZ1la3d1xbmukrZ bin]# sh startup.sh -m standalone /home/zookeeper/jdk1.8.0_131/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Djava.ext.dirs=/home/zookeeper/jdk1.8.0_131/jre/lib/ext:/home/zookeeper/jdk1.8.0_131/lib/ext:/root/nacos/plugins/cmdb:/root/nacos/plugins/mysql -Xloggc:/root/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dnacos.home=/root/nacos -Dloader.path=/root/nacos/plugins/health -jar /root/nacos/target/nacos-server.jar --spring.config.location=classpath:/,classpath:/config/,file:./,file:./config/,file:/root/nacos/conf/ --logging.config=/root/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288 nacos is starting with standalone nacos is starting,you can check the /root/nacos/logs/start.out [root@iZ1la3d1xbmukrZ bin]# curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld" true[root@iZ1la3d1xbmukrZ bin]# curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld" [root@iZ1la3d1xbmukrZ bin]#
3.1.5.關閉服務器
[root@iZ1la3d1xbmukrZ bin]# sh shutdown.sh The nacosServer(11700) is running... Send shutdown request to nacosServer(11700) OK
3.1.6. 外部mysql數據庫支持
單機模式時nacos默認使用嵌入式數據庫實現數據的存儲,若想使用外部mysql存儲nacos數據,需要進行以下步驟:
1. 安裝數據庫,版本要求:5.6.5+ ,mysql 8 以下
2. 初始化mysql數據庫,新建數據庫nacos_config,數據庫初始化文件:${nacoshome}/conf/nacos-mysql.sq
3. 修改${nacoshome}/conf/application.properties文件,增加支持mysql數據源配置(目前只支持mysql),添加mysql數據源的url、用戶名和密碼。
3.3.2 nacos客戶端獲取配置
/** * @author WGR * @create 2020/4/23 -- 23:01 */ public class NacosTest { public static void main(String[] args) throws NacosException, InterruptedException { String serverAddr = "47.151.254.149:8848"; String dataId = "nacos-simple-demo.yaml"; String group = "DEFAULT_GROUP"; Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); ConfigService configService = NacosFactory.createConfigService(properties); String content = configService.getConfig(dataId, group, 5000); System.out.println(content); configService.addListener(dataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { System.out.println("recieve:" + configInfo); } @Override public Executor getExecutor() { return null; } }); boolean isPublishOk = configService.publishConfig(dataId, group, "content"); System.out.println(isPublishOk); Thread.sleep(3000); content = configService.getConfig(dataId, group, 5000); System.out.println(content); boolean isRemoveOk = configService.removeConfig(dataId, group); System.out.println(isRemoveOk); Thread.sleep(3000); content = configService.getConfig(dataId, group, 5000); System.out.println(content); Thread.sleep(300000); } }