客户端应用接入Apollo

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了客户端应用接入Apollo相关的知识,希望对你有一定的参考价值。

参考技术A

本文将介绍如何让现有的Spring Boot项目接入Apollo,还未搭建Apollo服务端的请移步到我前面的文章进行阅读。

下面以 Cas 单点登录项目为例,进行简单的接入操作,更多详细的方法请参考:

[github官方文档] https://github.com/ctripcorp/apollo/wiki/Java 客户端使用指南

接入之前,需要先在 Apollo 服务器创建需要的配置项。

默认访问: localhost:8070 创建项目

添加并发布配置项

修改 application.properties 或 bootstrap.properties 配置

在启动类添加 @EnableApolloConfig 注解。

目前在我们公司的项目中,cas使用第一种方式,其他项目使用第二种方式。因为cas单点登录的启动类不是我们自定义的,直接在配置文件中配置比较方便。

其他方式这里不进行介绍了,想具体了解的可以到官网。

在 application.properties 或者 bootstrap.properties 中按照如下样例进行配置

这种配置方式不适用于多个war包部署在同一个tomcat的使用场景,考虑到我们公司虽然是做往微服务方向发展,但是可能也会以war包的形式部署到同一个tomcat,所以我没采用这种方式,而是采用了第二种方式。

在 resources/META-INF/ 目录下创建 app.properties 文件,把 app.id apollo.meta 的配置移到该配置文件.

下图中,我采用了占位符形式是为了便于实施人员在Maven编译部署时可以以设置变量的方式进行赋值,避免更改配置文件(这里可以不用Maven设置变量的方式,直接写configserver的地址也可以。)。而开发人员在本地进行开发时,可以在通过 server.properties 配置文件来进行配置 apollo.meta ,因为通过 server.properties 配置的方式优先级比在 app.properties 配置的方式高。

使用Maven设置变量的方式需要在pom.xml文件添加resources标签

通过server.properties配置文件

启动 Cas 成功,登录后,访问上面的测试接口:

apollo 配置起效。

学习使用Apollo配置中心

Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端。

Apollo官网地址

如何安装服务端可以按照上面官网的步骤。

这里主要说明一下应用如何接入apollo。

应用接入apollo步骤:

1、Appid

确保classpath:/META-INF/app.properties文件存在,并且其中内容形如:app.id=YOUR-APP-ID

服务端的appid

2、Environment

应用在不同的环境可以有不同的配置, Environment可以通过以下3种方式的任意一个配置:

  • 2.1 通过Java的System Property env来指定环境
    -Denv=YOUR-ENVIRONMENT
  • 2.2 通过操作系统的System Environment env来指定环境
  • 2.3 通过配置文件来指定env=YOUR-ENVIRONMENT
    对于Mac/Linux,文件位置为/opt/settings/server.properties
    对于Windows,文件位置为C:\\opt\\settings\\server.properties
    目前,env支持以下几个值(大小写不敏感):
    DEV, FAT, UAT, PRO

服务端的environment

3、本地缓存

Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,当去服务器读取配置失败时,会使用本地缓存的。

Mac/Linux: /opt/data/{appId}/config-cache

Windows: C:\\opt\\data{appId}\\config-cache

确保目录存在,且应用有读写权限。

4、添加依赖

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>0.6.2</version>
</dependency>

<repository>
    <id>internal.repo</id>
    <url>https://raw.github.com/ctripcorp/apollo/mvn-repo/</url>
</repository>

5、指定服务端

通过Java的System Property env来指定

-Ddev_meta=http://192.168.30.27:8018

6、读取配置

通过namespace读取配置,如果不指定则默认拿application

  • 6.1 api方式

通过api方式获取的配置,修改时不用重启项目,直接生效。

Config config = ConfigService.getAppConfig(); //ConfigService.getConfig(Namespace);
String key = "key"; //key
String defaultValue = "defaultValue"; //默认值,读取不到配置就会使用默认值,建议都加上默认值
String value = config.getProperty(key, defaultValue);

监听配置修改事件

Config config = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null
config.addChangeListener(new ConfigChangeListener() {
    @Override
    public void onChange(ConfigChangeEvent changeEvent) {
        System.out.println("Changes for namespace " + changeEvent.getNamespace());
        for (String key : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(key);
            System.out.println(String.format("Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
        }
    }
});
  • 6.2 结合Spring方式

6.2.1 基于XML的配置

<?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.xsd
       http://www.ctrip.com/schema/apollo http://www.ctrip.com/schema/apollo.xsd">
    <!-- 这个是最简单的配置形式,一般应用用这种形式就可以了,用来指示Apollo注入application namespace的配置到Spring环境中 -->
    <apollo:config/>
    <!-- 这个是稍微复杂一些的配置形式,指示Apollo注入FX.apollo和FX.soa namespace的配置到Spring环境中 -->
    <apollo:config namespaces="FX.apollo,FX.soa"/>
    <bean class="com.ctrip.framework.apollo.spring.TestXmlBean">
        <property name="timeout" value="${timeout:100}"/>
        <property name="batch" value="${batch:200}"/>
    </bean>
</beans>

6.2.2 基于Java的配置

使用@Value(${key:defaultValue})

public class TestJavaConfigBean {
  @Value("${timeout:100}")
  private int timeout;
  private int batch;
 
  @Value("${batch:200}")
  public void setBatch(int batch) {
    this.batch = batch;
  }
 
  public int getTimeout() {
    return timeout;
  }
 
  public int getBatch() {
    return batch;
  }
}

@ApolloConfig用来自动注入Config对象
@ApolloConfigChangeListener用来自动注册ConfigChangeListener

public class TestApolloAnnotationBean {
  @ApolloConfig("application")
  private Config anotherConfig; //inject config for namespace application
 
  //config change listener for namespace application
  @ApolloConfigChangeListener("application")
  private void anotherOnChange(ConfigChangeEvent changeEvent) {
    //do something
  }
 
}

服务端的namespace:

以上是关于客户端应用接入Apollo的主要内容,如果未能解决你的问题,请参考以下文章

Apollo 客户端 devtool 无法在反应本机应用程序中检测到 Apollo 客户端

如何在本地网络上部署带有 apollo 客户端和 apollo-server 后端的 React 应用程序

将 Angular 应用程序连接到多个 Apollo 客户端

开发阿波罗有python版本么

反应应用程序上的 Apollo 客户端缓存问题

是否可以有一个 Apollo 服务器,为同一个应用程序服务 React 客户端?