一文学搞懂阿里开源的微服务新贵Nacos!
正式開始之前我們先來(lái)了解一下什么是 Nacos?
官網(wǎng)給出的回答:
“Nacos 致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos 提供了一組簡(jiǎn)單易用的特性集,幫助您實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置管理、服務(wù)及流量管理。Nacos 幫助您更敏捷和容易地構(gòu)建、交付和管理微服務(wù)平臺(tái)。Nacos 是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu)(例如微服務(wù)范式、云原生范式)的服務(wù)基礎(chǔ)設(shè)施。
”綜上所述,得出 Nacos 的四大特性:
服務(wù)發(fā)現(xiàn)與服務(wù)健康檢查
動(dòng)態(tài)配置管理
動(dòng)態(tài)DNS服務(wù)
服務(wù)和元數(shù)據(jù)管理
「附圖:」
源網(wǎng)侵刪看到Nacos支持這么多主流的開源生態(tài),是心動(dòng)的感覺!
一、入門基操
使用方式
Nacos的使用方式也極其簡(jiǎn)單,以下為 「windows」 下安裝方式
步驟1
點(diǎn)擊下載地址 下載最新穩(wěn)定版本
步驟2
雙擊 「bin」 目錄下的 startup.cmd 啟動(dòng)服務(wù)器
步驟3
通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8848/nacos 打開 「nacos」 控制臺(tái)登錄頁(yè)面,默認(rèn)用戶名密碼皆為:nacos,登錄成功后便可訪問(wèn)主頁(yè)面。
擴(kuò)展使用
發(fā)布配置
我們可以通過(guò) 「地址」 的方式發(fā)布配置:http://127.0.0.1:8848/nacos/v1/cs/configs,使用 「postman」 進(jìn)行測(cè)試:
獲取配置
我們可以通過(guò) 「地址」 的方式獲取配置:http://127.0.0.1:8848/nacos/v1/cs/configs,使用 「postman」 進(jìn)行測(cè)試:
發(fā)布服務(wù)
我們可以通過(guò) 「地址」 進(jìn)行服務(wù)注冊(cè):http://127.0.0.1:8848/nacos/v1/ns/instance,使用 「postman」 進(jìn)行測(cè)試:
服務(wù)發(fā)現(xiàn)
我們可以通過(guò) 「地址」 發(fā)現(xiàn)服務(wù):http://127.0.0.1:8848/nacos/v1/ns/instance/list,
使用 「postman」 進(jìn)行測(cè)試:
外部數(shù)據(jù)庫(kù)支持
nacos默認(rèn)是使用嵌入式數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ),如果我們要使用外部 「mysql」 存儲(chǔ) nacos數(shù)據(jù),進(jìn)行以下步驟:
「步驟1」
安裝Mysql(5.6.5 ~ 8 之間的版本)
「步驟2」
初始化 「mysql」 數(shù)據(jù)庫(kù),新建數(shù)據(jù)庫(kù) nacos,然后加載 conf/nacos-mysql.sql
「步驟3」
修改 conf/application.properties文件,添加 mysql 數(shù)據(jù)源的配置,然后重啟,便可生效
二、配置管理
在上述中我們已經(jīng)知道Nacos其中的一個(gè)功能便是用于配置中心。配置中心是在微服務(wù)架構(gòu)中,當(dāng)系統(tǒng)從一個(gè)單體應(yīng)用被拆分為分布式系統(tǒng)上一個(gè)個(gè)服務(wù)節(jié)點(diǎn)時(shí),配置文件也必須隨著遷移而分割,這樣配置就分散了,而且各個(gè)配置中也存在互相冗余的部分。
配置中心所擔(dān)任的角色:
配置中心將配置從各應(yīng)用中剝離出來(lái),對(duì)配置進(jìn)行統(tǒng)一管理,應(yīng)用自身不需要自己去管理配置
從圖中我們總結(jié)流程如下:
用戶在配置中心更新配置信息
A 服務(wù)和 B 服務(wù)及時(shí)得到配置更新通知,從配置中心獲取更新
發(fā)布配置
步驟1中我們可以創(chuàng)建命名空間,命名空間(NameSpace)是用于隔離多個(gè)環(huán)境的(如開發(fā)、測(cè)試、生產(chǎn)),而每個(gè)應(yīng)用在不同環(huán)境的同一配置(如數(shù)據(jù)庫(kù)配置)的值是不一樣的。
步驟2中我們可以切換不同命名空間來(lái)發(fā)布不同配置,命名空間下類似 UUID 的一串便是每個(gè)命名空間的唯一ID。
步驟3中我們可以點(diǎn)擊發(fā)布配置,其中 「DataId」 和 「group」 是必填項(xiàng)
「完成上面三個(gè)步驟后我們便可以看到生成了一條剛剛配置過(guò)的信息」
獲取配置
然后我們?cè)陧?xiàng)目中便可讀取配置中的內(nèi)容,步驟如下:
步驟1
在 pom 文件中引入 nacos-client包:
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>1.1.3</version> </dependency>步驟2
通過(guò) nacos-client 包下提供的 API,來(lái)獲取配置:
public?static?void?main(String[]?args)?throws?NacosException?{//使用nacos?client遠(yuǎn)程獲取nacos服務(wù)上的配置信息//nacos?server地址String?serverAddr?=?"127.0.0.1:8848";//data?idString?dataId?=?"application-dev.properties";//groupString?group?=?"DEFAULT_GROUP";//namespaceString?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?timeoutMsString?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)境、測(cè)試環(huán)境和生產(chǎn)環(huán)境)的配置隔離。不同的命名空間下,可以存在相同名稱的配置分組(Group)或配置集。
「配置分組(Group)」
配置分組是對(duì)配置集進(jìn)行分組,不同的配置分組下可以有相同的配置集(DateId)。默認(rèn)的配置分組名稱為 「DEFAULT_GROUP」。用于區(qū)分不同的項(xiàng)目或應(yīng)用。
「配置集(DataId)」
在系統(tǒng)中,一個(gè)配置文件通常就是一個(gè) 「配置集」,一個(gè)配置集可以包含了系統(tǒng)的各種配置信息,例如一個(gè)配置集可能包含了數(shù)據(jù)源、線程池、日志級(jí)別等配置項(xiàng)。每個(gè)配置集都可以定義一個(gè)有意義的名稱。
分布式配置
在了解通過(guò) Nacos 集中管理多個(gè)服務(wù)的配置之前,我們先大概了解下以下概念:
「?jìng)鹘y(tǒng)單體架構(gòu)」
所有功能模塊打包到一起并放在一個(gè) web 容器中運(yùn)行,所有功能模塊使用同一個(gè)數(shù)據(jù)庫(kù)。
「特點(diǎn)」:
開發(fā)效率高
容易測(cè)試
容易部署
「缺點(diǎn):」
復(fù)雜性會(huì)逐漸變高,維護(hù)性逐漸變差
版本迭代逐漸變慢
阻礙技術(shù)創(chuàng)新
無(wú)法按需伸縮
微服務(wù)架構(gòu)
微服務(wù)簡(jiǎn)單來(lái)說(shuō)就是將一個(gè)項(xiàng)目拆分成多個(gè)服務(wù)。每一個(gè)微服務(wù)都是完整的應(yīng)用,都有自己的業(yè)務(wù)邏輯和數(shù)據(jù)庫(kù)。每一個(gè)業(yè)務(wù)模塊都是用獨(dú)立的服務(wù)完成,這種微服務(wù)架構(gòu)模式也影響了應(yīng)用和數(shù)據(jù)庫(kù)之間的關(guān)系,不像傳統(tǒng)多個(gè)業(yè)務(wù)模塊共享一個(gè)數(shù)據(jù)庫(kù),微服務(wù)加購(gòu)每個(gè)服務(wù)都有自己的數(shù)據(jù)庫(kù)。
「優(yōu)點(diǎn):」
分而治之,職責(zé)單一
可伸縮
局部容易修改、替換、部署,有利于持續(xù)集成和快速迭代
不會(huì)受限于任何技術(shù)棧
Nacos
話不多說(shuō),我們直接用代碼來(lái)演示配置中心的用法:
「步驟1 - 發(fā)布配置」
我們?cè)贜acos主頁(yè)中創(chuàng)建兩個(gè)配置文件:
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運(yùn)行結(jié)果為:
service-b運(yùn)行結(jié)果為:
可以看到通過(guò)以上步驟成功獲取到了我們?cè)趎acos中創(chuàng)建配置文件的內(nèi)容。其中我們需要注意關(guān)鍵的步驟為:「1.」 引入 spring-cloud-alibaba-dependencies 和 spring-cloud-starter-alibaba-nacos-config 的 「jar包」。「2.」 我們?cè)?resources 下創(chuàng)建的配置文件必須是 bootstrap 而不能是 application 「3.」 bootstrap.yml中的配置
「bootstrap.yml另有玄機(jī)?」
我們?cè)谏厦婵吹脚渲煤诵狞c(diǎn)在于:
spring:application:name:?service_acloud:nacos:config:server-addr:?127.0.0.1:8848?????????????????????#?配置中心地址#?spring.application.name?+?file-extension?=?service_a.propertiesfile-extension:?properties??????????????????????#?dataid名稱的后綴namespace:?dfa1c276-69f7-47d6-9903-6850b9c248f7?#?指定具體的namespacegroup:?TEST_GROUP這個(gè)是讀取指定配置組下的指定配置,我們都知道開發(fā)講究高內(nèi)聚低耦合,如果有相同的配置項(xiàng)我們可以獨(dú)立抽取成一個(gè)文件,這樣我們就得引入多個(gè)配置文件,當(dāng)然nacos也是支持的,配置如下:
spring:application:name:?service_acloud:nacos:config:server-addr:?127.0.0.1:8848?????????????????????#?配置中心地址#?spring.application.name?+?file-extension?=?service_a.propertiesfile-extension:?properties??????????????????????#?dataid名稱的后綴namespace:?dfa1c276-69f7-47d6-9903-6850b9c248f7?#?指定具體的namespacegroup:?TEST_GROUP#?通過(guò)?ext-config?來(lái)配合使用ext-config[0]:data-id:?service-common_1.propertiesext-config[1]:data-id:?service-common_2.propertiesgroup:?GLOBALE_GROUPext-config[2]:data-id:?service-common_3.propertiesgroup:?REFRESH_GROUPrefresh:?true??#動(dòng)態(tài)刷新配置注意ext-config 得從 0 開始,其中 「refresh」 標(biāo)簽用來(lái)實(shí)現(xiàn)動(dòng)態(tài)刷新,就是配置文件修改后,項(xiàng)目不用重啟也能實(shí)時(shí)讀取最新的配置文件。
可能你會(huì)覺得通過(guò) ext-config 有點(diǎn)麻煩,需要寫那么多,為了簡(jiǎn)化我們還可以使用 shared-dataids 和 refreshable-dataids 實(shí)現(xiàn)同上一樣的功能,如下:
spring:application:name:?service_acloud:nacos:config:server-addr:?127.0.0.1:8848?????????????????????#?配置中心地址#?spring.application.name?+?file-extension?=?service_a.propertiesfile-extension:?properties??????????????????????#?dataid名稱的后綴namespace:?dfa1c276-69f7-47d6-9903-6850b9c248f7?#?指定具體的namespacegroup:?TEST_GROUPshared-dataids:?service-common_1.properties,service-common_2.properties,service-common_3.propertiesrefreshable-dataids:?service-common_3.properties通過(guò) shared-dataids 來(lái)支持多個(gè)共享 Data Id 的配置,多個(gè)之間用逗號(hào)隔開。通過(guò) refreshable-dataids 來(lái)支持哪些共享配置的 Data Id 在配置變化時(shí),應(yīng)用中是否可動(dòng)態(tài)刷新,感知到最新的配置值,多個(gè) Data Id 之間用逗號(hào)隔開。如果沒有明確配置,默認(rèn)情況下所有共享配置的 Data Id 都不支持動(dòng)態(tài)刷新。
「配置項(xiàng)的優(yōu)先級(jí)」
#方式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??#動(dòng)態(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)先級(jí):
「方式1 > 方式2(內(nèi)部比較:n越大,優(yōu)先級(jí)越高) > 方式3」
以上我們已經(jīng)了解完了Nacos作為配置中心的使用,接下來(lái)我們來(lái)看看Nacos作為服務(wù)的注冊(cè)中心有什么奧秘!
三、服務(wù)發(fā)現(xiàn)
什么是服務(wù)發(fā)現(xiàn)
在微服務(wù)架構(gòu)中,整個(gè)系統(tǒng)會(huì)按職責(zé)劃分為多個(gè)服務(wù),通過(guò)服務(wù)之間且做來(lái)實(shí)現(xiàn)業(yè)務(wù)目標(biāo)。這樣在我們的代碼中免不了要進(jìn)行服務(wù)間的遠(yuǎn)程調(diào)用,服務(wù)的消費(fèi)方要調(diào)用服務(wù)的生產(chǎn)方,為了完成這一次請(qǐng)求,消費(fèi)方需要知道服務(wù)生產(chǎn)方的網(wǎng)絡(luò)位置(「IP地址和端口號(hào)」)
「服務(wù)發(fā)現(xiàn)中心對(duì)比」
| 一致性協(xié)議 | 支持 AP 和 CP 模型 | AP 模型 | CP模型 | CP模型 |
| 健康檢查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | Keep Alive |
| 負(fù)載均衡器 | 權(quán)重/metadate/Selector | Ribbon | Fabio | - |
| 雪崩保護(hù) | 有 | 有 | 無(wú) | 無(wú) |
| 自動(dòng)注銷實(shí)例 | 支持 | 支持 | 不支持 | 支持 |
| 訪問(wèn)協(xié)議 | HTTP/DNS | HTTP | HTTP/DNS | TCP |
| 監(jiān)聽支持 | 支持 | 支持 | 支持 | 支持 |
| 多數(shù)據(jù)中心 | 支持 | 支持 | 支持 | 不支持 |
| 跨注冊(cè)中心同步 | 支持 | 不支持 | 支持 | 不支持 |
| SpringCloud集成 | 支持 | 支持 | 支持 | 不支持 |
| Dubbo 集成 | 支持 | 不支持 | 不支持 | 支持 |
| K8s 集成 | 支持 | 不支持 | 支持 | 不支持 |
服務(wù)發(fā)現(xiàn)入門
百說(shuō)不如一練,咱們?cè)挷欢嗾f(shuō),直接上代碼:
「步驟1 - 新建父工程」
pom.xml如下:
「步驟2 - 新建服務(wù)生產(chǎn)者」
pom.xml如下:
application.yml如下:
啟動(dòng)類如下:
ProviderController.java如下:
以上便是生成者的代碼,其中關(guān)鍵點(diǎn)在于:「1.」 引入 spring-cloud-starter-alibaba-nacos-discovery jar包 「2.」 在啟動(dòng)類標(biāo)注 @EnableDiscoveryClient 注解 「3.」 在 application.yml 中配置nacos服務(wù)中心的地址 「4.」 在 controller 中暴露服務(wù)
「步驟3 - 新建服務(wù)消費(fèi)者」
pom.xml如下:
application.yml如下:
啟動(dòng)類如下:
ConsumerController.java如下:
以上便是消費(fèi)者的代碼,其中關(guān)鍵點(diǎn)在于:「1.」 引入 spring-cloud-starter-alibaba-nacos-discovery jar包 「2.」 在啟動(dòng)類標(biāo)注 @EnableDiscoveryClient 注解 「3.」 在 application.yml 中配置nacos服務(wù)中心的地址 「4.」 在 controller 中使用RestTemplate 調(diào)用服務(wù)。
以上我們可以看到在Nacos中注冊(cè)了兩個(gè)服務(wù),分別是 service-provider 和 service-consumer,我們也可以在Nacos控制臺(tái)看到:
同樣,服務(wù)注冊(cè)也支持命名空間的隔離,我們只需在application.yml中添加配置:
server:port:?8083spring:application:name:?service-consumercloud:nacos:discovery:server-addr:?127.0.0.1:8848#?命名空間namespace:?dfa1c276-69f7-47d6-9903-6850b9c248f7cluster-name:?DEFAULTFeign 的使用
Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端,Feign可以幫助我們更快捷、優(yōu)雅地調(diào)用HTTP API。
Feign的使用方式也十分簡(jiǎn)單,幾個(gè)步驟如下:
「步驟1」
聲明 Feign 客戶端:
@FeignClient(value?=?"service-provider")?//生產(chǎn)者名稱 public?interface?ConsumerService?{@GetMapping("/getData")String?getDate(); }「步驟2」
在 「啟動(dòng)類」 添加 @EnableFeignClients 注解
「步驟3」
在 controller 層進(jìn)行調(diào)用:
@RestController public?class?ConsumerController?{@Autowiredprivate?ConsumerService?consumerService;@GetMapping("/getData")public?String?getData()?{String?date?=?consumerService.getDate();return?"consumer?consumer?---"?+?date;} }「結(jié)果」:
簡(jiǎn)單的使用,減少了與業(yè)務(wù)無(wú)關(guān)的 HTTP 請(qǐng)求相關(guān)代碼的編寫,使業(yè)務(wù)邏輯清晰。
以上便是 微服務(wù)中 Nacos 的大概介紹啦,希望看到這里的你也有所收獲!路漫漫,與你一同求索~
往期推薦求求你,別再用wait和notify了!
2020年終總結(jié):新的“開始”
提高生產(chǎn)力,最全 MyBatisPlus 講解!
關(guān)注我,每天陪你進(jìn)步一點(diǎn)點(diǎn)!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的一文学搞懂阿里开源的微服务新贵Nacos!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 面试官 | AJAX请求为什么不安全?
- 下一篇: 「递归」的正确打开方式,看不懂你打我~