Nacos是阿里開源的一個項目,他可以致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理解決方案。
我們這次主要介紹配置管理和服務發現。
1.什么是配置中心
1.什么是配置
應用程序在啟動和運行的時候往往需要讀取一些配置信息,配置基本上伴隨着應用程序的整個生命周期,比如:數據庫連接參數,啟動參數等。
配置主要有一下幾個特點:
* 配置是獨立於程序的只讀變量
。配置對於程序是只讀的,程序通過讀取配置來改變自己的行為,但是程序不應該去改變配置
* 配置伴隨應用的整個生命周期
。配置貫穿於應用的整個生命周期,應用在啟動時通過讀取配置來初始化,在運行時根據配置調整行為。比如:啟動時需要讀取服務的端口號,系統在運行過程中需要讀取定時策略執行定時任務等。
* 配置可以有多種加載方式
。常見的有程序內部hard code ,配置文件,環境變量,啟動參數,基於數據庫等
* 配置需要治理
。同一份程序在不同的環境(開發,測試,生產),不同的集群(如不同的數據中心)經常需要有不同的配置,所以需要有完善的環境,集群配置管理
2.什么是配置中心
在微服務架構中,當系統從一個單體應用,被拆分成分布式系統上一個個服務節點后,配置文件也必須跟着遷移(分割),這樣配置就分散了,不僅如此,分散中還包含着冗余,如下圖
下圖顯示了配置中心的功能,配置中心將配置從各應用中剝離出來,對配置進行統一管理,應用自身不需要自己去管理配置。
2.Nacos簡介
1.主流配置中心對比
目前市面上用的比較多的配置中心有:Spring Clound Config, Apollo,Nacos和Disconf等。
由於Disconf不再維護,下面主要對比Spring Clound Config, Apollo和Nacos
2.Nacos簡介
Nacos是阿里的一個開源產品,它是針對微服務架構中的服務發現,配置管理,服務治理的綜合性解決方案。
官方的介紹是這樣的:
官方地址:https://nacos.io/zh-cn/docs/what-is-nacos.html
3.Nacos特性
Nacos主要提供以下四大功能:
1.服務發現和服務健康檢查
Nacos使服務更容易注冊,並通過DNS或HTTP接口發現其他服務,Nacos還提供服務的實時健康檢查,以防止向不健康的主機或服務實例發送請求。
2.動態配置管理
動態配置服務允許您在所有環境中以集中和動態的方式管理所有服務的配置。Nacos消除了在更新配置時重新部署應用程序,這使配置的更改更加高效和靈活。
3.動態DNS服務
Nacos提供基於DNS協議的服務發現能力,旨在支持異構語言的服務發現,支持將注冊在Nacos上的服務以域名的方式暴露端點,讓三方應用方便的查閱及發現。
4.服務和元數據管理
Nacos能讓您從微服務平台建設的視角管理數據中心的所有服務及元數據,包括管理服務的表述,生命周期,服務的靜態依賴分析,服務的健康狀態,服務的流量管理,路由及安全策略。
3.安裝Nacos Server
1.預備環境准備
Nacos依賴java環境來運行。如果您是從代碼開始構建並運行Nacos,還需要為此配置maven環境,請確保是在以下版本環境中安裝使用;
- 64 bit OS Linux/Unix/Mac,推薦使用Linux系統。
- 64 bit JDK 1.8+;https://www.cnblogs.com/qingbaizhinian/p/12201073.html
- Maven 3.2.x+;https://www.cnblogs.com/qingbaizhinian/p/12337513.html
基礎環境的准備我這里就不做演示了,可以參考上面鏈接。
2.部署的過程
#下載Nacos穩定發布包 [root@linux-test-no src]# wget https://github.com/alibaba/nacos/releases/download/1.2.1/nacos-server-1.2.1.tar.gz 這里一般官方下載比較慢,我這里有下好的可以用 鏈接:https://pan.baidu.com/s/16XBUXEFG1S2IYmKVmEAZew 提取碼:f7q8 #解壓運行Nacos包 [root@linux-test-no ~]# tar -zxvf nacos-server-1.2.1.tar.gz #編輯配置 vim conf/application.properties 一般默認配置就夠用了,如果有特殊需求可參考配置列表進行自定義配置 #運行 Nacos bin/startup.sh -m standalone
[root@linux-test-no nacos]# bin/startup.sh -m standalone
這里是以單機模式運行的命令,如果要配置集群需要編輯conf/cluster.conf 文件,並且需要在每個Nacos實例內conf/application.properties 配置數據庫連接信息 #啟動完畢訪問http://ip:8848/nacos,默認賬號密碼都是nacos
3.OPEN API配置管理測試
啟動nacos成功之后,可通過nacos提供的http api驗證nacos服務運行是否正常。
下邊我們通過curl工具來測試nacos的open api:
curl是開發中常用的命令行工具,可以用作http協議測試。
通過下面的命令進行測試,通過測試可判斷nacos是否正常工作:
發布配置
[root@linux-test-no ~]# curl -X POST "http://172.31.46.38:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
上邊的命令表示向nacos發布一個配置:
獲取配置
向nacos發布配置成功,就可以通過客戶端從nacos獲取配置信息,執行下面的命令
[root@linux-test-no ~]# curl -X GET "http://172.31.46.38:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test" HelloWorld
通過測試發現,可以從nacos獲取前邊發布的配置:HelloWorld
4.關閉服務器
關閉nacos服務的方式如下:
[root@linux-test-no ~]# nacos/bin/shutdown.sh The nacosServer(24570) is running... Send shutdown request to nacosServer(24570) OK
5.外部mysql數據庫支持(推薦做)
單機模式是nacos默認使用嵌入式數據庫實現數據的存儲,若想使用外部mysql存儲nacos數據,需要進行以下步驟:
1.安裝數據庫,版本要求:5.6.5+,mysql8以下
2.初始化mysql數據庫,新建數據庫nacos_config,數據庫初始化文件:${nacoshome/conf/nacos-mysql.sql
3.修改${nacoshome}/conf/application.properties文件,增加支持mysql數據源配置(目前只支持mysql),添加mysql數據源的url,用戶名和密碼。
#部署數據庫的過程我們這里就不演示了。 #首先創建進到數據庫里創建nacos_config庫並驗證 mysql> create database nacos_config; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | nacos_config | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec) #然后進入到nacos_config庫下,並導入數據庫初始化文件。 mysql> use nacos_config; Database changed mysql> select database(); +--------------+ | database() | +--------------+ | nacos_config | +--------------+ 1 row in set (0.00 sec) mysql> show tables; Empty set (0.00 sec) mysql> source /root/nacos/conf/nacos-mysql.sql; 。。。。。 mysql> show tables; +------------------------+ | Tables_in_nacos_config | +------------------------+ | config_info | | config_info_aggr | | config_info_beta | | config_info_tag | | config_tags_relation | | group_capacity | | his_config_info | | permissions | | roles | | tenant_capacity | | tenant_info | | users | +------------------------+ 12 rows in set (0.00 sec) #接下來就是修改nacos的配置文件application.properties,增加支持mysql數據源配置。
[root@linux-test-no ~]# vim nacos/conf/application.properties
spring.datasource.platform=mysql #在配置文件里找到這一行,取消注釋,然后在在其下加入下面幾行
db.num=1
db.url.0=jdbc:mysql://172.31.46.38:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true #這里的地址填你數據庫服務所在的地址
db.user=root #這里寫對nacos_config庫有權限的用戶和密碼,我這里為了方便直接用了數據庫的root賬號和密碼,生產中不建議。
db.password=LiuBo@2020
#接下來我們重啟一下nacos,使配置生效
[root@linux-test-no ~]# nacos/bin/shutdown.sh
The nacosServer(7692) is running...
Send shutdown request to nacosServer(7692) OK
[root@linux-test-no ~]# nacos/bin/startup.sh -m standalone
#重新執行上面的發布配置命令,然后到Mysql數據庫表中進行驗證,看是否nacos配置mysql成功
mysql> select * from config_info; #這里重新執行發布配置命令我這里就省略掉了,執行完之后我們看到confing_info表下生成了表記錄,證明nacos關聯mysql配置成功
+----+------------------+----------+------------+----------------------------------+---------------------+---------------------+----------+--------------+----------+-----------+--------+-------+--------+------+----------+
| id | data_id | group_id | content | md5 | gmt_create | gmt_modified | src_user | src_ip | app_name | tenant_id | c_desc | c_use | effect | type | c_schema |
+----+------------------+----------+------------+----------------------------------+---------------------+---------------------+----------+--------------+----------+-----------+--------+-------+--------+------+----------+
| 1 | nacos.cfg.dataId | test | HelloWorld | 68e109f0f40ca72a15e05cc22786f8e6 | 2020-07-15 16:32:17 | 2020-07-15 16:32:17 | NULL | 172.31.46.38 | | | NULL | NULL | NULL | NULL | NULL |
+----+------------------+----------+------------+----------------------------------+---------------------+---------------------+----------+--------------+----------+-----------+--------+-------+--------+------+----------+
1 row in set (0.00 sec)
4.Nacos配置入門
1.發布配置
首先在nacos發布配置。
瀏覽器訪問我們部署的nacos地址:http://172.31.46.38:8848/nacos
打開nacos的控制台,並點擊菜單配置管理-配置列表:
在Nacos添加如下的配置:
Data ID: nacos-simple-demo.yaml
Group: DEFAULT_GROUP
配置格式: YAML
配置內容: common:
config1: something
Note:注意dataid是以properties(默認的文件擴展名方式)為擴展名,這里使用yaml。
操作過程如下圖:
2.nacos客戶端獲取配置(這里主要介紹面向Spring Boot使用者的)
這里主要從官方文檔里借鑒下來的,其他開發語言應用nacos配置可以看https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
這塊開發看起來應該簡單點,在自動化部署過程中一般建議開發把配置成可以通過啟動參數來集成nacos的。
1.修改需要獲取Nacos配置的項目里的pom.xml文件,加入下面的配置。
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
注意:版本 0.2.x.RELEASE 對應的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 對應的是 Spring Boot 1.x 版本。
2.在 application.properties
中配置 Nacos server 的地址:
nacos.config.server-addr=127.0.0.1:8848
3.使用 @NacosPropertySource
加載 dataId
為 example
的配置源,並開啟自動更新:
@SpringBootApplication @NacosPropertySource(dataId = "example", autoRefreshed = true) public class NacosConfigApplication { public static void main(String[] args) { SpringApplication.run(NacosConfigApplication.class, args); } }
4.通過 Nacos 的 @NacosValue
注解設置屬性值。
@Controller @RequestMapping("config") public class ConfigController { @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true) private boolean useLocalCache; @RequestMapping(value = "/get", method = GET) @ResponseBody public boolean get() { return useLocalCache; } }
5.啟動 NacosConfigApplication
,調用 curl http://localhost:8080/config/get
,返回內容是 false
。
6.通過調用 Nacos Open API 向 Nacos server 發布配置:dataId 為example
,內容為useLocalCache=true
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=useLocalCache=true"
7.再次訪問 http://localhost:8080/config/get
,此時返回內容為true
,說明程序中的useLocalCache
值已經被動態更新了。
5.Nacos配置管理基礎應用
1.Nacos配置管理模型
對於Nacos配置管理,通過Namespace,group,Data ID能夠定位到一個配置集。
配置集(Data ID)
在系統中,一個配置文件通常就是一個配置集,一個配置集可以包含系統的各種配置信息,例如,一個配置集可能包含了數據源,線程池,日志級別等配置項。每個配置集都可以定義一個有意義的名稱,就是配置集的ID即Data ID;
配置項
配置集中包含的一個個配置內容就是配置項。它代表一個具體的可配置的參數與其值域,通常以key=value的形式存在。列如我們常配置系統的日志輸出級別(longLevel=INFO|WARN|ERROR)就是一個配置項。
配置分組(Group)
配置分組是對配置集進行分組,通過一個有意義的字符串(如Buy或Trade)來表示,不同的配置分組下可以有相同的配置集(Data ID)。當您在Nacos上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認采用DEFAULT_GROUP。配置分組的常見場景:可用於區分不同的項目或應用,列如:學生管理系統的配置集可以定義一個group為:STUDENT_GROUP。
命名空間(Namespace)
命名空間(namespace)可用於進行不同環境的配置隔離。列如可以隔離開發環境,測試環境和生產環境,因為他們的配置可能各不相同,或者是隔離不同的用戶,不同的開發人員使用同一個nacos管理各自的配置,可通過namespace隔離。不同的命令空間下,可以存着相同名稱的配置分組(Group)或配置集。
最佳實踐
Nacos抽象定義了Namespace,Group,Data ID的概念,具體這幾個概率代表什么,取決我們把它們看成什么,這里推薦給大家一種用法,如下圖:
Namespace:代表不同環境,如開發,測試,生產環境。
Group:代表某項目,如XX醫療項目,XX電商項目;
Dataid:每個項目下往往有若干個工程,每個配置集(DataID)是一個工程的主配置文件
獲取某配置集的代碼:
獲取配置集需要指定:
1.nacos服務地址,必須指定
2.namespace,如不指定默認public
3.group,如不指定默認DEFAULT_GROUP
4.dataId,必須指定
代碼如下:
看懂即可不用運行。
以上代碼說明將從地址為127.0.0.1:8848的nacos配置中心獲取配置,通過以下信息定位配置集,
注意:namespace需要指定id。
2.命名空間管理
1.namespace隔離設計
單個用戶使用nacos client,可通過不同的namespace來做不同環境下的配置/服務 數據隔離
2.命名空間管理
3.配置管理
Nacos支持基於Namespace和Group都配置分組管理,以便用戶更靈活的根據自己的需要按照環境或者應用,模塊等分組管理微服務的大量配置,在配置管理中主要提供了配置歷史版本,回滾,訂閱者查詢等核心管理能力。
1.配置列表
編輯DIFF
Nacos支持編輯DIFF能力,幫助用戶體驗修改內容,減低改錯帶來的風險。
配置集導出
此功能一般用於拷貝老namespace里的配置集到新的namespace下面。過程如下
上述方法可以跨主機導入配置集。還有一種在nacos本地服務器進行不同namespace下配置集的復制拷貝。過程如下。
歷史版本
這里主要的功能就是記錄配置集的修改操作,對配置集可以進行回滾操作。操作過程如下。
監聽查詢
Nacos提供配置訂閱者即監聽者查詢能力,同時提供客戶端當前配置的MD5校驗值,以便幫助用戶更好的檢查配置變更是否推送到client端。
通過以下代碼可對某配置進行監聽: