再講 Nacos 之前,我們需要了解什么是 Nacos:Nacos 是阿里的一個開源產(chǎn)品筹燕,它是針對微服務(wù)架構(gòu)中的 服務(wù)發(fā)現(xiàn)轧飞、配置管理、服務(wù)治理 的綜合性解決方案撒踪。
官網(wǎng)給出的回答:
Nacos 致力于幫助您發(fā)現(xiàn)过咬、配置和管理微服務(wù)。Nacos 提供了一組簡單易用的特性集制妄,幫助您實現(xiàn)動態(tài)服務(wù)發(fā)現(xiàn)掸绞、服務(wù)配置管理、服務(wù)及流量管理耕捞。 Nacos 幫助您更敏捷和容易地構(gòu)建衔掸、交付和管理微服務(wù)平臺烫幕。Nacos 是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu)(例如微服務(wù)范式、云原生范式)的服務(wù)基礎(chǔ)設(shè)施敞映。
綜上所述纬霞,得出 Nacos 的四大特性:
- 服務(wù)發(fā)現(xiàn)與服務(wù)健康檢查
- 動態(tài)配置管理
- 動態(tài)DNS服務(wù)
- 服務(wù)和元數(shù)據(jù)管理
附圖:
看到Nacos支持這么多主流的開源生態(tài),是心動的感覺驱显!
一诗芜、入門基操
使用方式
Nacos的使用方式也極其簡單,以下為 windows 下安裝方式
步驟1
點擊下載地址 下載最新穩(wěn)定版本
步驟2
雙擊 bin 目錄下的 startup.cmd 啟動服務(wù)器
步驟3
通過瀏覽器訪問 http://127.0.0.1:8848/nacos 打開 nacos 控制臺登錄頁面埃疫,默認用戶名密碼皆為:nacos伏恐,登錄成功后便可訪問主頁面。
擴展使用
發(fā)布配置
我們可以通過 地址 的方式發(fā)布配置:http://127.0.0.1:8848/nacos/v1/cs/configs栓霜,使用 postman 進行測試:
獲取配置
我們可以通過 地址 的方式獲取配置:http://127.0.0.1:8848/nacos/v1/cs/configs翠桦,使用 postman 進行測試:
發(fā)布服務(wù)
我們可以通過 地址 進行服務(wù)注冊:http://127.0.0.1:8848/nacos/v1/ns/instance,使用 postman 進行測試:
服務(wù)發(fā)現(xiàn)
我們可以通過 地址 發(fā)現(xiàn)服務(wù):http://127.0.0.1:8848/nacos/v1/ns/instance/list胳蛮,
使用 postman 進行測試:
外部數(shù)據(jù)庫支持
nacos默認是使用嵌入式數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)的存儲销凑,如果我們要使用外部 mysql 存儲 nacos數(shù)據(jù),進行以下步驟:
- 步驟1
安裝Mysql(5.6.5 ~ 8 之間的版本)
- 步驟2
初始化 mysql 數(shù)據(jù)庫仅炊,新建數(shù)據(jù)庫 nacos斗幼,然后加載 conf/nacos-mysql.sql
- 步驟3
修改 conf/application.properties文件,添加 mysql 數(shù)據(jù)源的配置抚垄,然后重啟蜕窿,便可生效
二、配置管理
在上述中我們已經(jīng)知道Nacos其中的一個功能便是用于配置中心呆馁。配置中心是在微服務(wù)架構(gòu)中桐经,當(dāng)系統(tǒng)從一個單體應(yīng)用被拆分為分布式系統(tǒng)上一個個服務(wù)節(jié)點時,配置文件也必須隨著遷移而分割浙滤,這樣配置就分散了阴挣,而且各個配置中也存在互相冗余的部分。
配置中心所擔(dān)任的角色:
配置中心將配置從各應(yīng)用中剝離出來纺腊,對配置進行統(tǒng)一管理畔咧,應(yīng)用自身不需要自己去管理配置
從圖中我們總結(jié)流程如下:
- 用戶在配置中心更新配置信息
- A 服務(wù)和 B 服務(wù)及時得到配置更新通知,從配置中心獲取更新
發(fā)布配置
- 步驟1中我們可以創(chuàng)建命名空間摹菠,命名空間(NameSpace)是用于隔離多個環(huán)境的(如開發(fā)盒卸、測試、生產(chǎn))次氨,而每個應(yīng)用在不同環(huán)境的同一配置(如數(shù)據(jù)庫配置)的值是不一樣的蔽介。
- 步驟2中我們可以切換不同命名空間來發(fā)布不同配置,命名空間下類似 UUID 的一串便是每個命名空間的唯一ID。
- 步驟3中我們可以點擊發(fā)布配置虹蓄,其中 DataId 和 group 是必填項
完成上面三個步驟后我們便可以看到生成了一條剛剛配置過的信息
獲取配置
然后我們在項目中便可讀取配置中的內(nèi)容犀呼,步驟如下:
- 步驟1
在 pom 文件中引入 nacos-client包:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.3</version>
</dependency>
- 步驟2
通過 nacos-client 包下提供的 API,來獲取配置:
public static void main(String[] args) throws NacosException {
//使用nacos client遠程獲取nacos服務(wù)上的配置信息
//nacos server地址
String serverAddr = "127.0.0.1:8848";
//data id
String dataId = "application-dev.properties";
//group
String group = "DEFAULT_GROUP";
//namespace
String namespace = "dfa1c276-69f7-47d6-9903-6850b9c248f7";
Properties properties =new Properties();
properties.put("serverAddr",serverAddr);
properties.put("namespace",namespace);
//獲取配置
ConfigService configService = NacosFactory.createConfigService(properties);
// String dataId, String group, long timeoutMs
String config = configService.getConfig(dataId, group, 5000);
System.out.println(config);
}
/* OUTPUT:
spring.datasource.mysql.driverClassName = com.mysql.cj.jdbc.Driver
*/
配置的管理模型如下圖所示:
- 命名空間(NameSpace)
命名空間(NameSpace)用于不同環(huán)境(開發(fā)環(huán)境薇组、測試環(huán)境和生產(chǎn)環(huán)境)的配置隔離外臂。不同的命名空間下,可以存在相同名稱的配置分組(Group)或配置集律胀。
- 配置分組(Group)
配置分組是對配置集進行分組宋光,不同的配置分組下可以有相同的配置集(DateId)。默認的配置分組名稱為 DEFAULT_GROUP炭菌。用于區(qū)分不同的項目或應(yīng)用罪佳。
- 配置集(DataId)
在系統(tǒng)中,一個配置文件通常就是一個 配置集黑低,一個配置集可以包含了系統(tǒng)的各種配置信息赘艳,例如一個配置集可能包含了數(shù)據(jù)源、線程池克握、日志級別等配置項蕾管。每個配置集都可以定義一個有意義的名稱。
分布式配置
在了解通過 Nacos 集中管理多個服務(wù)的配置之前菩暗,我們先大概了解下以下概念:
傳統(tǒng)單體架構(gòu)
所有功能模塊打包到一起并放在一個 web 容器中運行掰曾,所有功能模塊使用同一個數(shù)據(jù)庫。
特點:
- 開發(fā)效率高
- 容易測試
- 容易部署
缺點:
- 復(fù)雜性會逐漸變高勋眯,維護性逐漸變差
- 版本迭代逐漸變慢
- 阻礙技術(shù)創(chuàng)新
- 無法按需伸縮
微服務(wù)架構(gòu)
微服務(wù)簡單來說就是將一個項目拆分成多個服務(wù)婴梧。每一個微服務(wù)都是完整的應(yīng)用,都有自己的業(yè)務(wù)邏輯和數(shù)據(jù)庫客蹋。每一個業(yè)務(wù)模塊都是用獨立的服務(wù)完成,這種微服務(wù)架構(gòu)模式也影響了應(yīng)用和數(shù)據(jù)庫之間的關(guān)系孽江,不像傳統(tǒng)多個業(yè)務(wù)模塊共享一個數(shù)據(jù)庫讶坯,微服務(wù)架構(gòu)每個服務(wù)都有自己的數(shù)據(jù)庫。
優(yōu)點:
- 分而治之岗屏,職責(zé)單一
- 可伸縮
- 局部容易修改辆琅、替換、部署这刷,有利于持續(xù)集成和快速迭代
- 不會受限于任何技術(shù)棧
Nacos
話不多說婉烟,我們直接用代碼來演示配置中心的用法:
- 步驟1 - 發(fā)布配置
我們在Nacos主頁中創(chuàng)建兩個配置文件:
service_a.properties:
service_b.properties:
- 步驟2 - 創(chuàng)建父工程
pom.xml 如下:
- 步驟3 - 創(chuàng)建子模塊service-a
pom.xml 如下:
bootstrap.yml如下:
- 步驟4 - 創(chuàng)建子模塊service-b
pom.xml 如下:
bootstrap.yml如下:
工程目錄結(jié)構(gòu)如下:
ConfigController如下:
service-a運行結(jié)果為:
service-b運行結(jié)果為:
可以看到通過以上步驟成功獲取到了我們在nacos中創(chuàng)建配置文件的內(nèi)容。其中我們需要注意關(guān)鍵的步驟為:1. 引入 spring-cloud-alibaba-dependencies 和 spring-cloud-starter-alibaba-nacos-config 的 jar包暇屋。 2. 我們在 resources 下創(chuàng)建的配置文件必須是 bootstrap 而不能是 application 3. bootstrap.yml中的配置
bootstrap.yml另有玄機似袁?
我們在上面看到配置核心點在于:
spring:
application:
name: service_a
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # 配置中心地址
# spring.application.name + file-extension = service_a.properties
file-extension: properties # dataid名稱的后綴
namespace: dfa1c276-69f7-47d6-9903-6850b9c248f7 # 指定具體的namespace
group: TEST_GROUP
這個是讀取指定配置組下的指定配置,我們都知道開發(fā)講究高內(nèi)聚低耦合,如果有相同的配置項我們可以獨立抽取成一個文件昙衅,這樣我們就得引入多個配置文件扬霜,當(dāng)然nacos也是支持的,配置如下:
spring:
application:
name: service_a
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # 配置中心地址
# spring.application.name + file-extension = service_a.properties
file-extension: properties # dataid名稱的后綴
namespace: dfa1c276-69f7-47d6-9903-6850b9c248f7 # 指定具體的namespace
group: TEST_GROUP
# 通過 ext-config 來配合使用
ext-config[0]:
data-id: service-common_1.properties
ext-config[1]:
data-id: service-common_2.properties
group: GLOBALE_GROUP
ext-config[2]:
data-id: service-common_3.properties
group: REFRESH_GROUP
refresh: true #動態(tài)刷新配置
注意ext-config 得從 0 開始而涉,其中 refresh 標(biāo)簽用來實現(xiàn)動態(tài)刷新著瓶,就是配置文件修改后,項目不用重啟也能實時讀取最新的配置文件啼县。
可能你會覺得通過 ext-config 有點麻煩材原,需要寫那么多,為了簡化我們還可以使用 shared-dataids 和 refreshable-dataids 實現(xiàn)同上一樣的功能季眷,如下:
spring:
application:
name: service_a
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # 配置中心地址
# spring.application.name + file-extension = service_a.properties
file-extension: properties # dataid名稱的后綴
namespace: dfa1c276-69f7-47d6-9903-6850b9c248f7 # 指定具體的namespace
group: TEST_GROUP
shared-dataids: service-common_1.properties,service-common_2.properties,service-common_3.properties
refreshable-dataids: service-common_3.properties
通過 shared-dataids 來支持多個共享 Data Id 的配置余蟹,多個之間用逗號隔開。 通過 refreshable-dataids 來支持哪些共享配置的 Data Id 在配置變化時瘟裸,應(yīng)用中是否可動態(tài)刷新客叉,感知到最新的配置值,多個 Data Id 之間用逗號隔開话告。如果沒有明確配置兼搏,默認情況下所有共享配置的 Data Id 都不支持動態(tài)刷新。
配置項的優(yōu)先級
#方式1
file-extension: properties # dataid名稱的后綴
namespace: dfa1c276-69f7-47d6-9903-6850b9c248f7 # 指定具體的namespace
group: TEST_GROUP
#方式2
ext-config[0]:
data-id: service-common_1.properties
ext-config[1]:
data-id: service-common_2.properties
group: GLOBALE_GROUP
ext-config[2]:
data-id: service-common_3.properties
group: REFRESH_GROUP
refresh: true #動態(tài)刷新配置
#方式3
shared-dataids: service-common_1.properties,service-common_2.properties,service-common_3.properties
refreshable-dataids: service-common_3.properties
以上我們了解到了 nacos 有三種配置方式沙郭,其中優(yōu)先級:
方式1 > 方式2(內(nèi)部比較:n越大佛呻,優(yōu)先級越高) > 方式3
以上我們已經(jīng)了解完了Nacos作為配置中心的使用,接下來我們來看看Nacos作為服務(wù)的注冊中心有什么奧秘病线!
三吓著、服務(wù)發(fā)現(xiàn)
什么是服務(wù)發(fā)現(xiàn)
在微服務(wù)架構(gòu)中,整個系統(tǒng)會按職責(zé)劃分為多個服務(wù)送挑,通過服務(wù)之間且做來實現(xiàn)業(yè)務(wù)目標(biāo)绑莺。這樣在我們的代碼中免不了要進行服務(wù)間的遠程調(diào)用,服務(wù)的消費方要調(diào)用服務(wù)的生產(chǎn)方惕耕,為了完成這一次請求纺裁,消費方需要知道服務(wù)生產(chǎn)方的網(wǎng)絡(luò)位置(IP地址和端口號)
服務(wù)發(fā)現(xiàn)中心對比
服務(wù)發(fā)現(xiàn)入門
百說不如一練,咱們話不多說司澎,直接上代碼:
- 步驟1 - 新建父工程
pom.xml如下:
- 步驟2 - 新建服務(wù)生產(chǎn)者
pom.xml如下:
application.yml如下:
啟動類如下:
ProviderController.java如下:
以上便是生成者的代碼欺缘,其中關(guān)鍵點在于:1. 引入 spring-cloud-starter-alibaba-nacos-discovery jar包 2. 在啟動類標(biāo)注 @EnableDiscoveryClient 注解 3. 在 application.yml 中配置nacos服務(wù)中心的地址 4. 在 controller 中暴露服務(wù)
- 步驟3 - 新建服務(wù)消費者
pom.xml如下:
application.yml如下:
啟動類如下:
ConsumerController.java如下:
以上便是消費者的代碼,其中關(guān)鍵點在于:1. 引入 spring-cloud-starter-alibaba-nacos-discovery jar包 2. 在啟動類標(biāo)注 @EnableDiscoveryClient 注解 3. 在 application.yml 中配置nacos服務(wù)中心的地址 4. 在 controller 中使用RestTemplate 調(diào)用服務(wù)挤安。
以上我們可以看到在Nacos中注冊了兩個服務(wù)谚殊,分別是 service-provider 和 service-consumer,我們也可以在Nacos控制臺看到:
同樣蛤铜,服務(wù)注冊也支持命名空間的隔離嫩絮,我們只需在application.yml中添加配置:
server:
port: 8083
spring:
application:
name: service-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 命名空間
namespace: dfa1c276-69f7-47d6-9903-6850b9c248f7
cluster-name: DEFAULT
Feign 的使用
Feign是Netflix開發(fā)的聲明式丛肢、模板化的HTTP客戶端,F(xiàn)eign可以幫助我們更快捷絮记、優(yōu)雅地調(diào)用HTTP API摔踱。
Feign的使用方式也十分簡單,幾個步驟如下:
- 步驟1
聲明 Feign 客戶端:
@FeignClient(value = "service-provider") //生產(chǎn)者名稱
public interface ConsumerService {
@GetMapping("/getData")
String getDate();
}
- 步驟2
在 啟動類 添加 @EnableFeignClients 注解
- 步驟3
在 controller 層進行調(diào)用:
@RestController
public class ConsumerController {
@Autowired
private ConsumerService consumerService;
@GetMapping("/getData")
public String getData() {
String date = consumerService.getDate();
return "consumer consumer ---" + date;
}
}
結(jié)果:
簡單的使用,減少了與業(yè)務(wù)無關(guān)的 HTTP 請求相關(guān)代碼的編寫,使業(yè)務(wù)邏輯清晰嫡霞。