SpringCloudAlibaba之Nacos


SpringCloud Alibaba出來也有一段時間了,Nacos版本目前已經更新到1.2.1,這次沒事就來體驗一下。
Nacos官方的說法是一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。據前期的瞭解,是個類似於Eureka服務註冊中心+配置中心。多說不益,上來玩玩再說。另外,本文配套了一個功能完整的Demo,請參見gitee地址: https://gitee.com/tearwind/SCAlibabaDemo

Nacos 初體驗

Nacos的gitHub倉庫地址: https://github.com/alibaba/Nacos,在Github的ReadME.md下面就有發佈包的下載地址,有github和baidu網盤兩個地址。直接下載1.2.1版本的壓縮包就可以了。
注:也可以下源碼編譯,但是git倉庫的源碼版本不太穩定,畢竟一直在迭代過程中。所以還是建議下載發佈包。
源碼可以使用maven直接編譯,編譯指令如下,有興趣可以自己試試。

cd D:\gitCode\nacos-develop
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

解壓後什麼都不用幹,直接跑起來看看效果。單機模式啓動nacos:

    startup.cmd -m standalone

Nacos啓動
啓動完成就可以訪問nacos控制檯頁面。http://localhost:8848/nacos/index.html 登錄頁的默認密碼是nacos/nacos
Nacos首頁
這樣nacos的安裝就完成了,體驗簡單至極。

元數據庫安裝

默認情況下,nacos是使用的derby管理的元數據,元數據無法聯機,也不便於觀察,建議使用mysql來管理元數據。
在conf目錄下修改application.properties,指定db數據源:

#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
# spring.datasource.platform=mysql

### Count of DB:
# db.num=1

### Connect URL of DB:
# db.url.0=jdbc:mysql://1.1.1.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
# db.user=user
# db.password=password

mysql的建表腳本也在bin目錄下,有nacos-mysql.sql和schema.sql,mysql數據庫就用nacos-mysql.sql就行了,其他數據庫如Oracle可以參考schema.sql。
配置完成後,就可以到mysql裏觀察nacos的元數據了。

集羣模式安裝

集羣模式的安裝更簡單,將conf目錄下的cluster.conf.example文件複製一份爲cluster.conf,修改配置文件,在文件中指定集羣的各個主機就行。
Nacos集羣配置
如果是linux,建議配一下集羣免密。
然後啓動時不指定 -m standalone,就可以直接啓動nacos集羣了。

nacos安裝非常簡單,然後可以關注下nacos與其他相關開源項目的使用說明,參見README.md文件中的這一部分說明。
Nacos相關項目

nacos配置中心

按照官方的示例,先增加第一個配置文件:

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos-config-example.properties&group=DEFAULT_GROUP&content=user.id=1%0Auser.name=james%0Auser.age=17"

接口簡單暴力的返回了一個true,配置添加完成。
Nacos第一條配置
當然, 這跟在管理平臺上配置效果是一樣的。配置信息會保存到mysql的config_info表中。
然後創建一個SpringBoot應用來測試一下讀取這個配置信息。–示例代碼見gitee倉庫:
這個示例中可以看到,對於SpringCloud應用,使用Nacos作爲配置中心要注意的是以下幾點:

  • 應用通過spring.application.name(對應dataId)和spring.cloud.nacos.config.group(對應group)兩個屬性一起去尋找nacos上對應的配置信息。另外,如果應用增加了環境配置(spring.profiles.active屬性),那麼,應用也會到nacos上尋找{dataId}-dev.properties文件,跟在本地配置一樣。而{dataId}可以通過配置spring.cloud.nacos.config.prefix來修改。官方說明中,配置文件的後綴.properties也可以通過配置spring.cloud.nacos.config.file-extension來修改,但是目前版本只支持properties。
  • nacos提供了@RefreshScope註解,通過這個註解,就可以讓應用及時獲取到nacos的最新配置。當然,這中間是會有一定的延遲時間的。例如示例工程啓動後,訪問http://localhost:8001/user,可以讀到age是17,而把nacos中的配置改爲18後,再次訪問,能夠獲取到最新的18,而不需要重啓應用。
  • nacos的應用相關配置在引入spring-boot-starter-actuator依賴後,可以通過/actuator/nacos-config路徑訪問。
  • nacos的其他配置項:
配置項 key 默認值 說明
服務端地址 spring.cloud.nacos.config.server-addr
DataId前綴 spring.cloud.nacos.config.prefix spring.application.name
Group spring.cloud.nacos.config.group DEFAULT_GROUP
dataID後綴及內容文件格式 spring.cloud.nacos.config.file-extension properties dataId的後綴,同時也是配置內容的文件格式,目前只支持 properties
配置內容的編碼方式 spring.cloud.nacos.config.encode UTF-8 配置的編碼
獲取配置的超時時間 spring.cloud.nacos.config.timeout 3000 單位爲 ms
配置的命名空間 spring.cloud.nacos.config.namespace 常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源隔離等。
AccessKey spring.cloud.nacos.config.access-key
SecretKey spring.cloud.nacos.config.secret-key
相對路徑 spring.cloud.nacos.config.context-path 服務端 API 的相對路徑
接入點 spring.cloud.nacos.config.endpoint UTF-8 地域的某個服務的入口域名,通過此域名可以動態地拿到服務端地址
是否開啓監聽和自動刷新 spring.cloud.nacos.config.refresh-enabled true

nacos註冊中心

nacos作爲服務註冊中心,是可以同時支持Dubbo和SpringCloud的,關鍵依賴是com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery。那先從Dubbo開始把。

nacos作爲Dubbo服務註冊中心

Dubbo後面會再詳細講解,這裏只是簡單使用,代碼還是可以查看gitee上的Demo,NacosProviders爲服務提供端,NacosConsumers爲服務消費端。其中有從xml啓動Dubbo和Spring啓動Dubbo的示例。
從xml啓動的過程中可以看到,將Dubbo註冊中心由Zookeeper遷移到nacos,只需要將Dubbo的註冊地址修改爲nacos://127.0.0.1:8848,其他地方跟以前使用zookeeper基本沒什麼區別。分別啓動provider和consumer,然後可以觀察下nacos的服務列表頁面,跟以前的DubboAdmin比較一下,最明顯的是,nacos增加了一個保護閾值的配置。這個保護閾值是幹什麼的呢?這裏就沒有多做測試,官網上找了些資料,有興趣可以測試一下。
Nacos服務列表
這個保護閾值應該是0~1之間的一個值,代表健康實例數佔據整個實例數的比例。這個值是爲了防止整個集羣在大流量衝擊下的雪崩效應。分佈式場景下有一個問題,當部分實例不健康時,流量會被分配到健康的實例中,但是這樣,就很容易造成原本健康的實例被大流量衝擊,也變得不健康,最後造成整個服務崩潰。而這個保護閾值,就是當健康實例數佔據總實例數的比例小於閾值時,nacos就認爲整個集羣的所有實例都是健康的,請求流量依然會分佈在整個集羣實例中,這樣,雖然部分的請求流量會被髮到不健康的實例中,造成不正常響應,但是其他剩餘實例還是可以正常訪問,整個服務不至於崩潰。
然後關於這個實例的正常情況,還是通過類似zookeeper的心跳檢測來判斷的。停掉一個服務實例後,可以看到,nacos的服務列表中,該項服務的觸發保護閾值會先變爲true,整行記錄變紅,然後再過段時間,服務列表纔會消失。
Nacos服務不正常
而從SpringBoot中引入nacos作爲Dubbo服務註冊中心,需要做的變動其實也不太大。spring-cloud-starter-alibaba-nacos-discovery依賴提供了對dubbo服務發現的完整封裝。依然是通過@Service註解註冊服務,@Reference註解調用服務。在服務列表可以看到註冊到nacos上的服務提供者和消費者。
Nacos服務提供者與消費者

nacos作爲SpringCloud的服務註冊中心

示例中同樣提供了基於Ribbon的服務接口調用,可以看到,從Eureka遷移到nacos,整個過程也是相當平滑,代碼基本沒差別,只要修改下配置註冊地就行。spring-cloud-starter-alibaba-nacos-discovery依賴中,集成了ribbon和feign。註冊nacos時,應用會將自己應用名作爲一個服務實例註冊到nacos中,然後就可以通過這個實例來進行跳轉。
nacos控制檯中,服務管理下還一個訂閱者列表,在註冊服務者和消費者同時,也會同時註冊一些訂閱者,這個暫時還不知道是幹什麼的。
另外,增加了一個配置屬性dubbo.cloud.subscribed-services,這個屬性用於消費者訂閱提供方的應用名稱列表,官方建議會要自行指定關於的應用,而不用默認的*,日誌中會有警告提示。
然後,官方案例中,nacos還兼容spring-cloud-starter-gateway包,進行路由轉發。可以像eureka一樣,通過應用名,將請求轉發到實例。但是不知道爲什麼,阿里的maven倉庫裏沒有這個包,暫時就沒有測了。

ConfigService和NamingService

Nacos的客戶端目前主要是提供了兩個maven依賴,一個是主要支持Spring的com.alibaba.nacos:nacos-spring-context ,另一個是主要支持SpringCloud的 com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config 和 com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery。而這兩個東東是Nacos客戶端的兩個核心對象,其中ConfigService主要用來操作Nacos的配置信息,NamingService用來操作Nacos的服務發現。

ConfigService

在nacos的客戶端jar包中,可以通過ConfigService對象管理Nacos的配置信息,可以管理配置、監聽配置修改事件,管理監聽等,也可以通過NamingService來管理Nacos的服務註冊信息。具體示例可以參見Demo。
注:如果引入com.alibaba.nacos:nacos-spring-context依賴,應用需要配置@EnableNacos註解(這個@EnableNacos註解相當於同時配置@EnableNacosConfig和@EnableNacosDiscovery兩個註解),然後就可以用@NacosInjected註解注入ConfigService和NamingService了。但是,如果引用的是com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config這個springCloud的集成依賴,那就可以使用@Resource註解注入NacosConfigManager,然後通過這個NacosConfigManager去獲取ConfigService。

NamingService

其他

Nacos目前版本用起來確實挺舒服的,但是配置方面有些東西還沒用起來,比如配置和服務的歸屬應用,期待後面的新功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章