Apollo 系列 ———— (二) Apollo 客户端


JAVA 应用程序配置

关于 namespace 的理解,namespace 其实是一系列配置项的集合,比如说我们配置 redis 的相关配置,需要有 host , port 等配置项,我们可以 把 redis.host,redis.port 这些配置项直接放到默认的 namespace 里面,也可以自己新建一个 namespace ,名称叫做 redis。这样方便我们管理 redis 相关的配置项。

引入 maven 依赖

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>${apollo.version}</version>
 </dependency>

配置 meta 地址

resourcess/META-INF 目录下创建 app.properties 文件

# 应用的id
app.id=SampleApp
# configService 的地址
apollo.meta=http://localhost:9080,http://localhost:9081

在这儿需要明确一下 apollo 的配置项,apollo 提供了2个 key 来配置 meta 的地址。第一种为 apollo.meta 当这个配置项被配置在配置文件或者 java 环境变量的时候,不配置 env 也可以正常获取配置。第二种为 dev.meta,fat.meta,pro.meta 这种配置项,需要在 配置文件或者 java 环境变量里面设置 env 的值为对应的环境,否则 apollo 会去请求 http://apollo.meta 这个默认的地址

获取配置

package com.apollo.demo;

import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Boot {
    public static void main(String[] args) throws InterruptedException {
        Config appConfig = ConfigService.getAppConfig();
        String property  = appConfig.getProperty("timeout", "");
        log.info("读取到配置:{}", property);
    }
}

java 运行结果

参考代码

Spring 配置

引入 maven 依赖

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>${apollo.version}</version>
 </dependency>

配置 meta 地址

resourcess/META-INF 目录下创建 app.properties 文件


# test
app.id=SampleApp
apollo.meta=http://localhost:9080,http://localhost:9081

配置 namespace

创建 spring 配置文件,在里面启用 apollo 的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:apollo="http://www.ctrip.com/schema/apollo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.ctrip.com/schema/apollo http://www.ctrip.com/schema/apollo.xsd">

    <!--没有明确指定 namespace 的时候使用默认的 application-->
    <apollo:config/>

    <!--将 apollo 的 redis.host 配置项注入到了 host 里面,如果没有使用默认值 127.0.0.1-->
    <bean id="testApp" class="com.apollo.demo.spring.config.ApolloConfig.TestApp">
        <property name="host" value="${redis.host:127.0.0.1}"/>
    </bean>


</beans>

获取配置

在完成以上的配置之后,TestApp 已经使用了 apollo 的配置,所以我们写一个 controller 测试一下即可

apollo 里面的 redis.host 配置的值为 fat

 apollo 配置


@RestController
public class DemoController {

    @Autowired
    private ApolloConfig.TestApp testApp;

    @GetMapping("test")
    public String test() {
        return "value from apollo :" + testApp.getHost();
    }
}

请求 controller 之后获取到的 redis.host 的值也为 fat

 controller 配置

参考代码

Spring Boot 配置

引入 maven 依赖

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>${apollo.version}</version>
 </dependency>
  <!--为了让apollo支持动态刷新bean的值,需要引入该组件-->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-context</artifactId>
    <version>2.1.1.RELEASE</version>
  </dependency>
 

请注意,apollo 动态刷新 bean 的值,需要引入 spring-cloud-context 的 jar 包

配置文件

我使用了 yml 格式的配置,效果和 propertie 是一样的。配置文件里面只需要配置一下允许 apollo 配置和 meta 远程地址就可以了。


server:
  port: 8888

apollo:
  bootstrap:
    # 和 @EnableApolloConfig 注解等效
    enabled: true
  # 配置远程地址
  meta: http://localhost:9080

app:
  id: SampleApp
  

java 配置

本次例子使用 apollo 配置中心里面的值来注入到应用里面的 bean,然后当配置中心的值发生变化的时候,应用里面的 bean 也会发生变化,以上 demo 都是基于默认的 namespace 来进行的

上面的代码表示 App 这个 bean 将会使用配置中心里面 app 开头的配置来进行装配,需要注意的是 App 里面的属性名必须和远程配置中心里面的 保持一致。

对于已经初始化过的bean,都需要通过注入 RefreshScope 来完成 bean 的动态更新。

@ApolloConfigChangeListener
    public void listener(ConfigChangeEvent configChangeEvent) {
        configChangeEvent.changedKeys().forEach(key -> {
            ConfigChange change = configChangeEvent.getChange(key);
            log.info("key [{}] changed [{}] ---> [{}]", key, change.getOldValue(), change.getNewValue());
            // 判断是否是 app 的配置
            if (change.getPropertyName().startsWith("app")) {
                // 刷新 app 这个bean的值
                refreshScope.refresh(APP);
            }
        });
    }

测试结果

访问 http://localhost:8888/app 来测试我们的配置有没有动态更新

应用启动后访问 http://localhost:8888/app 显示的 app.hostwww.baidu.com

发布前配置

修改远程配置中心 app.host 的值为 www.bilibili.com,然后发布这一次更改,一定要记得发布修改

发布后配置

参考代码

  #apollo 

« Apollo 系列 ———— (一) 部署 Apollo 关于数据库 ACID 和三大范式的通俗解释 »
blog comments powered by Disqus