配置中心(SpringCloud配置中心擴展)
1. 使用自定義讀取配置源,基於mysql的配置讀取實現。
2. 設計簡述:
-
基於IP、應用名稱、LABEL、Profile獲取配置
1.1) IP主要用於區分不同區域獲取不同配置信息
1.2) 應用名稱+Label+profile遵循原spring-cloud config的設計 -
表結構設計,參考:configMysql.sql文件
2.1) 維護應用與區域之間的關係,即在獲取配置時,依據請求IP查詢所屬區域對應的配置信息。
2.2) 抽象出具體配置項、配置組、應用配置信息。即配置組可掛多個配置項,應用環境配置掛多個配置組,以達到資源共享。
2.3) 支持單個服務私有配置
2.4) 維護客戶端連接信息,提供服務的IP和端口 -
整體設計
3.1) custom-config-server爲服務端,單獨部署啓動,也可以集成到自己的應用,直接使用@CustomEnableConfigServer
註解加上spring jdbc的配置即可:
spring:
application:
name: config-server
#mysql
datasource:
url: dbUrl
username: admin
password: amdin@123
driver-class-name: com.mysql.jdbc.Driver
# 使用druid數據源
type: com.alibaba.druid.pool.DruidDataSource
3.2) custom-config-service爲Rest服務端,提供配置、應用、區域等維護的API,可單獨部署應用也可以集成到web工程中
3.3) custom-config-web 提供前端的頁面管理
3.4) custom-config-client 客戶端jar包
3.5) custom-starter-config 客戶端引用該工程即可
3.6) 客戶端查詢配置核心時序圖,參考:配置中心查詢核心時序圖.png
3.7) 客戶端刷新實現簡介:
A. 改造原springcloud client,在發起restTemplate的時候,將客戶端服務的端口上報到配置服務端,並添加refresh刷新的接口,其實際是調用了ContextRefresher.refresh()方法
B. 配置服務端保存應用+環境+應用服務的IP:PORT信息到數據庫
C. 配置管理界面修改應用配置,進行發佈配置刷新客戶端配置
D. 客戶端引用starter-config jar包,並在需要刷新的配置類上添加@RefreshScope註解。custom-config-simple使用方法
E. 服務端發起刷新配置應用,通過應用+環境查找該應用下提供的所有應用服務,調用refresh刷新客戶端的配置,如果調用失敗標記該服務下線,下一次不進行刷新操作
F. springcloud的刷新參考資料:
數據源刷新參考
Spring Cloud Config 是如何實現熱更新的
配置刷新基本流程
3.8) 引入netty,實現心跳機制監聽服務端客戶端連接狀態。
A. 支持自定義netty端口,服務端和客戶端自定義填寫,配置參數:netty.server.port,默認使用8999
B. springboot的 server.port 一定要配置到 bootstrap.yml配置文件中,客戶端需要使用到該端口號上報到服務端
C. springboot + netty 簡單設計實現:
心跳維持在線狀態
初始化連接時,模擬一個登陸操作,以此綁定netty連接端口和服務端所提供的端口,用於斷開下線使用
客戶端失去心跳或異常連接,服務端監聽到,標記應用離線
D. 新增配置 spring.cloud.config.custom
參數來標記使用自定義配置中心,主要用於加載netty,使用心跳機制
E. netty實現配置刷新方案,netty連接後發起登錄請求,上報客戶端服務的IP和端口,後臺數據庫綁定netty和提供服務端口。服務端用一個ConcurrentHashMap存儲連接,後臺管理髮起刷新請求通過netty發給客戶端,刷新配置
3.配置中心高可用方案理論
既然使用spring-cloud套件,可結合eureka註冊中心來實現高可用。其他詳細設計可參考攜程開源的apollo的高可用設計
Github地址:–>傳送入口