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.gznacos-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 節點狀態分為 FOLLOWERLEADER 兩種,跟我們熟悉的主從架構相似。

到這裡,我們集群方式的搭建也完成了。接下我們就來看下如何使用 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-consumerpom.xml 依賴和 application.properties 配置與 provider-consumer 一樣, 這裡我們顯式地使用 LoadBalanceClient API 和 RestTemplate 結合的方式來消費服務。

  1. 首先在引導類中添加 @EnableDiscoveryClient 註解

引導類

  1. 再創建一個名為 RestConsumerConfiguration 的 Java 配置類,注入 RestTemplate

RestConsumerConfiguration.java

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

RestConsumerController.java

  1. 啟動 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

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

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