一、背景: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 倉庫釋出第一個正式版本。

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 是建構以“服務”為中心的現代應用架構(例如微服務範式、雲原生範式)的服務基礎設施。
2.2 Nacos對比Eureka
既然稱之為第二代,那麼Nacos對比Eureka,是否具有優勢呢?我們來看一下對比
更多關于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即可啟動,非常地友善,
Nacos的預設端口是8848,通路位址:http://127.0.0.1:8848/nacos/index.html#/login ,界面如下:
使用者名/密碼: nacos/nacos,登入系統:
3.3 配置調整
如果需要修改端口号,或者修改contextPath等,隻需要修改conf/application.properties檔案即可
3.4 使用Mysql資料庫
Nacos預設内置了一個Mysql資料庫,為了便于管理,我們可以改為外置的資料庫(尤其是在使用Nacos的分布式配置中心功能時,一定要改為外置的資料庫,分布式配置中心功能後續會進行講解),目前隻支援Mysql,不支援其他資料庫,
3.4.1 初始化資料庫
我們找到conf目錄下的nacos-mysql.sql,并進行初始化
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 注冊成功
項目啟動後,我們通路【服務管理】-【服務清單】頁面,可以看到我們的服務已經注冊上去了,非常地友善。
五、叢集配置
産線實際使用時,為了確定服務的高可能,正常會配置至少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。
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腳本中,預設是叢集的方式)修改後重新啟動:
六、誰在使用
按照官方的說法,1.0之後的版本大家完全可以放心大膽地在産線上使用。目前使用nacos的企業已經有很多,包括阿裡自身,以及工商銀行,平安、愛奇藝、虎牙直播、汽車之家等等。
七、參考資料
- SpringCloudAlibaba位址:https://github.com/alibaba/spring-cloud-alibaba
- Nacos官方網站:https://nacos.io/
- Nacos資料持久化 mysql8.0https://www.cnblogs.com/gyli20170901/p/11245270.html
- http://springcloud.cn/view/415
- https://www.jianshu.com/p/afd7776a64c6
微信公衆号:碼大叔 十年戎“碼”,老“叔”開花