簡介
Distributed Configuration Management Platform(分佈式配置管理平臺)
專注於各種 分佈式系統配置管理 的通用組件/通用平臺, 提供統一的配置管理服務。
包括 百度、滴滴打車、銀聯、網易、拉勾網 等知名互聯網公司正在使用!
主要目標:
- 部署極其簡單:同一個上線包,無須改動配置,即可在 多個環境中(RD/QA/PRODUCTION) 上線
- 部署動態化:更改配置,無需重新打包或重啓,即可 實時生效
- 統一管理:提供web平臺,統一管理 多個環境(RD/QA/PRODUCTION)、多個產品 的所有配置
- 支持微服務架構
demos
https://github.com/knightliao/disconf-demos-javadisconf的模塊架構圖
每個模塊的簡單介紹如下:
- Disconf-core
- 分佈式通知模塊:支持配置更新的實時化通知
- 路徑管理模塊:統一管理內部配置路徑URL
- Disconf-client
- 配置倉庫容器模塊:統一管理用戶實例中本地配置文件和配置項的內存數據存儲
- 配置reload模塊:監控本地配置文件的變動,並自動reload到指定bean
- 掃描模塊:支持掃描所有disconf註解的類和域
- 下載模塊:restful風格的下載配置文件和配置項
- watch模塊:監控遠程配置文件和配置項的變化
- 主備分配模塊:主備競爭結束後,統一管理主備分配與主備監控控制
- 主備競爭模塊:支持分佈式環境下的主備競爭
- Disconf-web
- 配置存儲模塊:管理所有配置的存儲和讀取
- 配置管理模塊:支持配置的上傳、下載、更新
- 通知模塊:當配置更新後,實時通知使用這些配置的所有實例
- 配置自檢監控模塊:自動定時校驗實例本地配置與中心配置是否一致
- 權限控制:web的簡單權限控制
- Disconf-tools
- context共享模塊:提供多實例間context的共享。
使用說明
1.導入jar包
<dependency>
<groupId>com.baidu.disconf</groupId>
<artifactId>disconf-client</artifactId>
<version> 2.6.30</version>
</dependency>
2.在客戶端應用的classpath下新增disconf.properties文件
注:所有disconf.properties配置文件中的參數,所有配置均可以通過 命令行
-Dname=value
參數傳入。啓動參數方式進行覆蓋
Disconf啓動需要此文件,文件示例是:
# 是否使用遠程配置文件
# true(默認)會從遠程獲取配置 false則直接獲取本地配置
enable.remote.conf=true
#
# 配置服務器的 HOST,用逗號分隔 127.0.0.1:8000,127.0.0.1:8000
#
conf_server_host=127.0.0.1:8080
# 版本, 請採用 X_X_X_X 格式
version=1_0_0_0
# APP 請採用 產品線_服務名 格式
app=disconf_demo
# 環境
env=rd
# debug
debug=true
# 忽略哪些分佈式配置,用逗號分隔
ignore=
# 獲取遠程配置 重試次數,默認是3次
conf_server_url_retry_times=1
# 獲取遠程配置 重試時休眠時間,默認是5秒
conf_server_url_retry_sleep_seconds=1
配置相關說明可參考:
配置項 | 說明 | 是否必填 | 默認值 |
---|---|---|---|
disconf.conf_server_host | 配置服務器的 HOST,用逗號分隔 ,示例:127.0.0.1:8000,127.0.0.1:8000 | 是 | 必填 |
disconf.app | APP 請採用 產品線_服務名 格式 | 否 | 優先讀取命令行參數,然後再讀取此文件的值 |
disconf.version | 版本號, 請採用 X_X_X_X 格式 | 否 | 默認爲 DEFAULT_VERSION。優先讀取命令行參數,然後再讀取此文件的值,最後纔讀取默認值。 |
disconf.enable.remote.conf | 是否使用遠程配置文件,true(默認)會從遠程獲取配置, false則直接獲取本地配置 | 否 | false |
disconf.env | 環境 | 否 | 默認爲 DEFAULT_ENV。優先讀取命令行參數,然後再讀取此文件的值,最後纔讀取默認值 |
disconf.ignore | 忽略的分佈式配置,用空格分隔 | 否 | 空 |
disconf.debug | 調試模式。調試模式下,ZK超時或斷開連接後不會重新連接(常用於client單步debug)。非調試模式下,ZK超時或斷開連接會自動重新連接。 | 否 | false |
disconf.conf_server_url_retry_times | 獲取遠程配置 重試次數,默認是3次 | 否 | 3 |
disconf.conf_server_url_retry_sleep_seconds | 獲取遠程配置 重試時休眠時間,默認是5秒 | 否 | 5 |
disconf.user_define_download_dir | 用戶定義的下載文件夾, 遠程文件下載後會放在這裏。注意,此文件夾必須有有權限,否則無法下載到這裏 | 否 | ./disconf/download |
disconf.enable_local_download_dir_in_class_path | 下載的文件會被遷移到classpath根路徑下,強烈建議將此選項置爲 true(默認是true) | 否 | true |
詳細設計請參考:
http://disconf.readthedocs.io/zh_CN/latest/design/index.html
3 在applicationContext.xml
添加Disconf啓動支持
scanPackage是掃描標註了disconf註解類所在包路徑
4 配置項註解使用
配置項即K-V的形式,使用如下:
在類的get方法上添加註解 @DisconfFileItem 。添加標記 name, 表示配置文件中的KEY名,這是必填的。標記associateField是可選的,它表示此get方法相關連的域的名字,如果此標記未填,則系統會自動 分析get方法,猜測其相對應於域名。強烈建議添加associateField標記,這樣就可以避免Eclipse生成的Get/Set方法不符合 Java規範的問題。
實例,請參考 5 配置文件註解使用
5 配置文件註解使用
具體步驟是:
- 爲這個類定義 @DisconfFile 註解,指定文件名爲 code.properties 。
- 定義域codeError,並使用Eclipse爲其自動生成 get&set 方法。
- 爲該域的get方法上添加註解 @DisconfFileItem 。添加標記 name, 表示配置文件中的KEY名,這是必填的。標記associateField是可選的,它表示此get方法相關連的域的名字,如果此標記未填,則系統會自動 分析get方法,猜測其相對應於域名。強烈建議添加associateField標記,這樣就可以避免Eclipse生成的Get/Set方法不符合 Java規範的問題。
- 標記它爲Spring託管的類 (使用@Service),且 "scope" 都必須是singleton的。
注意:
Eclipse自動生成的get方法,可能與Java的規範不同。這會導致很多問題。因此,建議加上 associateField 標記。
在disconf-web上code.properties新增該配置文件(版本,環境,app與disconf.properties配置文件中相同)
6 配置更新回調
實現IDisconfUpdate接口,並且該類是由spring管理
註解@DisconfUpdateService, confFileKeys爲監控配置文件更新,itemKeys爲監控配置項更新
7 文件託管
配置文件沒有相應的配置註解類,此配置文件不會被注入到配置類中。disconf只是簡單的對其進行“託管”。 啓動時下載配置文件;配置文件變化時,負責動態推送。程序不會自動reload配置,需要自己寫回調函數(實現IDisconfUpdate接口,並添加DisconfUpdateService註解)。
<!-- 使用託管方式的disconf配置(無代碼侵入, 配置更改不會自動reload)-->
<bean id="configproperties_no_reloadable_disconf"
class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean">
<property name="locations">
<list>
<value>myserver.properties</value>
</list>
</property>
</bean>
<bean id="propertyConfigurerForProject1"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="propertiesArray">
<list>
<ref bean="configproperties_no_reloadable_disconf"/>
</list>
</property>
</bean>
8 管理端disconf-web
8.1.環境配置
配置java、maven環境,並安裝mysql,reids,zookeeeper,Nginx
8.2.下載disconf
下載https://codeload.github.com/knightliao/disconf/zip/master
解壓:unzip disconf-master.zip
8.3.編譯打包
創建目錄
mkdir /home/disconf/online-resources
mkdir /home/disconf/war
cd disconf-master
mvn clean install
ONLINE_CONFIG_PATH=/home/disconf/online-resources
WAR_ROOT_PATH=/home/disconf/war
export ONLINE_CONFIG_PATH
export WAR_ROOT_PATH
cd disconf-web
sh deploy/deploy.sh
-disconf-web.war
-html
-jpaas_control
-META-INF
-Release
-tmp
-WEB-INF
8.4.修改配置
1)將配置文件放到此地址目錄下:/home/disconf/online-resources
配置文件包括:
- jdbc-MySQL.properties (數據庫配置)
- redis-config.properties (Redis配置)
- zoo.properties (Zookeeper配置)
- application.properties (應用配置)
注意,記得執行將application-demo.properties複製成application.properties:
cp application-demo.properties application.properties
2)修改disconf配置
cd /home/disconf/war/WEB-INF/classes/
application.properties
jdbc-mysql.properties
redis-config.properties
zoo.properties
修改文件中的地址端口,調整日誌目錄
#log4j.properties
${catalina.home}/logs/disconf-log4j.log
#logback.xml
<property name="log.base" value="${catalina.home}/logs/disconf-web"/>
<property name="log.monitor" value="${catalina.home}/logs/monitor"/>
8.5.初始化數據庫
按照disconf-master/disconf-web/sql/readme.txt說明按照順序導入數據
8.6.配置tomcat
安裝tomcat配置server.xml配置war目錄
<Context path="" docBase="/home/disconf/disconf/war"></Context>
8.7.配置nginx
安裝nginx,並配置,安裝參考:http://blog.csdn.net/zhu_tianwei/article/details/17752581
配置:vi /home/disconf/nginx/conf/nginx.conf
upstream disconf {
server 127.0.0.1:8080;
}
server {
listen 8000;
server_name localhost;
access_log logs/disconf_access.log;
error_log logs/disconf_error.log;
location / {
root /home/disconf/disconf/war/html;
if ($query_string) {
expires max;
}
}
location ~ ^/(api|export) {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://disconf;
}
}