1. 程式人生 > >SpringCloud第二代實戰系列:一文搞定Nacos實現服務註冊與發現

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 倉庫釋出第一個正式版本。 ![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi00YzYzYjBjMzYyOTkwZGFj?x-oss-process=image/format,png) ### 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 服務,服務及其元資料管理等等 ### 2.1 介紹 官方介紹: > Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您實現動態服務發現、服務配置管理、服務及流量管理。 > Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。Nacos 是構建以“服務”為中心的現代應用架構(例如微服務正規化、雲原生正規化)的服務基礎設施。 ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi03YmI5NDBjZGI0ZjQxNjhj?x-oss-process=image/format,png) ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi03MjJhNzdlOTA4ZTU2ZGMyLnBuZw?x-oss-process=image/format,png) ### 2.2 Nacos對比Eureka 既然稱之為第二代,那麼Nacos對比Eureka,是否具有優勢呢?我們來看一下對比 ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi0wNWM3MTdlMTNiYTE5OTkyLnBuZw?x-oss-process=image/format,png) 更多關於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即可啟動,非常地方便, ![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi05ODU4ZmE1YjkxNDVlZTM1?x-oss-process=image/format,png) Nacos的預設埠是8848,訪問地址:http://127.0.0.1:8848/nacos/index.html#/login ,介面如下: ![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi01YzliNTNiNjcxMDQ2ZmI5?x-oss-process=image/format,png) **使用者名稱/密碼**: nacos/nacos,登入系統: ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi01MDliZjlhZTBlY2RhZDFhLnBuZw?x-oss-process=image/format,png) ### 3.3 配置調整 如果需要修改埠號,或者修改contextPath等,只需要修改conf/application.properties檔案即可 ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi0wZjVjOTYyNWFlMGEzNzM4LnBuZw?x-oss-process=image/format,png) ### 3.4 使用Mysql資料庫 Nacos預設內建了一個Mysql資料庫,為了便於管理,我們可以改為外接的資料庫(尤其是在使用Nacos的分散式配置中心功能時,一定要改為外接的資料庫,分散式配置中心功能後續會進行講解),目前只支援Mysql,不支援其他資料庫, #### 3.4.1 初始化資料庫 我們找到conf目錄下的nacos-mysql.sql,並進行初始化 ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi1lNjI2MmNmZmFiMjEyYWU4LnBuZw?x-oss-process=image/format,png) #### 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 註冊成功 專案啟動後,我們訪問【服務管理】-【服務列表】頁面,可以看到我們的服務已經註冊上去了,非常地方便。 ![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi1mNjcyZjhhYmUxYzY4MDEy?x-oss-process=image/format,png) ## 五、叢集配置 * * * 產線實際使用時,為了確保服務的高可能,正常會配置至少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。 ![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi1kMzIyZDg2ZGU3NDc4N2Yx?x-oss-process=image/format,png) 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指令碼中,預設是叢集的方式)修改後重新啟動: ![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xOTU4NzAzMi04ZTQwMDM0ODg3ZWY5NjUz?x-oss-process=image/format,png) ## 六、誰在使用 * * * 按照官方的說法,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 **微信公眾號:碼大叔** 十年戎“碼”,老“叔”開花