前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2 springboot项目集成使用disconf,基于docker环境

2 springboot项目集成使用disconf,基于docker环境

作者头像
天涯泪小武
发布2019-01-17 11:42:22
8730
发布2019-01-17 11:42:22
举报
文章被收录于专栏:SpringCloud专栏SpringCloud专栏

上一篇我们完成了disconf服务端的环境搭建,这一篇我们来看看客户端springboot如何继承disconf,最终在docker下运行。

假定你已经在本机搭建好了disconf的web端环境,并已经能使用localhost访问到disconf的web界面。

下面看客户端如何使用disconf。

新建一个springboot项目,勾选web和aop。至于为什么要勾aop,后面用到disconf的回调时才用的上,先不用管它。

然后在pom里添加disconf的依赖。最终pom.xml如下

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tianyalei</groupId>
    <artifactId>test_disconf</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>test_disconf</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baidu.disconf</groupId>
            <artifactId>disconf-client</artifactId>
            <version>2.6.36</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

disconf的官方文档地址:http://disconf.readthedocs.io/zh_CN/latest/tutorial-client/index.html,可以参考着来,它这个是基于spring的配置,全是xml,比较麻烦,我们用的是springboot,那就配置起来简单多了。

我们新建一个配置类,DisConfig

代码语言:javascript
复制
package com.tianyalei.disconf.config;

import com.baidu.disconf.client.DisconfMgrBean;
import com.baidu.disconf.client.DisconfMgrBeanSecond;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author wuweifeng wrote on 2017/10/16.
 */
@Configuration
public class DisConfig {
    @Bean(destroyMethod = "destroy")
    public DisconfMgrBean getDisconfMgrBean() {
        DisconfMgrBean disconfMgrBean = new DisconfMgrBean();
        disconfMgrBean.setScanPackage("com.tianyalei.disconf");
        return disconfMgrBean;
    }

    @Bean(destroyMethod = "destroy", initMethod = "init")
    public DisconfMgrBeanSecond getDisconfMgrBean2() {
        return new DisconfMgrBeanSecond();
    }
}

注意设置一下scanpackage设置包名。其他的没什么,配置类就这一类,很简单。

然后在resources下创建一个disconf.properties

代码语言:javascript
复制
# 是否使用远程配置文件
# true(默认)会从远程获取配置 false则直接获取本地配置
enable.remote.conf=true
#
# 配置服务器的 HOST,用逗号分隔  127.0.0.1:8000,127.0.0.1:8000
#
conf_server_host=localhost:80
# 版本, 请采用 X_X_X_X 格式
version=1_0_0_0
# APP 请采用 产品线_服务名 格式
app=test_disconf
# 环境
env=local
# debug
debug=true
# 忽略哪些分布式配置,用逗号分隔
ignore=
# 获取远程配置 重试次数,默认是3次
conf_server_url_retry_times=1
# 获取远程配置 重试时休眠时间,默认是5秒
conf_server_url_retry_sleep_seconds=1

这里需要注意的地方有server_host地址,像这里我是跑在本机,并且上一篇的docker-compose.xml中配置了nginx的端口80并且映射本机的80,所以这里就直接写localhost:80.代表disconf服务端的地址,如果是部署在docker的话,需要写映射的容器别名,如nginxhost:80。version、app、env都需要和在server端添加的保持一致。

然后我们创建一个类,来使用disconf的配置功能。

代码语言:javascript
复制
package com.tianyalei.disconf.service;

import com.baidu.disconf.client.common.annotations.DisconfItem;
import org.springframework.stereotype.Service;

/**
 * @author wuweifeng wrote on 2017/10/16.
 */
@Service
public class PriceService {

    private double money = 1000;

    private static final String KEY = "money";

    /**
     * 单项配置项
     */
    @DisconfItem(key = KEY)
    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }
}

这里有一个DisconfItem注解,指明了一个key,那么该项就会是一个可以动态配置的项了,在服务端通过修改key为money的项,就可以动态修改该值。

我们再写一个controller来获取该price的值,看看效果。

代码语言:javascript
复制
/**
 * @author wuweifeng wrote on 2017/10/16.
 */
@RestController
public class IndexController {
    @Autowired
    private PriceService priceService;
    
    @RequestMapping("/index")
    public Object getPrice() {
        return priceService.getMoney();
    }
}

启动项目

可以看到如下报错信息,就是说连不上zookeeper,找不到zkhost。

那么这是什么意思呢,Disconf是使用zookeeper进行的配置信息推送,server变更后由zookeeper推送到client,在上一篇我们完成了server的配置。如果还记得的话,在配置tomcat时,里面有个zoo.properties,里面就是配置zookeeper的地址。

报错信息里的zkhost unknown就是从这里来的,client从server获取zookeeper的地址,得到了这样的地址 zkhost:2181,然后客户端连不上zookeeper,所以就报错了。

由于我们在部署zookeeper的docker时并没有开放它的对外端口,也就是无法从外面直接访问zookeeper,只能通过docker的link方式才行。所以要想跑起来这个client demo,也得在docker环境下。

我们在工程根目录创建dockerfile

代码语言:javascript
复制
FROM hub.c.163.com/wuxukun/maven-aliyun:3-jdk-8

ADD pom.xml /tmp/build/

ADD src /tmp/build/src
        #构建应用
RUN cd /tmp/build && mvn clean package \
        #拷贝编译结果到指定目录
        && mv target/*.jar /app.jar \
        #清理编译痕迹
        && cd / && rm -rf /tmp/build

VOLUME /tmp
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

然后注意修改disconf.properties里的host地址为

代码语言:javascript
复制
conf_server_host=nginxhost:80

在docker下localhost是不行的,也要通过link的方式去获取nginx容器的ip地址。

构建镜像,在工程根目录下执行

代码语言:javascript
复制
docker build -t test_disconf .

等到构建完毕,可以得到一个叫test_disconf的镜像。

先看看上一篇已经启动好的容器:docker ps

启动该镜像,需要注意,我们此前已经启动过了一个docker-compose.xml了,而现在我们要启动一个新的容器,并且要link之前的里面的容器。我们先来看看普通的启动用法:

代码语言:javascript
复制
docker run --link=wuwf_disconf_zookeeper_1:zkhost --link=wuwf_disconf_nginx_1:nginxhost  -d -p 8080:8080  test_disconf

发现报错了,说not belong to the default network,这里有解决方案,https://stackoverflow.com/questions/36489696/cannot-link-to-a-running-container-started-by-docker-compose

就是说docker-compose启动的docker在一个network里,你现在又启动了一个,在另一个network里,不同的network之间不能link。

我们通过命令来看一下docker network ls

可以看到之前的network为wuwf_default,下面我们就可以通过如下的方式来link了

代码语言:javascript
复制
docker run --link=wuwf_disconf_zookeeper_1:zkhost --link=wuwf_disconf_nginx_1:nginxhost --net wuwf_default  -d -p 8080:8080  test_disconf

添加--net就OK了。

再次执行,启动成功了。

启动成功后我们就可以在后台web界面看到

我们测试一下:

访问 localhost:8080/index

可以看到这里取到的price的值就已经是从Disconf后台配置的了,不再是代码里写的100.

我们来修改一下price的值

可以看到后台修改后,立马就生效了。

这就是配置中心的使用,后面来介绍一下复杂的配置,不仅仅是这种单个属性的单项配置。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年10月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档