前言
從 2017 年底 Java 開(kāi)發(fā)領(lǐng)域使用最廣的 RPC 框架 Dubbo 開(kāi)啟重新更新維護(hù)之路開(kāi)始抖韩,阿里巴巴為打造 Dubbo 微服務(wù)生態(tài)持續(xù)開(kāi)源了 Sentinel扯罐,Nacos,Seata 等微服務(wù)中間件框架,并且推出了 Spring Cloud Alibaba 來(lái)提供微服務(wù)開(kāi)發(fā)的一站式解決方案稍走,阿里巴巴在 Java 社區(qū)持續(xù)活躍起來(lái),也為 Java 微服務(wù)開(kāi)發(fā)注入了新的活力。
本篇文章將重點(diǎn)學(xué)習(xí)微服務(wù)組件 Nacos 作為注冊(cè)中心的功能和用法誊役,Nacos 是阿里巴巴于 2018 年 7 月份新開(kāi)源的項(xiàng)目获列。
關(guān)于 Nacos 名字:前四個(gè)字母分別為 Naming 和 Configuration 的前兩個(gè)字母,最后的
s
為Service蛔垢。
本文主要內(nèi)容涉及如下:
- Nacos 基本介紹
- 為什么使用 Nacos
- 最新版本 Nacos 與 Rest/Dubbo 服務(wù)的注冊(cè)與發(fā)現(xiàn)集成
關(guān)于 Nacos /nɑ:k??s/
一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)击孩、配置管理和服務(wù)管理平臺(tái)。
上面這句話(huà)摘自 Nacos 官方首頁(yè)鹏漆,是對(duì) Nacos 整體功能的總結(jié)巩梢。
簡(jiǎn)單來(lái)說(shuō) Nacos 就是注冊(cè)中心 + 配置中心的組合,提供簡(jiǎn)單易用的特性集艺玲,幫助我們解決微服務(wù)開(kāi)發(fā)必會(huì)涉及到的服務(wù)注冊(cè)與發(fā)現(xiàn)涡上,服務(wù)配置似谁,服務(wù)管理等問(wèn)題。Nacos 還是 Spring Cloud Alibaba 組件之一,負(fù)責(zé)服務(wù)注冊(cè)與發(fā)現(xiàn)堵腹。
首先來(lái)看下官方對(duì) Nacos 的特性描述:
- 服務(wù)發(fā)現(xiàn)和服務(wù)健康監(jiān)測(cè)
- 動(dòng)態(tài)配置服務(wù)
- 動(dòng)態(tài) DNS 服務(wù)
- 服務(wù)及其元數(shù)據(jù)管理
- 不斷新增...
可以發(fā)現(xiàn)所有特性都離不開(kāi)服務(wù)這一詞,服務(wù) (Service) 是 Nacos 世界中的一等公民峡眶,說(shuō)明了服務(wù)是 Nacos 中最主要的角色覆山。
為什么是 Nacos
現(xiàn)在的微服務(wù)生態(tài)中,已經(jīng)有很多服務(wù)注冊(cè)與發(fā)現(xiàn)的開(kāi)源組件端幼,如 Eurka礼烈,ZooKeeper,Consul婆跑,為什么還要用 Nacos 呢此熬,我們看下這些框架的簡(jiǎn)單對(duì)比:
服務(wù)注冊(cè)與發(fā)現(xiàn)框架 | CAP 模型 | 控制臺(tái)管理 | 社區(qū)活躍度 |
---|---|---|---|
Eureka | AP | 支持 | 低 (2.x 版本閉源) |
Zookeeper | CP | 不支持 | 中 |
Consul | CP | 支持 | 高 |
Nacos | AP | 支持 | 高 |
據(jù)說(shuō) Nacos 在阿里巴巴內(nèi)部有超過(guò) 10 萬(wàn)的實(shí)例運(yùn)行,已經(jīng)過(guò)了類(lèi)似雙十一等各種大型流量的考驗(yàn)滑进。
相比之下犀忱,目前的 Nacos 無(wú)論是部署扶关,還是使用上都簡(jiǎn)單上手阴汇,更重要的是文檔資料齊全,社區(qū)活躍度高节槐。
并且 Nacos 與目前主流的開(kāi)源生態(tài)都提供了很好的支持:
- Nacos 是專(zhuān)為 Dubbo 而生的注冊(cè)中心與配置中心
- Nacos 會(huì)完全兼容 Spring Cloud
- Nacos 支持 Service Mesh 集成搀庶,Kubernetes 集成
除此之外,阿里巴巴正在通過(guò) Dubbo + Nacos 以及一系列開(kāi)源項(xiàng)目打造服務(wù)發(fā)現(xiàn)铜异、服務(wù)及流量管理哥倔、服務(wù)共享平臺(tái),未來(lái)還在不斷地發(fā)展和演進(jìn),相信未來(lái)會(huì)有更多的地方上使用 Nacos揍庄。
Nacos 實(shí)戰(zhàn)
單機(jī)部署
準(zhǔn)備環(huán)境
Nacos 依賴(lài) Java 環(huán)境來(lái)運(yùn)行咆蒿,并且需要對(duì) Nacos 代碼構(gòu)建生成可執(zhí)行程序時(shí),還要有 Maven 環(huán)境,所以部署前需要保證環(huán)境要求:
- 64 bit OS沃测,支持 Linux/Unix/Mac/Windows缭黔,推薦選用 Linux/Unix/Mac。
- 64 bit JDK 1.8+
- Maven 3.2.x+
下載安裝
當(dāng)前最新的 Nacos 版本為 1.0.1蒂破,Maven 方式打包后會(huì)在當(dāng)前目錄 distribution/target
下生成兩個(gè)壓縮包 nacos-server-1.0.1.tar.gz
和 nacos-server-1.0.1.zip
试浙,任意解壓一個(gè)使用即可。
解壓運(yùn)行
這里 Nacos 單機(jī)部署方式使用命令 -m standalone
寞蚌,如果是 Windows 命令田巴,可以直接雙擊 startup.cmd
文件即可。
當(dāng)控制臺(tái)出現(xiàn) Nacos 字母挟秤,并且出現(xiàn) Nacos started successfully in stand alone mode
提示時(shí)就說(shuō)明了 Nacos 服務(wù)端啟動(dòng)成功壹哺,控制臺(tái)上也直接給出了當(dāng)前可訪(fǎng)問(wèn)的 Nacos 控制臺(tái)地址 http://{ip}:8848/nacos/index.html
,點(diǎn)擊就進(jìn)入了 Nacos 的可視化管理界面艘刚,需要賬號(hào)密碼登錄訪(fǎng)問(wèn)管宵,默認(rèn)都為 nacos
。
登錄之后就能在網(wǎng)站側(cè)邊欄上看到 Nacos 的主要功能菜單:配置管理攀甚,服務(wù)管理箩朴,集群管理,命名空間秋度。對(duì)于服務(wù)注冊(cè)與發(fā)現(xiàn)功能來(lái)說(shuō)炸庞,我們只要看關(guān)注服務(wù)管理即可。
服務(wù)管理下目前只有一個(gè)名為服務(wù)列表的子菜單荚斯,展示的內(nèi)容也比較簡(jiǎn)單埠居,包含服務(wù)名稱(chēng),組別事期,集群數(shù)目滥壕,總的實(shí)例數(shù),運(yùn)行中的實(shí)例數(shù)兽泣。
當(dāng)有新的服務(wù)通過(guò) Nacos 客戶(hù)端注冊(cè)到 Nacos 上時(shí)列表項(xiàng)就會(huì)增加绎橘,我們還可以通過(guò)操作欄的按鈕進(jìn)行對(duì)服務(wù)的詳情查看和編輯。
集群部署
相比 Nacos 簡(jiǎn)單的單機(jī)部署唠倦,集群部署方式稍微麻煩一些称鳞,跟著官方文檔走還是有點(diǎn)小坑,還需要自己額外的調(diào)整牵敷。 為了用于生產(chǎn)環(huán)境胡岔,必須確保 Nacos 的高可用法希,所以還是有必要實(shí)踐下集群部署的操作枷餐。
準(zhǔn)備環(huán)境跟單機(jī)部署相同,額外的要求就是 Nacos 需要 3 個(gè)或 3 個(gè)以上 Nacos 節(jié)點(diǎn)構(gòu)成集群苫亦,并且使用 MySQL 作為數(shù)據(jù)源毛肋,主要用于服務(wù)配置的數(shù)據(jù)持久化怨咪。
我們先看下官方推薦的集群部署架構(gòu)圖,通過(guò)域名方式反向代理如 Nginx 來(lái)負(fù)載多個(gè) Nacos 節(jié)點(diǎn) IP润匙,外部客戶(hù)端直接通過(guò)域名訪(fǎng)問(wèn)就可诗眨,不僅可讀性好,而且更換 IP 方便孕讳,最為推薦采用匠楚。
添加集群配置文件
在每個(gè) Nacos 節(jié)點(diǎn)的conf
目錄下,添加配置文件 cluster.conf
厂财,可以參考相同目錄下的 cluster.conf.example
文件芋簿,每行配置一個(gè)節(jié)點(diǎn)的 IP 和端口,如 ip:port
注意:配置文件中不能使用
127.0.0.1
或者localhost
璃饱,需要真實(shí) IP 或者域名与斤,否則啟動(dòng)后服務(wù)無(wú)法注冊(cè)到該集群節(jié)點(diǎn)上, 詳見(jiàn)NACOS ISSUE #1189 。
配置 MySQL 數(shù)據(jù)庫(kù)
Nacos 推薦生產(chǎn)環(huán)境中數(shù)據(jù)庫(kù)使用建議至少主備模式荚恶,或者采用高可用數(shù)據(jù)庫(kù)撩穿。
這里為了簡(jiǎn)化只采用了一個(gè)數(shù)據(jù)庫(kù)。首先新建一個(gè)名為 nacos_config
的數(shù)據(jù)庫(kù)谒撼,使用提供的 sql 語(yǔ)句源文件 導(dǎo)入初始數(shù)據(jù)食寡。
然后在每個(gè) Nacos 節(jié)點(diǎn)的配置文件 conf/application.properties
里添加數(shù)據(jù)庫(kù)連接配置:
最后以集群模式分別啟動(dòng)每個(gè)節(jié)點(diǎn),并且默認(rèn)為后臺(tái)啟動(dòng)廓潜,啟動(dòng)信息需要從 logs/logs/start.out
日志文件中獲取冻河。
當(dāng)日志文件最后出現(xiàn) Nacos started successfully in cluster mode.
一行時(shí),即說(shuō)明集群模式下 Nacos 啟動(dòng)成功茉帅。這時(shí)叨叙,我們也可以通過(guò)登錄任一個(gè) Nacos 控制臺(tái)的集群管理界面看到節(jié)點(diǎn)的信息。
可以從上面看到堪澎,集群下的 Nacos 節(jié)點(diǎn)狀態(tài)分為 FOLLOWER
擂错,LEADER
兩種,跟我們熟悉的主從架構(gòu)相似樱蛤。
到這里钮呀,我們集群方式的搭建也完成了。接下我們就來(lái)看下如何使用 Nacos 進(jìn)行服務(wù)注冊(cè)和發(fā)現(xiàn)吧昨凡。
實(shí)現(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn)
Rest 服務(wù)的注冊(cè)與發(fā)現(xiàn)
服務(wù)提供者創(chuàng)建
創(chuàng)建一個(gè)子項(xiàng)目工程名為 rest-provider
的服務(wù)提供者項(xiàng)目爽醋,pom.xml
配置如下:
注意這里的 spring-cloud-starter-alibaba-nacos-discovery
版本為 0.9.0,采用的是 Nacos 1.0.0 版本的客戶(hù)端便脊,而對(duì)應(yīng) Spring Boot 版本需要為 2.1.x.RELEASE 版本蚂四, 更多版本對(duì)應(yīng)關(guān)系參考:版本說(shuō)明 Wiki
因此我們使用 Spring Cloud Alibaba 最新版本 0.9.0.RELEASE
,對(duì)應(yīng) Spring Cloud Greenwich 版本,父 Maven 項(xiàng)目 POM 配置需要添加如下依賴(lài)管理:
依賴(lài)添加之后,在引導(dǎo)類(lèi)中實(shí)現(xiàn)一個(gè) Rest 請(qǐng)求方法 /echo
遂赠,并且通過(guò) @EnableDiscoveryClient
注解表明是一個(gè) Nacos 客戶(hù)端久妆,而該注解是 Spring Cloud 提供的原生注解,就算切換成 Eureka 作為注冊(cè)中心也是用這個(gè)注解跷睦。
修改子項(xiàng)目配置文件 application.properties
-
spring.application.name
聲明了服務(wù)名稱(chēng) -
spring.cloud.nacos.discovery.server-addr
指定了 Nacos 注冊(cè)中心地址
Nacos Starter 更多配置項(xiàng)信息可以參考 Spring Cloud Alibaba Nacos Discovery
然后通過(guò)引導(dǎo)類(lèi) RestProviderApplication
運(yùn)行項(xiàng)目筷弦,登錄 Nacos Server 控制臺(tái),查看服務(wù)列表即可看到服務(wù)提供者 rest-provider
已經(jīng)注冊(cè)成功抑诸。
服務(wù)消費(fèi)者創(chuàng)建
同樣的方式我們創(chuàng)建一個(gè)服務(wù)消費(fèi)者項(xiàng)目 rest-consumer
烂琴,pom.xml
依賴(lài)和 application.properties
配置與 provider-consumer
一樣, 這里我們顯式地使用 LoadBalanceClient API 和 RestTemplate 結(jié)合的方式來(lái)消費(fèi)服務(wù)。
-
首先在引導(dǎo)類(lèi)中添加
@EnableDiscoveryClient
注解引導(dǎo)類(lèi) -
再創(chuàng)建一個(gè)名為
RestConsumerConfiguration
的 Java 配置類(lèi)蜕乡,注入RestTemplate
监右。RestConsumerConfiguration.java -
創(chuàng)建一個(gè)名為
RestConsumerController
測(cè)試用的 Controller,提供一個(gè)請(qǐng)求方法echo
异希, 如下:RestConsumerController.java -
啟動(dòng)
rest-cosumer
工程后健盒,就可以在 Nacos Server 控制臺(tái)的服務(wù)列表里看到多了一個(gè)名為rest-consumer
的服務(wù),并且直接在瀏覽器訪(fǎng)問(wèn)http://localhost:8082/echo
,就會(huì)看到:image-20190616113423983
使用上看是不是很簡(jiǎn)單呢称簿,其實(shí)和 Eureka 沒(méi)有太大差別扣癣,除了這種方式消費(fèi) Rest 服務(wù)外,Nacos 也支持 Feign 方式憨降,我們來(lái)看下這又是如何使用的吧父虑。
Feign 方式消費(fèi) Rest 服務(wù)
首先需要引入 Feign 客戶(hù)端依賴(lài):
然后引導(dǎo)類(lèi)添加注解 @EnableFeignClients
啟用 Feign 組件功能,編寫(xiě)一個(gè) EchoService
接口,用于調(diào)用遠(yuǎn)程服務(wù):
Get 請(qǐng)求方式的接口方法參數(shù)不能必須使用
@RequestParam
參數(shù)指定請(qǐng)求參數(shù)名稱(chēng)授药,否則 Feign 都會(huì)通過(guò) POST 方式調(diào)用士嚎,得到狀態(tài)碼 405 的錯(cuò)誤。
注解 @FeignClient
指明了調(diào)用的服務(wù)提供方名稱(chēng)悔叽,echo
方法通過(guò) Spring MVC 提供的注解就可以跟服務(wù)提供者的 Rest 接口關(guān)聯(lián)莱衩,執(zhí)行時(shí)就會(huì)調(diào)用對(duì)應(yīng)請(qǐng)求方法。
最后我們只需要編寫(xiě)一個(gè)注入 EchoService
控制器 RestConsumerFeignController
類(lèi)娇澎,提供一個(gè)接口調(diào)用接口笨蚁。
同樣啟動(dòng)后,直接打開(kāi) http://localhost:8082/echo/hi
趟庄,就會(huì)得到瀏覽器如下輸出:
Dubbo 服務(wù)的注冊(cè)與發(fā)現(xiàn)
接下來(lái)括细,我們看下 Dubbo 怎么使用 Nacos 作為服務(wù)注冊(cè)中心,進(jìn)行注冊(cè)與發(fā)現(xiàn)的戚啥,其實(shí)只要用過(guò) ZooKeeper 方式的就會(huì)發(fā)現(xiàn)很簡(jiǎn)單奋单。
首先我們創(chuàng)建一個(gè)子工程 dubbo-serivce
,POM 文件添加依賴(lài)如下:
- 這里我們按照官方推薦使用 2.6.5 版本的 Dubbo 集成 Nacos猫十。
-
dubbo-registry-nacos
是 Dubbo 使用 Nacos 作為注冊(cè)中心的關(guān)鍵依賴(lài)览濒,當(dāng)前版本為 0.0.1呆盖。
接著定義服務(wù)接口 DemoService
:
服務(wù)生產(chǎn)者
還是服務(wù)生產(chǎn)者先來(lái),添加一個(gè)類(lèi) DemoServiceImpl
實(shí)現(xiàn)服務(wù)接口
然后以 XML 配置方式配置 Dubbo匾七,只需要在 dubbo:registry
元素上配置 Nacos 服務(wù)端地址即可絮短。
最后用簡(jiǎn)單類(lèi)BasicProvider
的 main
方法直接啟動(dòng)服務(wù)生產(chǎn)者江兢,保持進(jìn)程常駐昨忆。
正常啟動(dòng)后我們直接在 Nacos 控制臺(tái)的服務(wù)列表里就可以,Dubbo 生產(chǎn)者服務(wù)已經(jīng)成功注冊(cè)到 Nacos 上了杉允,可以通過(guò)詳情看到服務(wù)的具體數(shù)據(jù)邑贴,比如服務(wù)端口,方法之類(lèi)叔磷。
服務(wù)消費(fèi)者
有了服務(wù)生產(chǎn)者拢驾,就來(lái)看下怎么去通過(guò) Nacos 調(diào)用 Dubbo 服務(wù)。
首先改基,通過(guò) XML 配置方式注入用 Dubbo 服務(wù)對(duì)象 DemoService
, 在 dubbo:registry
元素上配置 Nacos 服務(wù)端地址繁疤。
然后編寫(xiě)簡(jiǎn)單類(lèi) BasicConsumer
,在 main
方法中加載 Spring 容器,獲取 DemoService
對(duì)象秕狰,直接進(jìn)行 RCP 調(diào)用稠腊。
運(yùn)行之后,我們可以從 IDE 控制臺(tái)上看到不斷有日志輸出鸣哀,說(shuō)明了通過(guò) Nacos 注冊(cè)中心的Dubbo 服務(wù)調(diào)用成功了架忌。
結(jié)語(yǔ)
本文主要學(xué)習(xí)了解 Nacos,以及使用 Nacos 的服務(wù)注冊(cè)與發(fā)現(xiàn)功能我衬,如何與 Rest 服務(wù)叹放,Dubbo 服務(wù)進(jìn)行集成使用,整體上簡(jiǎn)單易用挠羔,有興趣的朋友也嘗試用下吧井仰。后續(xù)我將繼續(xù)深入研究 Spring Cloud Alibaba 微服務(wù)生態(tài)的組件,歡迎感興趣的小伙伴可以關(guān)注我的微信公眾號(hào)破加,每周一更糕档。
代碼示例
本文所涉及所有代碼片段均在下面?zhèn)}庫(kù)中,歡迎感興趣的小伙伴參考學(xué)習(xí):
nacos-actions:https://github.com/wrcj12138aaa/nacos-actions
環(huán)境支持:
- JDK 8
- Spring Boot 2.1.0
- Maven 3.6.0
參考
- 支持 Dubbo 生態(tài)發(fā)展拌喉,阿里巴巴啟動(dòng)新的開(kāi)源項(xiàng)目 Nacos:https://yq.aliyun.com/articles/604028
- Nacos 官方文檔:https://nacos.io/zh-cn/docs/what-is-nacos.html
- Spring Cloud 服務(wù)發(fā)現(xiàn)新選擇 - Alibaba Nacos Discovery:https://www.bilibili.com/video/av32191103?from=search&seid=8421504995883713886
- 集群部署說(shuō)明:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
- NACOS #1189:https://github.com/alibaba/nacos/issues/1189
- Spring Cloud 中如何使用 Feign 構(gòu)造多參數(shù)的請(qǐng)求:http://www.reibang.com/p/7ce46c0ebe9d