disconf预研
分布式配置管理平台
web管理端安装
安装环境CentOS 6.4
首先安装
mysql 5.7 , tomcat7.0,nginx 1.12.0, redis 3.2.8
zookeeper 3.3.0, jdk1.8, maven 3.5.0, git
1. 安装mysql 5.7
下载 mysql57-community-release-el6-n.noarch.rpm 放入/opt目录下
sudo rmp –Uvh mysql57-community-release-el6-n.noarch.rpm
sudo yum install mysql- community-server 安装mysql社区服务版
sudo service mysqld start 启动mysql服务
sudo service mysqld status
sudo service mysqld restart
如果mysql 是5.7版本会有密码验证插件安装和开启,安装完mysql后一个超级用户会被创建
密码将会被储存到error log file
sudo grep ‘temporary password’/var/log/mysqld.log 可以看到临时密码
然后需要以下命令修改密码
mysql –uroot –p 输入临时密码后
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
如果想关闭validate password则修改my.cnf文件加入validate-password=OFF
创建一个新用户用于远程连接
createuser ‘user’@’%’ IDENTIFIED BY ‘Zero295813128!’
grant all privileges on *.* to ‘user’@’%’ with grant option;
flush privileges;
2. 安装jdk 1.8
下载 jdk-8u131-linux-x64.rpm 放入/opt目录下
sudo rpm-Uvh jdk-8u131-linux-x64.rpm
设置系统环境变量 vi /etc/profile
jkd8需要使用jdk/bin目录下的unpack200工具对
jdk/lib/tools.pack解压为tools.jar
jdk/jre/lib/rt.pack解压为rt.jar
jdk/jre/lib/jsse.pack解压为jsse.jar
jdk/jre/lib/deploy.pack解压为deploy.jar
exportJAVA_HOME=/usr/java/jdk1.7.0_79
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
exportPATH=$PATH:$JAVA_HOME/bin
source/etc/profile
shift + g 跳入 vi 最后一行
3 安装tomcat 7.0.77
下载 apache-tomcat-7.0.77.tar.gz 放入/opt目录下
tar -zxf apache-tomcat-7.0.77.tar.gz–C /usr/local
rm –rfwebapps/* && rm –rf work/*
4 安装git
由于此应用托管在github上, yum install git –y 在/opt目录下
git clonehttps://github.com/knightliao/disconf.git
mkdir -p/usr/local/disconf/{online-resources,war}
vi/etc/profile
设置war包将要被部署的地址
ONLINE_CONFIG_PATH=/usr/local/disconf/online-resources
WAR_ROOT_PATH=/usr/local/disconf/war
exportONLINE_CONFIG_PATH
exportWAR_ROOT_PATH
5. 安装maven 3.5.0
下载 apache-maven-3.5.0-bin.tar.gz 放入/opt目录下
tar -zxf apache-maven-3.5.0-bin.tar.gz –C /usr/local
环境变量中加入maven
exportJAVA_HOME=/usr/java/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/lib
exportMAVEN_HOME=/usr/local/apache-maven-3.5.0
exportPATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
source/etc/profile
进入/opt/disconf目录mvn clean install
如果有javadoc报错则执行
mvn cleaninstall -D maven.javadoc.skip=true
cd /disconf-web/profile/rd目录下拷贝
jdbc-mysql.properties(数据库配置)
zoo.properties(zookeeper配置)
redis-config.properties(redis配置)
application-demo.properties(应用配置)
cpjdbc-mysql.properties application-demo.properties redis-config.propertieszoo.properties /usr/local/disconf/online-resources/
需要将application-demo.properties复制成application.properties
mv application-demo.propertiesapplication.properties
zoo.properties中不能为127.0.0.1 也不能为localhost 需为具体的ip地址。
6. 安装redis 3.2.8
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar -zxf redis-3.2.8.tar.gz–C /usr/local
如果出现下面错误 可能是没有安装相关的依赖包 yum –yinstall gcc gcc-c++ libstdc++-devel
atalerror: jemalloc/jemalloc.h: No such file or directory
cc:error: ../deps/hiredis/libhiredis.a: No such file or directory
cc:error: ../deps/lua/src/liblua.a: No such file or directory
cc:error: ../deps/geohash-int/geohash.o: No such file or directory
cc:error: ../deps/linenoise/linenoise.o: No such file or directory
make geohash-inthiredis jemalloc linenoise lua
如果出现下面错误则 make MALLOC=libc
In file included from adlist.c:34In file included from adlist.c:34:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/usr/local/redis-3.2.9/src'
make: *** [install] Error 2
[root@localhost redis-3.2.9]# make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/usr/local/redis-3.2.9/src'
make: *** [all] Error 2
转换目录
cd..
make& make install
cd utils
./install_server.sh
建立两个文件夹存放redis命令和配置文件
mkdir -p /usr/local/redis/{etc,bin}
把redis-3.2.8 下的redis.conf 移动到/usr/local/redis/etc 下
cp redis.conf /usr/local/redis/etc/
把redis-3.2.8/src 里的mkreleasehdr.sh, redis-benchmark, redis-check-aof, redis-check-dump, redis-cli, redis-server文件移动到bin下,命令:
mv mkreleasehdr.sh, redis-benchmark, redis-check-aof, redis-check-dump, redis-cli, redis-server /usr/local/redis/bin
启动时并指定配置文件 ./redis-server /usr/local/redis/etc/redis.conf (注意要使用后台启动, 所以需要修改redis.conf里面9 daemonize改为yes)
验证启动是否成功ps -ef|grep redis 查看是否有redis服务或者查看端口号:netstat -tunpl | grep 6379
进入redis 客户端 ./redis-cli
退出客户端 quit
退出redis服务: (1) pkill redis-server (2) kill 进程号 (3) /usr/local/redis/bin/redis-cli shutdown
dir ./
修改为 dir /usr/local/redis/etc/ 将同步数据的生成文件都放入etc目录
7. 安装zookeeper 3.3.0
下载 zookeeper 3.3.0 放入/opt目录下
tar -zxf zookeeper-3.3.0.tar.gz-C /usr/local
exportJAVA_HOME=/usr/java/jdk1.8.0_131
exportCLASSPATH=.:$JAVA_HOME/lib:$ZOOKEPPER_HOME/lib
exportMAVEN_HOME=/usr/local/apache-maven-3.5.0
exportZOOKEEPER_HOME=/usr/local/zookeeper-3.0.10
exportPATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin:$ZOOKEPPER_HOME/bin
更新环境变量
将$ZOOKEPPER_HOME/conf目录下的zoo_sample.cfg 重命名为zoo.cfg
并修改dataDir=/usr/local/zookeeper-3.3.0/data
下面摘抄的一些对zoo.cfg文件的配置项的描述
配置说明:
tickTime:这个时间是作为 Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime时间就会发送一个心跳。
dataDir:顾名思义就是 Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
clientPort:这个端口就是客户端连接 Zookeeper服务器的端口,Zookeeper会监听这个端口,接受客户端的访问请求。
./zkServer.sh start 启动zk
jps 查看启动的服务名称,如下示例:
jps
9376 Jps
9346 QuorumPeerMain
netstat –nat查看端口号,如下示例:
netstat -nat
ActiveInternet connections (servers and established)
ProtoRecv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 10.0.2.15:22 10.0.2.2:50805 ESTABLISHED
tcp 0 0 :::22 :::* LISTEN
tcp 0 0 :::59929 :::* LISTEN
tcp 0 0 ::1:25 :::* LISTEN
tcp 0 0 :::2181 :::* LISTEN
tcp 0 0 :::3306 :::* LISTEN
Exception in thread "main"org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode =ConnectionLoss for /test
如果在客户端连接的时候有这样的错误可能是centos防火墙没有关闭
CentOS关闭防火墙命令:
CentOSLinux开启和关闭防火墙命令有两种,一种是临时的,重启即复原;另外一种是永久性的,重启不会复原。
1) 临时生效,重启后复原
开启: service iptables start
关闭: service iptables stop
2) 永久性生效,重启后不会复原
开启: chkconfig iptables on
关闭: chkconfig iptables off
我执行的是永久修改的命令,执行完了也可以不重启电脑,重启防火墙服务即可:
service iptables restart
service iptables status查看状态
还有可能zookeeper的版本不对,一定要使用官方说的3.3.0的版本
部署项目
cd disconf-web
sh deploy/deploy.sh
完成后会在/usr/local/disconf/war目录下产生文件
disconf-web.war
将sql文件导入数据库
1. 从命令行进入到mysql,然后使用create database disconf 创建数据库
2. 退出mysql命令行
3. 然后执行mysql -uroot -p disconf < 0-init_table.sql
4. mysql -uroot -p disconf < 1-init_data.sql
5. mysql -uroot -p disconf < 201512/20151225.sql
6. mysql -uroot -p disconf < 20160701/20160701.sql
部署war
vim conf/server.xml
加入context节点
并设置端口号为8015
<Context path=""docBase="/usr/local/disconf/war"></Context> ###此处为添加disconf目录
启动Tomcat,即可。
8. 安装nginx 1.12.0
下载 nginx-1.12.0.tar.gz 放入/opt目录下
tar -zxf nginx-1.12.0.tar.gz–C /usr/local
./configure--prefix=/usr/local/nginx
如出现上面的信息,则安装pcre-devel解决问题
yum –y install pcre-devel
如出现上面的信息,则安装 zlib-devel解决问题
yum –y install zlib-devel
make && make install
安装后在linux下启动和关闭nginx:
启动操作
/usr/loca/nginx/sbin/nginx (/usr/local/nginx/sbin/nginx -t 查看配置信息是否正确)
停止操作
停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文 章)来进行的
步骤1:查询nginx主进程号
ps -ef | grep nginx
在进程列表里 面找master进程,它的编号就是主进程号了。
步骤2:发送信号
从容停止Nginx:
kill -QUIT 主进程号
快速停止Nginx:
kill -TERM 主进程号
强制停止Nginx:
pkill -9 nginx
另外, 若在nginx.conf配置了pid文件存放路径则该文件存放的就是Nginx主进程号,如果没指定则放在nginx的logs目录下。有了pid文 件,我们就不用先查询Nginx的主进程号,而直接向Nginx发送信号了,命令如下:
kill -信号类型 '/usr/nginx/logs/nginx.pid'
平滑重启
如果更改了配置就要重启Nginx,要先关闭Nginx再打开?不是的,可以向Nginx 发送信号,平滑重启。
平滑重启命令:
kill -HUP 住进称号或进程号文件路径
或者使用
/usr/nginx/sbin/nginx -s reload
注意,修改了配置文件后最好先检查一下修改过的配置文件是否正 确,以免重启后Nginx出现错误影响服务器稳定运行。判断Nginx配置是否正确命令如下:
nginx -t -c /usr/nginx/conf/nginx.conf
或者
/usr/nginx/sbin/nginx -t
修改 nginx.conf
upstream disconf {
server 127.0.0.1:8015;
}
server {
listen 8081;
server_name disconf.com;
access_log/usr/local/nginx/logs/access.log;
error_log /usr/local/nginx/logs/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://disconf;
}
}
接入客户端的配置
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参数传入。传入后进行覆盖
#是否使用远程配置文件
#true(默认)会从远程获取配置 false直接获取本地配置
disconf.enable.remote.conf=true
#配置服务器的host(disconf服务器地址)
disconf.conf_server_host=172.171.51.151:8082
#版本,官方推荐采用X_X_X_X
disconf.version=1_0_0_0
disconf.app=17wifiServer
#环境
disconf.env=local
disconf.ignore=
disconf.conf_server_url_retry_times=1
disconf.conf_server_url_retry_sleep_seconds=1
#用户定义的下载文件夹
disconf.user_define_download_dir=./
#下载的文件会被迁移到classpath跟路径下
disconf.enable_local_download_dir_in_class_path=true
如果使用disconf 本地配置文件redis.properties可以删掉(也可以不删掉,建议删除)
在disconf-web上上传配置文件
一般情况下,disconf.properties 应该放在应用程序的根目录下,如果想自定义路径可以使用:
-Ddisconf.conf=/tmp/disconf.properties
3. 添加disconf.xml或者 spring-context.xml中引入disconf配置
<!-- 使用disconf必须添加以下配置 -->
<bean id="disconfMgrBean" class="com.baidu.disconf.client.DisconfMgrBean"destroy-method="destroy">
<propertyname="scanPackage" value="com.fnic.wifi.server"/>
</bean>
<bean id="disconfMgrBean2" class="com.baidu.disconf.client.DisconfMgrBeanSecond"init-method="init" destroy-method="destroy">
</bean>
<!-- 使用托管方式的disconf配置(无代码侵入, 配置更改会自动reload)--><!—非properties文件需要回调来支持数据自动同步-->
<bean id="configproperties_disconf" class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
<value>classpath:redis.properties</value>
</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>
4. 编写测试bean
@Component
@Scope("singleton")
@DisconfFile(filename = "configure.properties")
public class ConfDIs {
private StringresourceUrl;
@DisconfFileItem(name ="resource_server_url", associateField = "resourceUrl")
public StringgetResourceUrl() {
returnresourceUrl;
}
public voidsetResourceUrl(String resourceUrl) {
this.resourceUrl =resourceUrl;
}
}
@DisconfFile注解必须制定文件名
@DisconfFileItem 将配置文件名称和类的定义域对应 name表示配置文件中的key 必填
associateField 可选 ,不过官网文档强烈建议添加associateField标记
@Component标记为spring托管类,且scope必须为singleton
基于注解的分布式配置
新项目时使用
注:将配置文件移至一个专有类里,而不是分散在项目的各个地方,整个代码架构清晰易懂、易管理。即便如果哪天不使用disconf,也只需要将注解去掉即可。
基于XML的分布式配置
旧项目时使用
两者区别
XML式实现
这种方式下,当项目启动,Disconf-Client开始扫描应用配置数据时,使用XML配置的配置文件是不会注入到仓库中的,也就是说Disconf-Client只会对这种配置文件有托管作用,当disconf-web上配置文件修改时,会下载到本地,但是不会自动reload到相应的bean,当然用户也可根据自己的需要,配置相应的reload,只不过非.properties文件的回调函数需要自己写。这种配置方式适合所有配置文件。
采用XML式配置方式,写代码比较少,不需要在每一个需要的Bean都写上注解的配置文件,只需要在配置文件中一处配置就好。但是它的缺点是不能自动reload到Bean,也就是Bean在使用过程中可能会用到旧的配置文件。
注解式实现
采用注解式实现方式,项目启动时,Disconf-Client会扫描应用中的注解信息,将这些注解数据注入到仓库中,此时Disconf-Client对配置文件不止有托管作用,当本地配置文件修改时,它还能自动reload到相应的Bean。
采用注解的方式,需要在所有的需要使用配置文件的Bean上都注解配置文件,写的代码会比较多。但是如果配置文件更改后,它能自动reload使用配置文件的Bean,使得Bean
都使用最新配置信息。
原理是从zk中拉取配置到本地内存
本地测试部署成功