SpringCloud配置配置中心擴展Mysql方案+Netty實現心跳和配置刷新

配置中心(SpringCloud配置中心擴展)

1. 使用自定義讀取配置源,基於mysql的配置讀取實現

2. 設計簡述

  1. 基於IP、應用名稱、LABEL、Profile獲取配置

    1.1) IP主要用於區分不同區域獲取不同配置信息

    1.2) 應用名稱+Label+profile遵循原spring-cloud config的設計

  2. 表結構設計,參考:configMysql.sql文件

    2.1) 維護應用與區域之間的關係,即在獲取配置時,依據請求IP查詢所屬區域對應的配置信息。

    2.2) 抽象出具體配置項、配置組、應用配置信息。即配置組可掛多個配置項,應用環境配置掛多個配置組,以達到資源共享。

    2.3) 支持單個服務私有配置

    2.4) 維護客戶端連接信息,提供服務的IP和端口

  3. 整體設計

    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地址:–>傳送入口

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