文章目錄
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控制檯頁面。http://localhost:8848/nacos/index.html 登錄頁的默認密碼是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,修改配置文件,在文件中指定集羣的各個主機就行。
如果是linux,建議配一下集羣免密。
然後啓動時不指定 -m standalone,就可以直接啓動nacos集羣了。
nacos安裝非常簡單,然後可以關注下nacos與其他相關開源項目的使用說明,參見README.md文件中的這一部分說明。
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,配置添加完成。
當然, 這跟在管理平臺上配置效果是一樣的。配置信息會保存到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增加了一個保護閾值的配置。這個保護閾值是幹什麼的呢?這裏就沒有多做測試,官網上找了些資料,有興趣可以測試一下。
這個保護閾值應該是0~1之間的一個值,代表健康實例數佔據整個實例數的比例。這個值是爲了防止整個集羣在大流量衝擊下的雪崩效應。分佈式場景下有一個問題,當部分實例不健康時,流量會被分配到健康的實例中,但是這樣,就很容易造成原本健康的實例被大流量衝擊,也變得不健康,最後造成整個服務崩潰。而這個保護閾值,就是當健康實例數佔據總實例數的比例小於閾值時,nacos就認爲整個集羣的所有實例都是健康的,請求流量依然會分佈在整個集羣實例中,這樣,雖然部分的請求流量會被髮到不健康的實例中,造成不正常響應,但是其他剩餘實例還是可以正常訪問,整個服務不至於崩潰。
然後關於這個實例的正常情況,還是通過類似zookeeper的心跳檢測來判斷的。停掉一個服務實例後,可以看到,nacos的服務列表中,該項服務的觸發保護閾值會先變爲true,整行記錄變紅,然後再過段時間,服務列表纔會消失。
而從SpringBoot中引入nacos作爲Dubbo服務註冊中心,需要做的變動其實也不太大。spring-cloud-starter-alibaba-nacos-discovery依賴提供了對dubbo服務發現的完整封裝。依然是通過@Service註解註冊服務,@Reference註解調用服務。在服務列表可以看到註冊到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目前版本用起來確實挺舒服的,但是配置方面有些東西還沒用起來,比如配置和服務的歸屬應用,期待後面的新功能。