1、disconf介绍
Distributed Configuration Management Platform(分布式配置管理平台)专注于各种 分布式系统配置管理 的通用组件 / 通用平台,提供统一的配置管理服务。
主要目标:
部署极其简单:同一个上线包,无须改动配置,即可在 多个环境中(RD/QA/PRODUCTION) 上线。
部署动态化:更改配置,无需重新打包或重启,即可 实时生效。
统一管理:提供web平台,统一管理 多个环境(RD/QA/PRODUCTION)、多个产品 的所有配置。
核心目标:一个jar包,到处运行。
项目信息
CLIENT端:
Java :目前唯一支持语言
开放API,让开发者有自定义开发客户端的能力:
WEB管理端
Java SpringMvc实现,前后端分离 实现方式(基于Spring 4.17.RELEASE)
开放API,让开发者具有自定义定制web控制台界面的能力。
功能特点
支持配置(配置项 + 配置文件)的分布式管理。
配置发布统一化
配置发布、更新统一化:
同一个上线包 无须改动配置 即可在多个环境(RD/QA/PRODUCTION)上线
配置存储在云端系统,用户统一管理 多个环境(RD/QA/PRODUCTION)、多个平台的所有配置
配置更新自动化:用户在平台更新配置,使用该配置的系统会自动发现该情况,并应用新配置。特殊地,如果用户为此配置定义了回调函数类,则此函数类会被自动调用。
极简的使用方式(注解式编程 或 XML无代码侵入模式):我们追求的是极简的、用户编程体验良好的编程方式。目前支持两种开发模式:基于XML配置或者基于注解,即可完成复杂的配置分布式化。
注:配置项是指某个类里的某个Field字段。
Disconf的功能特点描述图:
其它功能特点
低侵入性或无侵入性、强兼容性:
低侵入性:通过极少的注解式代码撰写,即可实现分布式配置。
无侵入性:通过XML简单配置,即可实现分布式配置。
强兼容性:为程序添加了分布式配置注解后,开启Disconf则使用分布式配置;关闭Disconf则使用本地配置;若开启Disconf后disconf-web不能正常Work,则Disconf使用本地配置。
支持配置项多个项目共享,支持批量处理项目配置。
配置监控:平台提供自校验功能(进一步提高稳定性),可以定时校验应用系统的配置是否正确。
模块架构图:
模块信息
CLIENT: client目标是支持多语言。目前只提供了java语言客户端。
JAVA
disconf-core :分布式配置基础包模块
disconf-client :分布式配置客户端模块, 依赖disconf-core包。 用户程序使用它作为Jar包进行分布式配置编程。
disconf-tool :分布式配置工具包,依赖disconf-core包。 Disconf-tool是disconf的辅助工具类, 目前使用不多,建议不使用。
管理端 :管理端:disconf-web是统一的分布式配置管理平台。disconf-web: 分布式配置平台服务模块, 依赖disconf-core包。采用SpringMvc+纯HTML方式(前后端分离架构)实现。用户使用它来进行日常的分布式配置管理。
2、若想学习Disconf,首先找到Disconf的官方地址,官网地址为:
http://disconf.readthedocs.io/zh_CN/latest/index.html
找到学习用的参考案例
https://github.com/knightliao/disconf-demos-java
下载后可以看到这个学习资料中有:
3、源码下载
找到disconf的源码的下载地址,通过源码安装:
https://github.com/knightliao/disconf
代码下载下来之后,解压后的内容如下:
注意:
1、 当下载下来之后,不要立即看到有pom.xml就使用maven进行编译(这是java同学常见的习惯噢)。
2、 经过测试,该源码在JDK6.x + maven2环境下可以编译通过,高版本的编译不通过。
3、 如果我们想查看文档,可以打开源码中的README.md文件,里面有各种网址。
比如:
4、**disconf-masterREADME.md中列出了可供参考的 **demos && 文档 && 协作 连接:
- demos: https: //github.com/knightliao /disconf-demos-java
- wiki: https: //github.com/knightliao /disconf/wiki
- 文档: http: //disconf.readthedocs.io
- 协作开发: 在 master 分支上提pull request
- 提问题: https: //github.com/knightliao /disconf/issues 提issue
5、环境准备
安装依赖软件:
安装Mysql(Ver 14.12 Distrib 5.0 .45 , for unknown-linux -gnu (x86_64) using EditLine wrapper,或更高版本也可以)
安装Tomcat(apache-tomcat - 7.0 .50 ,其它或更高版本也可以)
安装Nginx(nginx/1.5 .3 ,其它版本也可以)
安装 zookeeeper (zookeeper- 3.3 .0 ,或更高版本)
安装 Redis (2.4 .5 ,或更高版本)
配置Maven环境(这个在官方文档没有提及,但是特别要注意,这个地方是需要的)
关于上面这些软件的安装在此不做详细介绍。以下只做软件安装位置介绍:
关于MySQL:
ip :192 .168 .106 .100
用户名:root
密码:123456
关于Tomcat:
机器:ip:192.168 .106 .105
位置:/home/tuzq/software/apache-tomcat - 8.5 .12 (注意在使用的时候发现tomcat的catalina. sh中的JAVA_OPTS的参数值在设置在:JAVA_OPTS= '-Xms64m -Xmx128m' 时仍然能够跑起来disconf-web 应用)
关于Nginx
ip:192.168 .106 .102
nginx位置:/usr/local /nginx
关于zookeeeper
ip: 192.168 .106 .101 + 192.168 .106 .102 + 192.168 .106 .103
部署位置:/home/tuzq/software/zookeeper
端口都是:2181
关于Redis
ip :192 .168 .106 .101
port :6379
关于maven:
ip: 192.168 .106 .105
位置:/home/tuzq/software/apache-maven-3.3 .9
注意配置环境变量
6、安装Disconf
6.1.创建文件夹
进入机器:192.168.106.105
执行以下命令:
[root@hadoop15 bin]
[root@hadoop15 bin]
[root@hadoop15 online-resources]
[root@hadoop15 online-resources]
/home/work/dsp/disconf-rd/online-resources
[root@hadoop15 online-resources]
6.2 拷贝配置文件
将下载下来的disconf-masterdisconf-webprofile
d目录下的文件,拷贝到/home/work/dsp/disconf-rd/online-resources目录下
配置文件包括:
- jdbc-mysql.properties (数据库配置)
- redis-config.properties (Redis 配置,主要用于web登录使用)
- zoo.properties (Zookeeper 配置)
- application.properties (应用配置)
注意:记得执行以下命令,将application-demo.properties复制一份,名称为application.properties
[root@hadoop15 online-resources]# pwd
/home/work/dsp/disconf-rd/online-resources
[root@hadoop15 online-resources]# ls
application-demo.properties jdbc-mysql.properties redis-config.properties zoo.properties
[root@hadoop15 online-resources]# cp application-demo.properties application.properties
[root@hadoop15 online-resources]# ls
application-demo.properties application.properties jdbc-mysql.properties redis-config.properties zoo.properties
[root@hadoop15 online-resources]#
6.3 修改参数配置
1、修改application.properties
[root@hadoop15 online-resources]
2、修改jdbc-mysql.properties
[root@hadoop15 online-resources]
原配置:
新配置:
3、修改redis-config.properties
原配置:
新配置:
注意:
即使只有一个redis,也应该配置两个redis client,否则将造成内部错误。
6.4 配置zoo.properties的信息
原配置:
新配置:
7 部署disconf-web
7.1 配置环境变量
export ONLINE_CONFIG_PATH =/home/work /dsp/disconf -rd/online-resources
export WAR_ROOT_PATH =/home/work /dsp/disconf -rd/war
然后执行:
[root@hadoop15 online-resources]
7.2 部署disconf-web
创建文件夹:
mkdir -p /home/work/dsp/disconf-rd /war
将disconf-masterdisconf-web中的内容放到/home/work/dsp/disconf-rd下,然后执行以下命令:
[root@hadoop15 war]# pwd
/home/work/dsp/disconf-rd
[root@hadoop15 disconf-rd]# ls
disconf-web online-resources war
[root@hadoop15 war]# cd disconf-web/
[root@hadoop15 disconf-web]# ls
bin deploy html pom.xml profile README.md sql src
[root@hadoop15 disconf-web]# sh deploy/deploy.sh
***** ***** ***** ***** ***** ***** ***** ***** ***** *
copy online config /home/work/dsp/disconf-rd/online-resources
***** ***** ***** ***** ***** ***** ***** ***** ***** *
Removing src/main/online-resources/*
***** ***** ***** ***** ***** ***** ***** ***** ***** *
It's going to Generate the output for war
***** ***** ***** ***** ***** ***** ***** ***** ***** *
***** ***** ***** ***** ***** ***** ***** ***** ***** *
It's going to got war package
***** ***** ***** ***** ***** ***** ***** ***** ***** *
***** ***** ***** ***** ***** ***** ***** ***** ***** *
use online profile
***** ***** ***** ***** ***** ***** ***** ***** ***** *
[INFO] Scanning for projects...
注意:上面的过程比较慢,请耐心等待。
如果执行上面的过程中出现了以下错误:
按照提示信息,修改/home/work/dsp/disconf-rd/war/disconf-web/pom.xml中相应的jar的版本,若发现下载很慢,请直接在CSDN的资源处下载相应的jar包。
这样会在/home/work/dsp/disconf-rd/war生成以下结果:
-disconf-web.war
-html
-META -INF
-WEB -INF
效果图如下:
7.3 初始化数据库
可以参考disconf-websql
eadme.md来进行数据库的初始化。注意顺序执行:
0 -init_table.sql
1 -init_data.sql
201512 /20151225. sql
20160701 /20160701. sql
注意:
里面默认有6个用户(请注意线上环境删除这些用户以避免潜在的安全问题)
Tables
Are
admin
admin
testUser1
MhxzKhl9209
testUser2
MhxzKhl167
testUser3
MhxzKhl783
testUser4
MhxzKhl8758
testUser5
testUser5
如果想自己设置初始化的用户名信息,可以参考代码来自己生成用户:
src/main/java/com /baidu/disconf/web/tools/UserCreateTools.java
7.4部署war
修改server.xml文件,在Host节点下设定Context:
<Context path ="" docBase ="/home/work/dsp/disconf-rd/war" > Context >
即在/home/tuzq/software/apache-tomcat-8.5.12/conf/server.xml添加如下内容:
启动tomcat即可
部署 前端:
将disconf-web里面的disconf-masterdisconf-webhtml文件都放到nginx所在的/home/work/dsp/disconf-rd/war下面
mkdir -p /home/work/dsp/disconf-rd /war/html
修改nginx.conf (到192.168.106.102机器上)
upstream disconf {
server 192.168 .106 .105 :8080 ;
}
server {
listen 8081 ;
server_name 192.168 .106 .102 ;
#access_log /home/work/var /logs/disconf/access. log ;
#error_log /home/work/var /logs/disconf/error. log ;
location / {
root /home/work/dsp/disconf-rd /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:
}
}
关于Host
这里的server_name必须设置成和application.properties 里的domain一样。然后浏览器的访问域名也是这个。
配置好之后,只需要需在浏览器上访问:
http://192.168.106.102:8081 即可出现以下界面:
8 disconf-web使用介绍
8.1 名词介绍
在disconf中有如下名词(官方文档上介绍的让人费解)
APP:使用哪个APP(可以理解成哪个项目),及它的ID,这个在配置disconf.properties时会被用到,建议使用英文。
KEY :配置文件或配置项(关于配置项这个名词容易让人费解,这里和软件工程的独立可运行的软件叫配置项不是一个概念,这里的配置项是指在disconf中配置的key ,value的值。而不是通过上传项目的配置文件生成的值。若上传了项目的配置文件,这里的key 和项目的配置文件的名称相同(注意这个版本的disconf不能上传文件夹形式的配置文件,并且上传配置文件的时候只能一个一个的上传))
配置内容:配置文件或配置项在配置中心中的值
实例列表:使用此配置文件或配置项的所有实例列表,及每个实例的配置值。如果实例的配置值与配置中心的值不一致,这里会标识出来。
修改时间:修改此配置的最后一次时间
操作:个性、删除、下载
8.2 登录
点击上图中的登录,出现以下界面:
默认的用户名和密码是:admin admin
8.3 主界面
关于左侧的rd,qa,local,online在官方文档中并没有介绍如何进行修改,经过摸索,可以通过修改数据库的方式进行修改,修改:
8.4 查看不同环境的配置文件信息
在界面的左上角可以选择APP(界面选择的是disconf_demo这个项目)和环境(比如rd环境或qa环境,点击rd环境后发现已经有配置文件了),选择之后,就会在中间出现上传的配置文件的列表。
选择版本后,就会显示 APP、环境、版本 三个条件下的配置列表:
8.5 新建APP(即项目属性),配置项(简单理解成k/v值),新建配置文件
新建APP
新建配置项
进入主界面进行查看
新建配置文件:
上传之后,图的显示效果如8.4中的效果。
9.项目案例介绍
以disconf-standalone-demo为例进行介绍
9.1配置disconf-client
若项目想用disconf,需要在pom.xml中配置disconf-client,maven依赖配置如下(最新版本为2.6.36版本):
<dependency >
<groupId > com.baidu.disconfgroupId >
<artifactId > disconf-clientartifactId >
<version > 2.6.36version >
dependency >
9.2 配置applicationContext.xml
另外要注意的是disconfMgrBean中scanPackage中的包扫描的值。
配置文件的内容:
具体的内容是:
<bean id ="disconfMgrBean" class ="com.baidu.disconf.client.DisconfMgrBean"
destroy-method ="destroy" >
<property name ="scanPackage" value ="com.example.disconf.demo" />
bean >
<bean id ="disconfMgrBean2" class ="com.baidu.disconf.client.DisconfMgrBeanSecond"
init-method ="init" destroy-method ="destroy" >
bean >
<bean id ="configproperties_disconf"
class ="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean" >
<property name ="locations" >
<list >
<value > classpath:/autoconfig.propertiesvalue >
<value > classpath:/autoconfig2.propertiesvalue >
<value > classpath:/myserver_slave.propertiesvalue >
<value > classpath:/testJson.jsonvalue >
<value > testXml2.xmlvalue >
list >
property >
bean >
<bean id ="propertyConfigurer"
class ="com.baidu.disconf.client.addons.properties.ReloadingPropertyPlaceholderConfigurer" >
<property name ="ignoreResourceNotFound" value ="true" />
<property name ="ignoreUnresolvablePlaceholders" value ="true" />
<property name ="propertiesArray" >
<list >
<ref bean ="configproperties_disconf" />
list >
property >
bean >
<bean id ="configproperties_no_reloadable_disconf"
class ="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean" >
<property name ="locations" >
<list >
<value > myserver.propertiesvalue >
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 >
9.3 配置disconf.properties
# 是否使用远程配置文件,true(默认)会从远程获取配置, false则直接获取本地配置
disconf.enable.remote.conf=true
#配置服务器的 HOST,用逗号分隔 ,示例:127.0.0.1:8000,127.0.0.1:8000,这里的值和application.propperties中的值要保持一致
disconf.conf_server_host=192.168 .106 .102 :8081
# 版本号, 请采用 X_X_X_X 格式 默认为 DEFAULT_VERSION。优先读取命令行参数,然后再读取此文件的值,最后才读取默认值。
disconf.version=1 _0_0_0
# APP 请采用 产品线_服务名 格式 优先读取命令行参数,然后再读取此文件的值
disconf.app=disconf_demo
# 环境 默认为 DEFAULT_ENV。优先读取命令行参数,然后再读取此文件的值,最后才读取默认值
disconf.env=rd
# 忽略的分布式配置,用空格分隔
disconf.ignore=
# 获取远程配置 重试次数,默认是3次
disconf.conf_server_url_retry_times=1
# 获取远程配置 重试时休眠时间,默认是5秒
disconf.conf_server_url_retry_sleep_seconds=1
# 用户定义的下载文件夹, 远程文件下载后会放在这里。注意,此文件夹必须有有权限,否则无法下载到这里 默认:./disconf/download
disconf.user_define_download_dir=./disconf/download2
# 下载的文件会被迁移到classpath根路径下,强烈建议将此选项置为 true(默认是true)
disconf.enable_local_download_dir_in_class_path=true
运行后效果: