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