分布式配置管理--百度disconf搭建過程和詳細使用


先說官方文檔:http://disconf.readthedocs.io/zh_CN/latest/index.html

不管是否要根據官方文檔來搭建disconf,都應該看一下這一份文檔.精煉清晰地介紹了disconf的功能和其他一些包含的東西.看完至少對disconf已經有了大概的了解

我搭建的頁面:

開始步驟吧:

  • 安裝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)

其中安裝redis和nginx稍微麻煩一些,參考:

  http://www.cnblogs.com/garfieldcgf/p/6438898.html

  http://www.cnblogs.com/garfieldcgf/p/6438814.html

開始配置:

將你的配置文件放到此地址目錄下(以下地址可自行設定):

/home/work/dsp/disconf-rd/online-resources

 我的路徑與這個不同,為了避免引起不必要的貼圖錯誤,按照官方的來

拷貝/disconf-web/profile/rd/目錄下的文件,拷貝過去后修改即可。

配置文件包括

- jdbc-mysql.properties (數據庫配置)
- redis-config.properties (Redis配置,主要用於web登錄使用)
- zoo.properties (Zookeeper配置)
- application.properties (應用配置)
cp application-demo.properties application.properties

注意,即使只有一個redis,也應該配置兩個redis client,否則將造成內部錯誤。*

設置War包將要被部署的地址(以下地址可自行設定):

/home/work/dsp/disconf-rd/war

構建

ONLINE_CONFIG_PATH=/home/work/dsp/disconf-rd/online-resources
WAR_ROOT_PATH=/home/work/dsp/disconf-rd/war
export ONLINE_CONFIG_PATH
export WAR_ROOT_PATH
cd disconf-web
sh deploy/deploy.sh

這樣會在 /home/work/dsp/disconf-rd/war 生成以下結果:

-disconf-web.war
-html
-META-INF
-WEB-INF

 還有其他的配置文件也都會在這個目錄下

上線前的初始化工作

初始化數據庫:

可以參考 sql/readme.md 來進行數據庫的初始化。注意順序執行
0-init_table.sql
1-init_data.sql
201512/20151225.sql
20160701/20160701.sql

里面默認有6個用戶(請注意線上環境刪除這些用戶以避免潛在的安全問題

name pwd
admin admin
testUser1 MhxzKhl9209
testUser2 MhxzKhl167
testUser3 MhxzKhl783
testUser4 MhxzKhl8758
testUser5 MhxzKhl112

如果想自己設置初始化的用戶名信息,可以參考代碼來自己生成用戶:

src/main/java/com/baidu/disconf/web/tools/UserCreateTools.java

部署War

修改server.xml文件,在Host結點下設定Context:

<Context path="" docBase="/home/work/dsp/disconf-rd/war"></Context>

 

並設置端口為 8015

啟動Tomcat,即可。

部署 前端

修改 nginx.conf

upstream disconf {
    server 127.0.0.1:8015;
}

server {

    listen   8081;
    server_name disconf.com;
    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://disconf;
    }
}

這里的配置沒有貼全,有些人可能會配錯.我貼一份全的(因為對nginx不熟悉,我也遇到了一些小麻煩)

user  root;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip  on;
    gzip_http_version 1.0;
    gzip_disable "MSIE [1-6].";
    gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;

upstream disconf {
    server 10.10.10.10:8015;
}

server {
    listen   8081;
    server_name disconftest.com;
    access_log /home/work/dsp/access.log;
    error_log /home/work/dsp/error.log;

    location / {
        root /home/docker/garfield/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;
    }
}
}

這里我把server name改成了disconftest.com,跟application.properties里面的配置保持一樣即可,

注意:

  1.須保證日志文件的寫入有權限哦,日志文件夾提前建好,否則會報錯

  2.開頭是運行權限,這邊因為沒有用root運行會導致頁面持續被攔截,報403,有遇到的人注意下

服務管理端的部署到這里就結束了,啟動zookeeper,redis,tomcat,mysql和nginx就可以訪問頁面了,輸入

http://10.10.10.10:8081/

看到如下頁面就成功了:

輸入admin/admin發現里面已經有一些配置,但是沒有機器在運行,接下來進行客戶端應用

其實git下載下來的demo直接運行就可以看到配置文件的下載了,當然要配置訪問的服務端地址.這方面就不贅述了,記錄一下我的兩個實踐

1.將xml下載到指定路徑--將mybatis.xml文件從平台上下載,統一管理

先寫一個簡單的mybatis應用程序(打印出數據庫所有用戶表名稱),主要類:

@Service
@Transactional
public class UserService {

    private static Logger  logger  = LogManager.getLogger(UserService.class);
    @Autowired
    private UserDao userMapper;
    
    public List<User> searchAll(){
        List<User> list = userMapper.findAll();
        for (User user : list) {
            System.out.println(user.getUsername());
        }
        return list;
    }
}

主函數:

/**
 * @author garfield
 * @version 2017-2-17
 */
public class DisconfDemoMain {
    private static String[] fn = null;

    // 初始化spring文檔
    private static void contextInitialized() {
        fn = new String[] {"applicationContext.xml"};
    }

    /**
     * @param args
     *
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        contextInitialized();
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(fn);

        UserService userService = ctx.getBean("userService", UserService.class);
        while (true){
            userService.searchAll();
            Thread.sleep(10000);
        }
    }
}

配置類:

import com.baidu.disconf.client.common.annotations.DisconfFile;
import com.baidu.disconf.client.common.annotations.DisconfUpdateService;
import com.baidu.disconf.client.common.update.IDisconfUpdate;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

/**
 * Created by garfield on 2017/2/23.
 */
@Service
@Scope("singleton")
@DisconfFile(filename = "UserMapper.xml",targetDirPath = "cloud/simple/service/dao")
@DisconfUpdateService(classes = {XMLConfig.class})
public class XMLConfig implements IDisconfUpdate {

    public void reload() throws Exception {
        System.out.println("=====================================================================");
    }
}

targetDirPath是配置下載到指定的路徑中,這種情況下,profile里面的disconf.enable_local_download_dir_in_class_path配置項須置為true,運行后效果如下:

輸出:

16:40:47.484 [main] DEBUG o.m.s.t.SpringManagedTransaction - JDBC Connection [ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@1f6f7075]]] will not be managed by Spring
16:40:47.489 [main] DEBUG c.simple.service.dao.UserDao.findAll - ==>  Preparing: select * from user 
16:40:47.513 [main] DEBUG c.simple.service.dao.UserDao.findAll - ==> Parameters: 
16:40:47.532 [main] DEBUG c.simple.service.dao.UserDao.findAll - <==      Total: 2
16:40:47.533 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7eadb544]
username = 1
username = 2

2.第二個實例,將log4j2.xml日志配置文件統一管理

這個例子其實關鍵在於手動加載日志,本身實際上也是一個下載xml文件的過程

配置類:

import com.baidu.disconf.client.common.annotations.DisconfFile;
import com.baidu.disconf.client.common.annotations.DisconfUpdateService;
import com.baidu.disconf.client.common.update.IDisconfUpdate;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

/**
 * Created by garfield on 2017/2/23.
 */
@Service
@Scope("singleton")
@DisconfFile(filename = "log4j2.xml")
@DisconfUpdateService(classes = {XMLConfig.class})
public class LogConfig implements IDisconfUpdate {

    public void reload() throws Exception {
        System.out.println("=====================================================================");
    }
}

下載下來之后log4j.xml文件的位置:(與工程同級)

在主函數做一個加載動作:

import cloud.simple.service.domain.UserService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import java.io.File;
import java.io.FileInputStream;
import java.net.URL;

/**
 * @author garfield
 * @version 2017-2-17
 */
public class DisconfDemoMain {
    private static String[] fn = null;
    private static Logger logger;

    // 初始化spring文檔
    private static void contextInitialized() {
        fn = new String[] {"applicationContext.xml"};
    }

    /**
     * @param args
     *
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        contextInitialized();
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(fn);

//此處加載日志文件 URL url
=DisconfDemoMain.class.getResource("/log4j2.xml"); System.out.println(url.getPath()); ConfigurationSource source = new ConfigurationSource(new FileInputStream(new File(url.getPath())),url); Configurator.initialize(null, source); logger = LogManager.getLogger(DisconfDemoMain.class); UserService userService = ctx.getBean("userService", UserService.class); logger.info("begin to search..."); while (true){ userService.searchAll(); Thread.sleep(10000); } } }
 運行后查看一下日志文件是否生效:
2017-02-24 16:46:01,467 INFO  main (cloud.simple.service.DisconfDemoMain) - begin to search...
2017-02-24 16:46:01,820 INFO  main (cloud.simple.service.domain.UserService) - =========================
2017-02-24 16:46:01,820 INFO  main (cloud.simple.service.domain.UserService) - username = 1
2017-02-24 16:46:01,820 INFO  main (cloud.simple.service.domain.UserService) - =========================
2017-02-24 16:46:01,820 INFO  main (cloud.simple.service.domain.UserService) - username = 2

demo中還有一些其他的例子,不過看文檔大概也能明白,就不說明了.

done!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM