概述
常規項目會有很多配置文件,比如數據庫鏈接信息, 緩存信息等. 我們通常的做法是通過配置文件進行管理可以達到只需要修改一個地方,整個項目都可以生效的目的.目前我們的開發項目繁多, 程序為了保持高可用,會進行集群部署. 這樣我們要對某一個或者某幾個項目進行配置文件變更時,需要逐個進行修改.這樣大量的人為操作可能會增加程序升級或發布的風險.與此同時修改配置文件之后會涉及到應用的重啟.為了減小發布風險,我們需要一個地方對各個系統配置進行統一的管理,這時統一配置管理系統誕生的背景,我們暫且取名為 “IMAGO”沒有特殊的含義,只是一個代號.
架構
Imago分為兩部分:
-
配置管理控制臺(imago-admin)
配置管理后臺提供配置管理, 簡單權限管理, 詳細配置變更日志管理等, 所有的配置數據最終以Mysql數據庫中存儲的配置為最終正確配置.
-
配置客戶端(imago-client)
上圖中的箭頭方向表示數據的流向. 當應用啟動時, imago-client從Zookeeper獲取相關配置項到本地, 并存儲一份文件快照, 一份緩存快照, 應用直接從本地緩存中讀取相關配置. 當Zookeeper中的配置項發生變動時, imago-client會監聽到變動并更新本地文件快照和本地緩存. 在使用過程中如果Zookeeper不可用, 應用還可以從本地文件快照中獲取配置進行啟動. 應用始終都是從imago-client的本地緩存中獲取緩存, 提高效率.
存儲在Zookeeper中的數據結構
配置管理后臺負責配置數據的維護,如增、刪、改、查,配置數據存放于zookeeper節點之上,每個APP都有一個唯一的ID,如order的節點path為/imago/order,該節點下又可以有多個配置節點,如/imago/order/key1, /imago/order/key2… 管理后臺必須校驗節點PATH的唯一性.
-
應用可以有兩種類型
(1). 公共應用, 該種應用會將一些公共資源的配置放在這種應用下面, 比如mysql的配置, redis的配置等, 這么做的目的是為了將來這些配置ip或者其他信息變更了,我們只需要修改一個地方.我們將來可以通過在imago-admin里面可以看到哪些應用引用了這些公共應用.
比如,和交易相關的公共配置統一放在appkey為trade_public目錄下, 具體參考如下:/imago/trade_public_mysql/1.1 /imago/trade_public_redis/1.1
(2). 普通應用, 該種應用下的配置項可以設置一些該應用特有的一些配置.
容災設計
我們可以總結一下imago整個系統完全不可用的條件,下面是可能發生的情況:
- 數據庫不可用。
- 所有zookeeper均不可用。
- imago-client主動刪除了File Snapshot, Local cache.
在上面2, 3都不可用時才會發生不可用的情況.這在生產環境中出現的幾率是極小的.
測試用例
功能測試(在沒有任何異常的情況下進行)
-
創建測試數據
/imago/app1/xxx1 /imago/app1/xxx2 /imago/app1/xxx3
app啟動時client可以順利從zookeeper加載相關配置到file snapshot 和 local cache.
-
驗證是否可以生成文件快照
~/.imago/imago_snapshot/app1.properties
驗證本地緩存是否可以取到這些值.
當zookeeper其中某一個數據發生變動時, 相應的文件快照和本地緩存是否也相應變更.
容災測試
zookeeper集群中其中一臺機器不可用, client是否可以正常從zookeeper獲取數據.
client(非首次)啟動時無法從zookeeper獲取數據, 則可以從之前的文件快照獲取配置數據, 并加載到本地緩存中.
配置不可用的情況
- client第一次啟動時, zookeeper就不可用, 則無法從中獲取數據, 并生成文件快照和本地緩存.
Imago-admin 功能說明
首頁
-
集中配置管理主要提供如下功能點:
- 應用管理
- 配置項管理(具體的配置項數據在該節點設置)
- 用戶管理
- 資源管理(菜單和功能url的動態管理)
- 用戶組管理(進行用戶的分組功能,可以給用戶組分配具體的功能權限和數據權限)
- 日志查看(終于數據的增刪改的詳細記錄)
首頁關系圖可以查看某個ip上具體的pid引用了什么公共應用, 也可以查看哪些公共應用被什么程序引用了.
應用管理
可以通過應用類型, 應用key, 應用value進行簡單檢索
點擊應用key上的超鏈接, 將會進入該應用下的配置項列表.
在進行數據遷移時, 只需要將mysql數據進行遷移, 然后點擊”同步全量數據到Zookeeper”按鈕,會將mysql中所有數據同步到zookeeper節點上,如果已經有數據在zookeeper上,并且已經有程序watch了這些節點, 那么該操作將會觸發大量的watch操作. 所有,該按鈕建議只在初始化時使用.
可以針對某個應用進行配置項的導入, 導入文件可是遵循 *.properties屬性文件格式.
可以將某個應用下的配置項導出為 *.properties屬性文件.
可以只針對某個應用從mysql中同步數據到Zookeeper.
刪除某個應用, 該操作是邏輯刪除, 同時會邏輯刪除該應用下所有的配置項, 同時也會物理刪除zookeepr上對應的數據.
進行應用的新增和修改時,需要設置應用的類型:
-
公共應用
該類型的應用,會是多個項目中使用, 比如mysql,redis,kafka等配置放在公共應用中. 同時首頁上會顯示公共應用被哪些程序使用的關系圖.
-
普通應用
普通應用是區分公共應用而存在的, 一般應用下的獨有的一下配置項放在普通應用下.
配置項管理
點擊某個配置項Key上的鏈接,可以查看該配置項的所有歷史版本.
可以針對配置項Key,Value進行簡單檢索.
配置項的添加功能, 只能通過具體的應用頁面引導進來才能操作, 直接通過菜單上的配置項管理進入沒有新增配置項功能按鈕.
在進行配置項的新增或修改時, 需要注意配置項的value值有模板設定, 默認下是走的文本, 但是為了便于對一些公共資源的管理,加入了類似mysql,redis,kafka等配置項的模板.
每一個配置項后面都可以通過配置代碼按鈕獲取到某一個配置項在各個語言中的配置代碼.
可以通過該方法獲取該配置項在zk中具體的數據, 不用再去zookeepr上通過命令行查詢.
可以獲取到某一配置項的所有版本變更記錄, 并可以通過某一個版本進行恢復.
資源管理(功能權限管理)
在用戶組管理中我們可以進行資源管理,資源管理主要可以通過樹形菜單配置來控制哪些用戶組里面的用戶可以操作哪些功能url.用戶登錄后看到的左側菜單也是通過該功能進行動態配置.
數據權限管理
該功能可以配置哪些用戶可以對哪些數據進行哪些操作,這里主要集中控制對app數據的控制. 如果涉及到公共應用的如果用戶只有查詢權限,那么他們會針對該公共應用下的配置項中的密碼選項是不可見的. 這個數據操作權限由App延伸到配置項.
日志管理

對系統中比較關鍵的數據操作都會進行詳細的日志記錄, 便于進行用戶行為的跟蹤.
部署
初始化Imago-admin
當首次啟動imago-admin時需要初始化zookeeper中的數據庫配置,進入到zookeeper命令行執行以下命令:
create /imago ""
create /imago/trade_public_mysql ""
create /imago/trade_public_mysql/1.1 {"ip":"xxx.xxx.xxx.xxx","port":"3231","type":"master","dbs":[{"name":"xxx","user":"trade_user","pwd":"xxx"}]}
Imago-java-client 配置說明
具體使用步驟總結如下:
-
在pom.xml中加入:
<dependency> <groupId>com.xxx.xxx</groupId> <artifactId>imago-java-client</artifactId> <version>1.8.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> </exclusion> </exclusions> </dependency>
-
大家可以在spring配置文件中嵌入:
因為測試環境是復雜的, 為了應對各種情況下, imago-java-client都可用, 我將各種場景列舉如下, 大家根據具體情況進行變通:
(1) 普通配置, 在dns正常, zookeeper服務正常的情況下:<bean id="configManager" class="com.xxx.imago.client.ConfigManager” />
(2) 應對測試環境dns不可用的情況, 我們可以自己指定 zookeeper地址
<bean id="configManager" class="com.xxx.imago.client.ConfigManager”> <constructor-arg name="serverList" value="192.168.1.100:2181,192.168.1.101:2181,192.168.1.102:2181"/> </bean>
(3) 應對測試環境zookeeper 不可用情況, 在 ~/.imago/imago_snapshot/ 目錄下創建 .closezk文件(windows系統在程序所在盤符的根目錄下尋找該路徑)該情況, 需要快照文件已經在該路徑下.(如果初始化時也不可用, 可以從imago-admin 中下載相應的配置文件放在該路徑下.)
<bean id="configManager" class="com.xxx.imago.client.ConfigManager” />
- 在spring中的配置示例代碼如下:
(1) 簡單引用
```
<property name="jdbcUrl" value="#{configManager.getMysqlConfig('trade_public_mysql','1.1','trade').url}"/>
```
(2) 參數是變量,可以支持參數是變量的引用
```
<constructor-arg name="redisIp" value="#{configManager.getRedisConfig('trade_public_redis’,{configManager.getConfigValue('trade_eagleye','redis_key')}).ip}"/>
```
關于通過DNS獲取zookeeper集群地址
我們的集中配置管理統一使用的域名為: zk.xxx.com, 通過dns來獲取zk集群地址是為了將來如果該地址變更,每個應用可以不用修改zk集群地址.
什么樣的配置適合放在imago中進行管理
- 靜態配置, 不會頻繁變更的配置(比如一些業務上的開關, 閾值).
- 公共資源配置, 比如: mysql, redis, kafka, mongodb, zookeeper等.
- 下面這些配置不建議放在imago中進行管理.
(1) 基本不會變更的配置(比如: c3p0的一些基礎配置, redis, kafka,mongodb等除了ip, 端口, 權限之外的一些基礎配置)這些配置可以直接寫死在應用中.
(2) 如果接入loom進行服務治理之后,消費服務的地址和端口.
備注(重要):
- 在imago-admin首頁, 可以看到哪些應用的實例引用了以trade_public為前綴的公共資源.
- 從數據庫同步數據到zookeeper的功能, 僅限于初次搭建imago進行數據遷移,初始化imago時使用.該功能會觸發所有數據庫中存儲的配置項的使用, 如果在執行時,已經有大量的imago-java-client監聽了zk的數據節點, 會觸發所有watch事件.
版本變更記錄
imago-admin 版本變更列表
2.0.0
1. 增加功能權限,app數據權限控制
2. 增加配置項的版本管理
1.7.0
1、首頁換成公共資源引用的關系圖
2、修復導出屬性文件被截斷的bug
3、限制只能管理員權限的用戶才能添加公共的app
4、再添加公共資源的配置時提示配置key的規則驗證
5、去掉修改配置時value必填的驗證
6、修復在瀏覽器直接輸入無權限頁面時無法跳轉的bug
1.6.1
1、添加驗證,登陸頁面用戶名或者密碼為空,回車失效。
1.6.0
1、添加kafka模板
2、修復搜素框回車查詢失效的問題
3、配置代碼加入java寫法樣例
1.5.0
增加應用對應的配置項導出功能
1.4.0
增加批量上傳propertes文件的方法,減少初始化時的工作量
1.3.1
啟用spring3.2之后的beans特性,使運維操作與配置無關
1.3.0
增加mongo模板
1.2.1
1、修復bug,配置項管理頁面(從應用管理點擊配置項跳轉而來),點擊添加,自動選中所屬應用
2、應用列表頁,顯示備注列
1.2.0
支持mysql,redis的json模板設置,服務嵌入代碼樣例
1.1.0
添加用戶權限管理, 配置項修改日志跟蹤
1.0.0
簡單的app, config管理
imago-java-client 版本變更列表
1.8.0-SNAPSHOT
增加獲取公共資源(mysql,redis,kafka等)引用關系圖
1.7.0
添加PropertiesUtil訪問類,可以用來靜態訪問配置
修正啟動時知道appList時會注冊監聽, 在取配置時會再次注冊監聽的問題
1.6.0
添加kafka模板
1.5.0
使配置不需要關心appList,會根據用戶的使用情況,動態添加對appKey的監聽和快照文件
1.4.2
修正了如果通過添加.closezk文件來屏蔽zk后,還需要通過dns獲取zk地址的問題
1.4.1
修正文件快照不支持windows的情況
1.4.0
增加mongo模板
1.3.0
可以通過數據庫名獲取數據庫配置
1.2.0
增加支持redis, mysql的json解析支持
1.1.0
添加本地文件快照, 增加客戶端高可用
1.0.0
配置項獲取, 監聽變更