前言
SpringCloud通常指的是Netflix的,今天我們講的SpringCloud-Alibaba,有大廠背書,我選擇相信,而且阿里巴巴的各項業務複雜度都在你我公司之上,所以經過大廠實戰驗證的可信度很高。
目前SpringCloud-Alibaba提供的組件官網也有介紹,的確沒有Netflix多,但是還在發展,沒問題。
其實大家用SpringCloud的核心目的就是轉型微服務,做架構升級,而微服務大家最關心的就是需要一個服務註冊中心來幫我們自動維護服務註冊和服務發現的機制,而傳統的方式可能是手動配置nginx的upstream來達到這個效果,缺乏自動化,沒有融入雲時代(當然基於openresty+lua的APISIX網關也可以達到微服務的效果)。
分析
SpringCloud-Alibaba配套的服務註冊中心也是阿里自研的nacos。
nacos=配置中心+註冊中心,一舉兩得。
說到服務註冊發現都是這張圖,只不過實現的方式有多種,有ZK,EUREKA,CONSUL,ETCD,NACOS等,但是核心都是一致性算法,都在CAP三者中擇優選擇。
NACOS官網的架構圖如下
附上官網的介紹
服務 (Service)
服務是指一個或一組軟件功能(例如特定信息的檢索或一組操作的執行),其目的是不同的客戶端可以爲不同的目的重用(例如通過跨進程的網絡調用)。Nacos 支持主流的服務生態,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.
服務註冊中心 (Service Registry)
服務註冊中心,它是服務,其實例及元數據的數據庫。服務實例在啓動時註冊到服務註冊表,並在關閉時註銷。服務和路由器的客戶端查詢服務註冊表以查找服務的可用實例。服務註冊中心可能會調用服務實例的健康檢查 API 來驗證它是否能夠處理請求。
服務元數據 (Service Metadata)
服務元數據是指包括服務端點(endpoints)、服務標籤、服務版本號、服務實例權重、路由規則、安全策略等描述服務的數據
服務提供方 (Service Provider)
是指提供可複用和可調用服務的應用方
服務消費方 (Service Consumer)
是指會發起對某個服務調用的應用方
配置 (Configuration)
在系統開發過程中通常會將一些需要變更的參數、變量等從代碼中分離出來獨立管理,以獨立的配置文件的形式存在。目的是讓靜態的系統工件或者交付物(如 WAR,JAR 包等)更好地和實際的物理運行環境進行適配。配置管理一般包含在系統部署的過程中,由系統管理員或者運維人員完成這個步驟。配置變更是調整系統運行時的行爲的有效手段之一。
配置管理 (Configuration Management)
在數據中心中,系統中所有配置的編輯、存儲、分發、變更管理、歷史版本管理、變更審計等所有與配置相關的活動統稱爲配置管理。
名字服務 (Naming Service)
提供分佈式系統中所有對象(Object)、實體(Entity)的“名字”到關聯的元數據之間的映射管理服務,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服務發現和 DNS 就是名字服務的2大場景。
配置服務 (Configuration Service)
在服務或者應用運行過程中,提供動態配置或者元數據以及配置管理的服務提供者。
那麼Nacos是如何整個到SpringCloud的標準中無縫連接的呢。
SpringCloud標準中啓動服務註冊發現就一個註解
@EnableDiscoveryClient
這個註解是springcloud官方定義的
裏面使用了Import註解引入EnableDiscoveryClientImportSelector
這個方法中import了一個類
org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration
這個類的定義比較簡單了,實例化這個類
再看NacosDiscoveryAutoConfiguration這個類的註解,AutoConfigureAfter表明上面的AutoServiceRegistrationConfiguration實例化完之後會實例化NacosDiscoveryAutoConfiguration這個類。
該類中會實例化nacos註冊類,這些註冊類也都是繼承實現了spring cloud的標準接口
以上是SpringCloud-Alibaba Nacos如何整合到SpringCloud的服務註冊標準中的過程,如果你想自定義實現一個服務註冊實現,也可以基於SpringCloud Common的標準來做。
安裝部署
參照nacos官網,實際生產環境使用,安裝部署三臺nacos即可,通過nginx代理,使用官方的數據庫初始化腳本初始化數據庫即可。
安裝完如圖所示,三臺nacos實例構成集羣。nacos同樣使用raft算法實現數據一致性。
配置中心
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
引入上述依賴,版本我是定義在自定義的parent裏了
大家要單獨定義一個配置文件bootstrap.properties,因爲使用nacos配置中心,它刷新的是application.properties的配置,所以不能再把nacos的配置寫到application裏了。
Spring是有上下文一說的,也叫Application Context,Application Context又是有父子關係的,所以必須要理解ApplicationContext是什麼。SpringCloud啓動時,會先創建一個Bootstrap Context,然後創建一個Application Context,Bootstrap Context是Application Context的父上下文,Bootstrap負責從外部源加載配置並解析,這兩個上下文共用一個從外部獲取的Environment。Bootstrap配置具有較高的優先級,不會被本地配置覆蓋。Bootstrap典型的應用場景是使用SpringConfig,這個時候你需要把配置信息配在bootstrap裏面。Bootstrap屬於引導配置,Application屬於應用配置。
所以bootstrap優先於application,nacos屬於引導配置,放到bootstrap裏。
#spring cloud config
spring.application.name=phoenixNacos
#spring.cloud.nacos.discovery.service=${spring.application.name}
spring.cloud.nacos.config.server-addr=172.28.72.120:8848
spring.cloud.nacos.config.file-extension=properties
在SpringCloud-Alibaba Nacos中的dataId完整定義如下
${prefix}-${spring.profile.active}.${file-extension}
prefix
默認爲spring.application.name
的值,也可以通過配置項spring.cloud.nacos.config.prefix
來配置。spring.profile.active
即爲當前環境對應的 profile,詳情可以參考 Spring Boot文檔。 注意:當spring.profile.active
爲空時,對應的連接符-
也將不存在,dataId 的拼接格式變成${prefix}.${file-extension}
file-exetension
爲配置內容的數據格式,可以通過配置項spring.cloud.nacos.config.file-extension
來配置。目前只支持properties
和yaml
類型。
具體如圖所示
放了一些動態配置,報文加解密開關,大家在實際使用中比較常用的場景。
代碼裏如何讓動態配置更新,這也是SpringCloud的標準,通過@RefreshScope註解標明該類下用到的配置動態刷新。
如果該Bean被RefreshScope註解註釋了,那麼一旦配置變更該Bean會被銷燬,然後重新實例化用的配置。
服務註冊中心
啓動後會在nacos控制檯看到註冊上的服務實例,注意,這裏註冊的是實例級別,不是實例中的N個具體的服務接口。