disconf分布式配置管理平台 web端部署 和 client端接入

时间:2021-03-04 17:40:40

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中拉取配置到本地内存

本地测试部署成功

 disconf分布式配置管理平台 web端部署 和 client端接入disconf分布式配置管理平台 web端部署 和 client端接入


disconf分布式配置管理平台 web端部署 和 client端接入disconf分布式配置管理平台 web端部署 和 client端接入