Java微服務新生代之Nacos
- 2019 年 10 月 5 日
- 筆記
前言
從 2017 年底 Java 開發領域使用最廣的 RPC 框架 Dubbo 開啟重新更新維護之路開始,阿里巴巴為打造 Dubbo 微服務生態持續開源了 Sentinel,Nacos,Seata 等微服務中間件框架,並且推出了 Spring Cloud Alibaba 來提供微服務開發的一站式解決方案,阿里巴巴在 Java 社區持續活躍起來,也為 Java 微服務開發注入了新的活力。
本篇文章將重點學習微服務組件 Nacos 作為註冊中心的功能和用法,Nacos 是阿里巴巴於 2018 年 7 月份新開源的項目。
關於 Nacos 名字:前四個字母分別為 Naming 和 Configuration 的前兩個字母,最後的
s
為Service。
本文主要內容涉及如下:
- Nacos 基本介紹
- 為什麼使用 Nacos
- 最新版本 Nacos 與 Rest/Dubbo 服務的註冊與發現集成
關於 Nacos /nɑ:kəʊs/
一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平台。
上面這句話摘自 Nacos 官方首頁,是對 Nacos 整體功能的總結。
簡單來說 Nacos 就是註冊中心 + 配置中心的組合,提供簡單易用的特性集,幫助我們解決微服務開發必會涉及到的服務註冊與發現,服務配置,服務管理等問題。Nacos 還是 Spring Cloud Alibaba 組件之一,負責服務註冊與發現。
首先來看下官方對 Nacos 的特性描述:
- 服務發現和服務健康監測
- 動態配置服務
- 動態 DNS 服務
- 服務及其元數據管理
- 不斷新增…
可以發現所有特性都離不開服務這一詞,服務 (Service) 是 Nacos 世界中的一等公民,說明了服務是 Nacos 中最主要的角色。
為什麼是 Nacos
現在的微服務生態中,已經有很多服務註冊與發現的開源組件,如 Eurka,ZooKeeper,Consul,為什麼還要用 Nacos 呢,我們看下這些框架的簡單對比:

相比之下,目前的 Nacos 無論是部署,還是使用上都簡單上手,更重要的是文檔資料齊全,社區活躍度高。據說 Nacos 在阿里巴巴內部有超過 10 萬的實例運行,已經過了類似雙十一等各種大型流量的考驗。
並且 Nacos 與目前主流的開源生態都提供了很好的支援:
- Nacos 是專為 Dubbo 而生的註冊中心與配置中心
- Nacos 會完全兼容 Spring Cloud
- Nacos 支援 Service Mesh 集成,Kubernetes 集成
除此之外,阿里巴巴正在通過 Dubbo + Nacos 以及一系列開源項目打造服務發現、服務及流量管理、服務共享平台,未來還在不斷地發展和演進,相信未來會有更多的地方上使用 Nacos。
Nacos 實戰
單機部署
準備環境
Nacos 依賴 Java 環境來運行,並且需要對 Nacos 程式碼構建生成可執行程式時,還要有 Maven 環境,所以部署前需要保證環境要求:
- 64 bit OS,支援 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac。
- 64 bit JDK 1.8+
- Maven 3.2.x+
下載安裝

下載
當前最新的 Nacos 版本為 1.0.1,Maven 方式打包後會在當前目錄 distribution/target
下生成兩個壓縮包 nacos-server-1.0.1.tar.gz
和 nacos-server-1.0.1.zip
,任意解壓一個使用即可。
解壓運行

解壓
這裡 Nacos 單機部署方式使用命令 -m standalone
,如果是 Windows 命令,可以直接雙擊 startup.cmd
文件即可。

運行
當控制台出現 Nacos 字母,並且出現 Nacos started successfully in stand alone mode
提示時就說明了 Nacos 服務端啟動成功,控制台上也直接給出了當前可訪問的 Nacos 控制台地址 http://{ip}:8848/nacos/index.html
,點擊就進入了 Nacos 的可視化管理介面,需要帳號密碼登錄訪問,默認都為 nacos
。

image-20190616001254325
登錄之後就能在網站側邊欄上看到 Nacos 的主要功能菜單:配置管理,服務管理,集群管理,命名空間。對於服務註冊與發現功能來說,我們只要看關注服務管理即可。

image-20190616001603599
服務管理下目前只有一個名為服務列表的子菜單,展示的內容也比較簡單,包含服務名稱,組別,集群數目,總的實例數,運行中的實例數。

image-20190616001806599
當有新的服務通過 Nacos 客戶端註冊到 Nacos 上時列表項就會增加,我們還可以通過操作欄的按鈕進行對服務的詳情查看和編輯。
集群部署
相比 Nacos 簡單的單機部署,集群部署方式稍微麻煩一些,跟著官方文檔走還是有點小坑,還需要自己額外的調整。 為了用於生產環境,必須確保 Nacos 的高可用,所以還是有必要實踐下集群部署的操作。
準備環境跟單機部署相同,額外的要求就是 Nacos 需要 3 個或 3 個以上 Nacos 節點構成集群,並且使用 MySQL 作為數據源,主要用於服務配置的數據持久化。
我們先看下官方推薦的集群部署架構圖,通過域名方式反向代理如 Nginx 來負載多個 Nacos 節點 IP,外部客戶端直接通過域名訪問就可,不僅可讀性好,而且更換 IP 方便,最為推薦採用。

deployDnsVipMode.jpg
添加集群配置文件
在每個 Nacos 節點的conf
目錄下,添加配置文件 cluster.conf
,可以參考相同目錄下的 cluster.conf.example
文件,每行配置一個節點的 IP 和埠,如 ip:port

注意:配置文件中不能使用
127.0.0.1
或者localhost
,需要真實 IP 或者域名,否則啟動後服務無法註冊到該集群節點上, 詳見NACOS ISSUE #1189 。
配置 MySQL 資料庫
Nacos 推薦生產環境中資料庫使用建議至少主備模式,或者採用高可用資料庫。
這裡為了簡化只採用了一個資料庫。首先新建一個名為 nacos_config
的資料庫,使用提供的 sql 語句源文件 導入初始數據。

image-20190616003609656
然後在每個 Nacos 節點的配置文件 conf/application.properties
里添加資料庫連接配置:

application
最後以集群模式分別啟動每個節點,並且默認為後台啟動,啟動資訊需要從 logs/logs/start.out
日誌文件中獲取。

start.out
當日誌文件最後出現 Nacos started successfully in cluster mode.
一行時,即說明集群模式下 Nacos 啟動成功。這時,我們也可以通過登錄任一個 Nacos 控制台的集群管理介面看到節點的資訊。

image-20190616015114761
可以從上面看到,集群下的 Nacos 節點狀態分為 FOLLOWER
,LEADER
兩種,跟我們熟悉的主從架構相似。
到這裡,我們集群方式的搭建也完成了。接下我們就來看下如何使用 Nacos 進行服務註冊和發現吧。
實現服務的註冊與發現
Rest 服務的註冊與發現
服務提供者創建
創建一個子項目工程名為 rest-provider
的服務提供者項目,pom.xml
配置如下:

rest-provider
注意這裡的 spring-cloud-starter-alibaba-nacos-discovery
版本為 0.9.0,採用的是 Nacos 1.0.0 版本的客戶端,而對應 Spring Boot 版本需要為 2.1.x.RELEASE 版本, 更多版本對應關係參考:版本說明 Wiki

image-20190616105233354
因此我們使用 Spring Cloud Alibaba 最新版本 0.9.0.RELEASE
,對應 Spring Cloud Greenwich 版本,父 Maven 項目 POM 配置需要添加如下依賴管理:

pom
依賴添加之後,在引導類中實現一個 Rest 請求方法 /echo
,並且通過 @EnableDiscoveryClient
註解表明是一個 Nacos 客戶端,而該註解是 Spring Cloud 提供的原生註解,就算切換成 Eureka 作為註冊中心也是用這個註解。

引導類
修改子項目配置文件 application.properties

application
spring.application.name
聲明了服務名稱spring.cloud.nacos.discovery.server-addr
指定了 Nacos 註冊中心地址
Nacos Starter 更多配置項資訊可以參考 Spring Cloud Alibaba Nacos Discovery
然後通過引導類 RestProviderApplication
運行項目,登錄 Nacos Server 控制台,查看服務列表即可看到服務提供者 rest-provider
已經註冊成功。

image-20190616110759521
服務消費者創建
同樣的方式我們創建一個服務消費者項目 rest-consumer
,pom.xml
依賴和 application.properties
配置與 provider-consumer
一樣, 這裡我們顯式地使用 LoadBalanceClient API 和 RestTemplate 結合的方式來消費服務。
- 首先在引導類中添加
@EnableDiscoveryClient
註解

引導類
- 再創建一個名為
RestConsumerConfiguration
的 Java 配置類,注入RestTemplate
。

RestConsumerConfiguration.java
- 創建一個名為
RestConsumerController
測試用的 Controller,提供一個請求方法echo
, 如下:

RestConsumerController.java
- 啟動
rest-cosumer
工程後,就可以在 Nacos Server 控制台的服務列表裡看到多了一個名為rest-consumer
的服務,並且直接在瀏覽器訪問http://localhost:8082/echo
,就會看到:

image-20190616113423983
使用上看是不是很簡單呢,其實和 Eureka 沒有太大差別,除了這種方式消費 Rest 服務外,Nacos 也支援 Feign 方式,我們來看下這又是如何使用的吧。
Feign 方式消費 Rest 服務
首先需要引入 Feign 客戶端依賴:

Feign POM
然後引導類添加註解 @EnableFeignClients
啟用 Feign 組件功能,編寫一個 EchoService
介面,用於調用遠程服務:

EchoService
Get 請求方式的介面方法參數不能必須使用
@RequestParam
參數指定請求參數名稱,否則 Feign 都會通過 POST 方式調用,得到狀態碼 405 的錯誤。
註解 @FeignClient
指明了調用的服務提供方名稱,echo
方法通過 Spring MVC 提供的註解就可以跟服務提供者的 Rest 介面關聯,執行時就會調用對應請求方法。
最後我們只需要編寫一個注入 EchoService
控制器 RestConsumerFeignController
類,提供一個介面調用介面。

RestConsumerFeignController
同樣啟動後,直接打開 http://localhost:8082/echo/hi
,就會得到瀏覽器如下輸出:

image-20190616142413540
Dubbo 服務的註冊與發現
接下來,我們看下 Dubbo 怎麼使用 Nacos 作為服務註冊中心,進行註冊與發現的,其實只要用過 ZooKeeper 方式的就會發現很簡單。
首先我們創建一個子工程 dubbo-serivce
,POM 文件添加依賴如下:

POM
- 這裡我們按照官方推薦使用 2.6.5 版本的 Dubbo 集成 Nacos。
dubbo-registry-nacos
是 Dubbo 使用 Nacos 作為註冊中心的關鍵依賴,當前版本為 0.0.1。
接著定義服務介面 DemoService
:

DemoService
服務生產者
還是服務生產者先來,添加一個類 DemoServiceImpl
實現服務介面

DemoServiceImpl
然後以 XML 配置方式配置 Dubbo,只需要在 dubbo:registry
元素上配置 Nacos 服務端地址即可。

XML
最後用簡單類BasicProvider
的 main
方法直接啟動服務生產者,保持進程常駐。

BasicProvider
正常啟動後我們直接在 Nacos 控制台的服務列表裡就可以,Dubbo 生產者服務已經成功註冊到 Nacos 上了,可以通過詳情看到服務的具體數據,比如服務埠,方法之類。

image-20190616144317355
服務消費者
有了服務生產者,就來看下怎麼去通過 Nacos 調用 Dubbo 服務。
首先,通過 XML 配置方式注入用 Dubbo 服務對象 DemoService
, 在 dubbo:registry
元素上配置 Nacos 服務端地址。

XML
然後編寫簡單類 BasicConsumer
,在 main
方法中載入 Spring 容器,獲取 DemoService
對象,直接進行 RCP 調用。

BasicConsumer
運行之後,我們可以從 IDE 控制台上看到不斷有日誌輸出,說明了通過 Nacos 註冊中心的Dubbo 服務調用成功了。

IDE 控制台
結語
本文主要學習了解 Nacos,以及使用 Nacos 的服務註冊與發現功能,如何與 Rest 服務,Dubbo 服務進行集成使用,整體上簡單易用,有興趣的朋友也嘗試用下吧。後續我將繼續深入研究 Spring Cloud Alibaba 微服務生態的組件。
程式碼示例
本文所涉及所有程式碼片段均在下面倉庫中,歡迎感興趣的小夥伴參考學習:
nacos-actions:https://github.com/wrcj12138aaa/nacos-actions
環境支援:
- JDK 8
- Spring Boot 2.1.0
- Maven 3.6.0
參考
- 支援 Dubbo 生態發展,阿里巴巴啟動新的開源項目 Nacos:https://yq.aliyun.com/articles/604028
- Nacos 官方文檔:https://nacos.io/zh-cn/docs/what-is-nacos.html
- Spring Cloud 服務發現新選擇 – Alibaba Nacos Discovery:https://www.bilibili.com/video/av32191103?from=search&seid=8421504995883713886
- 集群部署說明:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
- NACOS #1189:https://github.com/alibaba/nacos/issues/1189
- Spring Cloud 中如何使用 Feign 構造多參數的請求:https://www.jianshu.com/p/7ce46c0ebe9d