黑馬程序員,視頻地址:https://www.bilibili.com/video/BV1VJ411X7xX?p=1
1. Nacos簡介
Nacos是阿里的一個開源產品,它是針對微服務架構中的服務發現、配置管理、服務治理的綜合型解決方案。
官方介紹是這樣的:Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您實現動態服務 發現、服務配置管理、服務及流量管理。 Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平台。 Nacos 是構建以“服務”為中心的現代應用架構的服務基礎設施。
官網地址:https://nacos.io
1.1 Nacos特性
Nacos主要提供以下四大功能:
1. 服務發現與服務健康檢查:Nacos使服務更容易注冊,並通過DNS或HTTP接口發現其他服務,Nacos還提供服務的實時健康檢查,以防 止向不健康的主機或服務實例發送請求。
2. 動態配置管理:動態配置服務允許您在所有環境中以集中和動態的方式管理所有服務的配置。Nacos消除了在更新配置時重新 部署應用程序,這使配置的更改更加高效和靈活。
3. 動態DNS服務:Nacos提供基於DNS 協議的服務發現能力,旨在支持異構語言的服務發現,支持將注冊在Nacos上的服務以 域名的方式暴露端點,讓三方應用方便的查閱及發現。
4. 服務和元數據管理:Nacos 能讓您從微服務平台建設的視角管理數據中心的所有服務及元數據,包括管理服務的描述、生命周 期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略。
2 Nacos安裝
2.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+
2.2 下載安裝包
安裝Nacos有2種方式:1.下載源碼后自己編譯源碼並安裝;2.下載安裝包
我們選擇安裝包,下載地址:https://github.com/alibaba/nacos/releases
當前最新安裝包版本是2.0.0,下載后的文件名:nacos-server-2.0.0.zip 或者 nacos-server-2.0.0.tar.gz,並解壓安裝包,我們把解壓后的文件目錄成為nacoshome。
2.3 啟動前准備工作
(1)使用mysql創建一個數據庫,數據庫名稱 nacos_config,並執行 ${nacoshome}\conf\nacos-mysql.sql 這個腳本,初始化Nacos運行時所需數據表。
(2)修改 ${nacoshome}\conf\application.properties配置,把數據庫參數填寫正確。
### If use 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&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=nacos db.password.0=nacos
2.4 啟動Nacos Server
windows系統的啟動文件:${nacoshome}\bin\startup.cmd
linux系統的系統文件:sh ${nacoshome}\bin\startup.sh -m standalone (standalone代表着單機模式運行,非集群模式)
啟動成功后,會打印日志:2021-03-25 16:21:14,360 INFO Nacos started successfully in cluster mode. use external storage
登錄地址:http://127.0.0.1:8848/nacos (IP要換成自己的服務器IP,端口默認是8848)
默認登錄名密碼 nacos / nacos
登錄成功后的頁面如下:
2.5 配置測試
啟動nacos成功后,可通過nacos提供的http api驗證nacos服務運行是否正常,
我們使用Postman發送POST請求:http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld 返回結果:true
表示此條屬性已經新增成功,在 配置管理--配置列表 頁面,我們就可以查詢到nacos.cfg.dataId這條數據了,並點擊詳情可以查看配置內容。
使用Postman發送GET請求:http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test 也會返回結果HelloWorld
3. 配置管理
3.1 基礎概念
對於Nacos配置管理,通過Namespace、group、Data ID能夠定位到一個配置集。
配置集(Data ID):在系統中,一個配置文件通常就是一個配置集,一個配置集可以包含了系統的各種配置信息,例如,一個配置集可能包含了數據源、線程池、日志級別等配置項。每個配置集都可以定義一個有意義的名稱,就是配置集的ID即DataID。
配置項:配置集中包含的一個個配置內容就是配置項。它代表一個具體的可配置的參數與其值域,通常以 key=value 的形式存在。例如我們常配置系統的日志輸出級別(logLevel=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)是一個工程的主配置文件
3.2 命名空間
在管理后台-命名空間頁面,可以新建、編輯、刪除命名空間,我這里按照開發環境、測試環境創建了2個。
如果Nacos是多個項目組公用的,也可以根據創建更細致的命名空間,便於區分。
3.3 配置管理
在配置管理--配置列表頁面,我們可以新建、編輯、刪除、導入、導出配置文件。
創建配置時,data_id, group 都只支持英文字母和數據,特殊字符只允許有一下四種:'_', '-', '.', ':'
紅框部分是我剛創建的命名空間,可以點擊進行切換。
3.4 歷史版本
在配置管理-歷史版本頁面,記錄着之前被修改的配置文件的歷史版本。
剛進入歷史版本頁面是空白的,需要你輸入正確的Data ID和Group查詢,當看到你需要的歷史版本時,可以查看之前的詳情,並選擇回退。
3.5 監聽查詢
當有應用連接到Nacos時,輸入Data ID和Group可以查詢到連接應用的IP
3.6 應用配置
3.6.1 項目基礎配置
當在Java應用中使用Nacos配置中時,首先要進入jar包。因為我使用的是2.0版的Nacos,特意把nacos-client換成了2.0版
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.1.3.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>2.0.0</version> </dependency>
然后在bootstrap.yml 文件中加入如下配置:
如果項目中同時有多個配置文件,比如:application.yml和bootstrap.yml。其中boostrap.yml的加載優先級是最高的。所以讀取配置中心參數的信息,一般都要寫在bootstrap里。
spring: cloud: nacos: config: # 配置中心地址 server-addr: 127.0.0.1:8848 # dataId = application.name + file-extension file-extension: yaml namespace: df43bed9-724e-40a2-8528-4c1be8719510 group: DEFAULT_GROUP
server-addr 配置中心地址。
file-extension文件后綴。配置集(dataId) 的內容,應該等於應用名稱+file-extension。如果你的dataId沒有后綴,這一項可以不寫。
namespace:命名空間的ID
group:所屬分組名稱
3.6.2 屬性動態刷新
在Spring項目中,代碼里讀取配置文件一般都使用@Value注解,如下:
@Value("${common.name}") private String config;
但是,使用Nacos配置中心后,如果在配置中心修改了屬性值,在項目未重啟的情況下,是不會自動更新的,因為@Value注解是不會自動刷新它的值的。
我們需要使用注入ConfigurableApplicationContext,這是配置的上下文,使用它的getProperty的方法動態獲取屬性值。在Nacos修改屬性值時,ConfigurableApplicationContext會進行刷新的。
@Autowired private ConfigurableApplicationContext applicationContext; public String getConfig1() { return applicationContext.getEnvironment().getProperty("common.name"); }
3.6.3 多配置文件
如果項目比較復雜,是需要同時引用多個配置文件的,一般來說項目的主配置文件還是使用file-extension標簽,外部引用的配置文件使用extension-configs標簽。
在yaml文件里的寫法。注意:多個配置文件需要在同一個namespace里。refresh表示是否需要動態刷新,默認值是false。
spring: application: name: server1 cloud: nacos: config: # 配置中心地址 server-addr: 127.0.0.1:8848 # dataId = application.name + file-extension file-extension: yaml namespace: df43bed9-724e-40a2-8528-4c1be8719510 group: DEFAULT_GROUP extension-configs: - data-id: ext-config.properties group: DEFAULT_GROUP refresh: true - data-id: ext-config2.properties group: DEFAULT_GROUP refresh: true
上面這段配置,一共加載了3個配置文件:server1.yaml,ext-config.properties, ext-config2.properties
通過內部相關規則(應用名、擴展名 )自動生成相關的 Data Id 配置優先級最高,server1.yaml
另外引用外部配置文件在properties上的寫法是spring.cloud.nacos.config.extension-configs[n].data-id,默認從0開始,這里的n越大,優先級越高。所以在上面例子中應該是 ext-config2.properties優先級高於 ext-config.properties
優先級的作用,如果多個配置文件中,出現了相同的值,會以優先級高的值為准。
3.6.4 禁用Nacos配置中心
通過設置 spring.cloud.nacos.config.enabled = false 來完全關閉 Spring Cloud Nacos Config
4. 服務發現
5. Nacos集群
5.1 Nacos集群配置
為了保證Nacos的高可用,一般需要部署3個或3個以上的Nacos Server實例來組成集群,這樣的其中一個台報錯,也不會影響Nacos使用。這多個Nacos Server會自動選舉出一個Server作為Leader。
首先,我們2.2節解壓的安裝包復制成三份,如果是單機演示,需要更改nacos/的conf目錄下application.properties中server.port,防止端口沖突。如果是線上環境,建議這三份實例放到不同的服務器上,才能確保高可用。
在所有nacos目錄的conf目錄下,有文件 cluster.conf.example ,將其命名為 cluster.conf ,並將每行配置成 ip:port 。(請配置3個或3個以上節點,這里填寫實例所屬的IP和端口,3個nacos都要配置)
# ip:port
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
5.2 集群啟動
在啟動Nacos Server時,需使用-m標簽,表示是集群方式啟動
startup ‐m cluster
啟動后,我們可以在管理后台的節點列表里,查看到當前啟動的實例,並發現其中一台Server被選舉成了Leader。
5.3 客戶端配置
需要把3個實例的IP和端口都填寫到客戶端配置文件中。
spring:
application:
name: xxxx
cloud:
nacos:
config:
server‐addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
5.4 數據庫的高可用
為了保證Nacos的數據庫也是高可用,我們可以同時使用2台數據庫,實現主備。
db.num=2
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&autoReconnect=true
db.url.1=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&autoReconnect=true
db.user=root
db.password=root