Java微服務新生代之Nacos

前言

從 2017 年末 Java 開發領域使用最廣的 RPC 框架 Dubbo 開啓從新更新維護之路開始,阿里巴巴爲打造 Dubbo 微服務生態持續開源了 SentinelNacosSeata 等微服務中間件框架,而且推出了 Spring Cloud Alibaba 來提供微服務開發的一站式解決方案,阿里巴巴在 Java 社區持續活躍起來,也爲 Java 微服務開發注入了新的活力。html

本篇文章將重點學習微服務組件 Nacos 做爲註冊中心的功能和用法,Nacos 是阿里巴巴於 2018 年 7 月份新開源的項目。java

關於 Nacos 名字:前四個字母分別爲 Naming 和 Configuration 的前兩個字母,最後的 s 爲Service。mysql

本文主要內容涉及以下:git

  • Nacos 基本介紹
  • 爲何使用 Nacos
  • 最新版本 Nacos 與 Rest/Dubbo 服務的註冊與發現集成

關於 Nacos /nɑ:kəʊs/

一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。github

上面這句話摘自 Nacos 官方首頁,是對 Nacos 總體功能的總結。spring

簡單來講 Nacos 就是註冊中心 + 配置中心的組合,提供簡單易用的特性集,幫助咱們解決微服務開發必會涉及到的服務註冊與發現,服務配置,服務管理等問題。Nacos 仍是 Spring Cloud Alibaba 組件之一,負責服務註冊與發現sql

首先來看下官方對 Nacos 的特性描述:數據庫

  • 服務發現和服務健康監測
  • 動態配置服務
  • 動態 DNS 服務
  • 服務及其元數據管理
  • 不斷新增...

能夠發現全部特性都離不開服務這一詞,服務 (Service) 是 Nacos 世界中的一等公民,說明了服務是 Nacos 中最主要的角色。瀏覽器

爲何是 Nacos

如今的微服務生態中,已經有不少服務註冊與發現的開源組件,如 Eurka,ZooKeeper,Consul,爲何還要用 Nacos 呢,咱們看下這些框架的簡單對比:微信

服務註冊與發現框架 CAP 模型 控制檯管理 社區活躍度
Eureka AP 支持 低 (2.x 版本閉源)
Zookeeper CP 不支持
Consul CP 支持
Nacos AP 支持

聽說 Nacos 在阿里巴巴內部有超過 10 萬的實例運行,已通過了相似雙十一等各類大型流量的考驗。

相比之下,目前的 Nacos 不管是部署,仍是使用上都簡單上手,更重要的是文檔資料齊全,社區活躍度高。

而且 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 註解

    引導類

  2. 再建立一個名爲 RestConsumerConfiguration 的 Java 配置類,注入 RestTemplate

    RestConsumerConfiguration.java

  3. 建立一個名爲 RestConsumerController 測試用的 Controller,提供一個請求方法 echo, 以下:

    RestConsumerController.java

  4. 啓動 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-actionsgithub.com/wrcj12138aa…

環境支持:

  • JDK 8
  • Spring Boot 2.1.0
  • Maven 3.6.0

參考

相關文章
相關標籤/搜索