天天看點

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

一、背景:SpringCloud 生态圈

在正式開始本篇文章之前我們先岔開來講一下SpringCloud的生态圈。

SpringCloud大家都比較熟悉了,它制定了分布式系統的标準規範,做了高度抽象和封裝,然後将業界公司比較成熟以及經得起實際考驗的架構整合起來。通過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實作原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。我們之前常用的一些SpringCloud元件大部分來自于Netflix公司,比如我們熟知的Eureka,Hystrix,Ribbon等等,然而随着Eureka不再維護且閉源,Hystrix不再開發新功能,Zuul的性能一般而2.0又遲遲出不來,Ribbon不支援webFlux的負載均衡等等 ,這些已經限制了SpringCloud的高速發展,于是大家開始把目光轉向第二代組合——SpringCloud Alibaba。

1.1、Spring Cloud Alibaba概述

Spring Cloud Alibaba 于 2018年成為SpringCloud的孵化項目,2018年7月27日 在 Spring Cloud 孵化器倉庫送出第一次代碼,到 2019年8月1日 在 Alibaba 倉庫釋出第一個正式版本。

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

1.2、第一代和第二代部分常用元件對比

SringCloud 第一代 SringCloud 第二代
網關 Zuul(Netflix) Gateway(SpringCloud)
注冊中心 Eureka(Netflix),Consul、ZK Nacos(阿裡)
配置中心 SprigCloudConfig Nacos(阿裡),Apollo(攜程)等
負載均衡 Ribbon(Netflix) Loadbalancer(SpringCloud)
熔斷器 Hystrix(Netflix) Resilience4J(spring-cloud-r4j),Sentinel (阿裡)

二、Nacos介紹及與Eureka的對比

微服務項目,我們肯定繞不開服務注冊接下來我們正式進入今天的正題,一起來認識一下Nacos。關鍵特性有:服務發現和服務健康監測,動态配置服務,動态 DNS 服務,服務及其中繼資料管理等等

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

2.1 介紹

官方介紹:

Nacos 緻力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您實作動态服務發現、服務配置管理、服務及流量管理。

Nacos 幫助您更靈活和容易地建構、傳遞和管理微服務平台。Nacos 是建構以“服務”為中心的現代應用架構(例如微服務範式、雲原生範式)的服務基礎設施。

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現
SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

2.2 Nacos對比Eureka

既然稱之為第二代,那麼Nacos對比Eureka,是否具有優勢呢?我們來看一下對比

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

更多關于Naclos的介紹可參見官網:https://nacos.io/

三、Nacos安裝與配置

接下來我們來使用Nacos進行服務的注冊與發現(Nacos還可以實作分布式配置管理,在後續章節再進行講解)。開始之前需確定我們的環境符合要求:作業系統是64位,且本地已安裝了JDK1.8+,Maven3.2.X。

3.1 下載下傳Nacos

下載下傳位址:https://github.com/alibaba/nacos/releases

由于衆所周知的原因,有的時候github通路非常的慢,我們可以通路國内的鏡像倉庫:https://gitee.com/mirrors/Nacos,下載下傳後自己手動鏡像編譯即可。

3.2 解壓啟動

編寫本篇文字時,Nocos1.2 處于Beta1階段,是以我下載下傳的是1.1.4Release版本。

我們将下載下傳的安裝包直接解壓到本地,直接輕按兩下bin目錄下的startup.cmd即可啟動,非常地友善,

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

Nacos的預設端口是8848,通路位址:http://127.0.0.1:8848/nacos/index.html#/login ,界面如下:

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

使用者名/密碼: nacos/nacos,登入系統:

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

3.3 配置調整

如果需要修改端口号,或者修改contextPath等,隻需要修改conf/application.properties檔案即可

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

3.4 使用Mysql資料庫

Nacos預設内置了一個Mysql資料庫,為了便于管理,我們可以改為外置的資料庫(尤其是在使用Nacos的分布式配置中心功能時,一定要改為外置的資料庫,分布式配置中心功能後續會進行講解),目前隻支援Mysql,不支援其他資料庫,

3.4.1 初始化資料庫

我們找到conf目錄下的nacos-mysql.sql,并進行初始化

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

3.4.2 添加資料庫配置

修改conf/application.properties檔案,追加以下資料庫資訊。

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
           

配置完後,直接啟動即可。

3.4.3 踩坑記錄

我們在啟動過程中,可能會遇到如下的錯誤:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'opsController' defined in URL [jar:file:/D:/Dev/nacos-server-1.1.4/target/nacos-server.jar!/BOOT-INF/lib/nacos-config-1.1.4.jar!/com/alibaba/nacos/config/server/controller/OpsController.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dumpService': Invocation of init method failed; nested exception is java.lang.RuntimeException: Nacos Server did not start because dumpservice bean construction failure :
No DataSource set
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)

           

參考了網上的部分資料,在Linux環境下可能是防火牆的問題,需要關閉防火牆,再進行啟動。在我的環境中發現和防火牆沒關系,是版本問題:Mysql目前不支援使用Mysql8,隻支援Mysql5。如果需要使用Mysql8,稍微修改下代碼即可。支援8.0的方法可參考:

https://www.cnblogs.com/gyli20170901/p/11245270.html

四、使用Nacos作為注冊中心

4.1 建立工程

我們建立一個member-service的 Gradle工程(Maven工程一樣設定),添加jar包依賴,Gradle配置如下:

implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '2.1.1.RELEASE'
           

4.2 添加配置

在我們的項目中建立一個application.yml檔案,配置如下:

spring:
    application:
        name: order-service
    cloud:
        nacos:
            discovery:
                server-addr: 127.0.0.1:8848
           

注意:網上有的教程說隻支援properties不支援yml,這個說明是錯誤的,是可以使用yml配置。還有的教程說需要建立一個bootstrap.properties檔案,這個說法也是不準确的,在使用Nacos的配置中心功能時才需要。如果僅僅是作為服務注冊中心,這個也是沒有必要的。關于Nacos配置中心的用法,後續章節會進行講解。

4.3 注冊成功

項目啟動後,我們通路【服務管理】-【服務清單】頁面,可以看到我們的服務已經注冊上去了,非常地友善。

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

五、叢集配置

産線實際使用時,為了確定服務的高可能,正常會配置至少3台,是以我們需要進行叢集的配置。

5.1 叢集配置

在conf目錄下,建立一個cluster.conf,配置叢集機器的位址即可。建議至少配置三台

172.22.204.10:8848
172.22.204.10:8849
172.22.204.10:8850
           

5.2 依次啟動

依次啟動3台機器,通路【叢集管理】-【節點清單】,我們發現已經配置成功。并且自動選舉出了一台作為Leader。

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

Nacos使用的是Raft算法,将Server劃分為3種狀态或者也可以稱作角色:

  • Leader:負責Client互動和log複制,同一時刻系統中最多存在1個。
  • Follower:被動響應請求RPC,從不主動發起請求RPC。
  • Candidate:一種臨時的角色,隻存在于leader的選舉階段,某個節點想要變成leader,那麼就發起投票請求,同時自己變成candidate。如果選舉成功,則變為candidate,否則退回為follower

5.3 踩坑記錄

  • 坑1: 我們本地測試的時候,如果設定ip為127.0.0.1或者localhost會發現服務無法通路,一定要配置成我們本機的真實的IP。

    這個對于我們本機做叢集測試時非常地不友善,比如在公司配置了一個位址後,到家ip發生了變化,又得修改cluster配置檔案。

  • 坑2: window環境下預設是單機模式啟動,需要修改為叢集模式。

    檢視bin/startup.cmd

set MODE="standalone"
set FUNCTION_MODE="all"
set SERVER=nacos-server
set MODE_INDEX=-1
set FUNCTION_MODE_INDEX=-1
set SERVER_INDEX=-1
           

将Mode由standalone改為cluster即可(在startup.sh腳本中,預設是叢集的方式)修改後重新啟動:

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

六、誰在使用

按照官方的說法,1.0之後的版本大家完全可以放心大膽地在産線上使用。目前使用nacos的企業已經有很多,包括阿裡自身,以及工商銀行,平安、愛奇藝、虎牙直播、汽車之家等等。

七、參考資料

  1. SpringCloudAlibaba位址:https://github.com/alibaba/spring-cloud-alibaba
  2. Nacos官方網站:https://nacos.io/
  3. Nacos資料持久化 mysql8.0https://www.cnblogs.com/gyli20170901/p/11245270.html
  4. http://springcloud.cn/view/415
  5. https://www.jianshu.com/p/afd7776a64c6

微信公衆号:碼大叔 十年戎“碼”,老“叔”開花

SpringCloud第二代實戰系列:一文搞定Nacos實作服務注冊與發現

繼續閱讀