Apollo使用

2020/04/03 Apollo

Apollo使用

Java中使用Apollo

普通Java项目中使用

添加Apollo Client的Maven依赖。

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

使用API的方式来获取配置。

public class App {  
    public static void main(String[] args) {
    Config config = ConfigService.getAppConfig();
    String key = "username";
    String defaultValue = "尹吉欢";
    String username = config.getProperty(key, defaultValue);
    System.out.println("username=" + username);
    }
}

通过ConfigService得到Config对象,config.getProperty()方法可以传入你想获取的配置Key,defaultValue是当配置中心找不到配置的时候返回的默认值,避免空指针异常。 运行上面这段代码,输出的结果是默认值尹吉欢。因为我们还没有指定Apollo需要的一些必要信息,这些信息包括Meta Server、AppId和Environment。Cluster可以不用指定,用默认即可。

Meta Server配置

Apollo支持应用在不同的环境中有不同的配置,所以需要运行提供给Apollo客户端当前环境的Apollo Meta Server信息。在默认情况下,meta server和config service是部署在同一个JVM进程里的,所以meta server的地址就是config service的地址。 目前我们用的快速启动包只有一个DEV环境,config service的地址是http://localhost:8080,这个已经在启动脚本demo.sh中定义好了。 Meta Server的地址配置有多种方式,更多配置方式请查看官方文档:https://github.com/ctripcorp/apollo/wiki/Java客户端使用指南#122-apollo-meta-server。 为了能够让示例代码在各位读者的电脑上也能直接运行,我们将配置定在classpath:/META-INF/app.properties中。内容为apollo.meta=http://localhost:8080。

APPid配置

APPid是应用的身份信息,是从服务端获取配置的一个重要信息。同样APPid的配置方式也有多种,我们采用跟Meta Server一样的方式,配置在classpath:/META-INF/app.properties中。内容为app.id=SampleApp。 SampleApp在Portal的项目主页面中有展示,如果是你自己新建的项目,那么就是你自定义的AppId。

Environment配置

Environment跟项目本身没有关系,一个项目可以部署在不同的环境中,代码不需要改变,需要变化的只是配置值而已。所以Environment的配置不能配置在项目中,最常用的有如下两种配置方式。

  • (1)通过Java System Property 可以通过Java的System Property env来指定环境。 在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT。 如果是运行jar文件,需要注意格式为java-Denv=YOUR-ENVIRONMENT-jar xxx.jar。 注意key为全小写。

  • (2)通过配置文件 最后一个推荐的方式是通过配置文件来指定env=YOUR-ENVIRONMENT。 对于Mac/Linux,文件位置为/opt/settings/server.properties。 对于Windows,文件位置为C:\opt\settings\server.properties。 server.properties内容为env=DEV。 同样的,为了能够让本书的示例代码能够更方便地在各位读者的电脑上运行,我们就用ava System Property的方式来指定Environment,要么在IDE的启动参数中指定,要么就在main方法的第一行通过代码指定(仅供开发演示用,不能用于生产环境)。 通过代码设置环境

    public static void main(String[] args) {
    System.setProperty("env", "DEV");
    // ....
    }
    

    所有配置完成之后,我们再次运行前面的示例代码,可以看到输出的内容就是我们自己配置的值。

监听配置变化事件

在某些场景下,当配置发生变化的时候,我们需要进行一些特殊的处理。比如,数据库连接串变化后需要重建连接等,就可以使用API提供的监听机制。 配置修改监听回调

config.addChangeListener(new ConfigChangeListener() {
    public void onChange(ConfigChangeEvent changeEvent) {
    System.out.println("发生修改数据的命名空间是:" + changeEvent.getNamespace());
    for (String key : changeEvent.changedKeys()) {
        ConfigChange change = changeEvent.getChange(key);
        System.out.println(String.format("发现修改 - 配置key: %s, 原来的值: %s, 修改后的值: %s, 操作类型: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
        }
    }
});

当我们在Portal中进行修改配置时,就会触发监听事件,输出结果为:

发生修改数据的命名空间是:application
发现修改 - 配置key: username, 原来的值: yinjihuan, 修改后的值: yinjihuan1, 操作类型: MODIFIED

 Spring Boot中使用

首先准备一个Spring Boot项目,加入Apollo Client的Maven依赖: Apollo Maven依赖

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

然后配置Apollo的信息,配置放在application.properties中:

app.id=SampleApp
apollo.meta=http://localhost:8080
apollo.cluster=test
apollo.bootstrap.enabled=true
apollo.bootstrap.eagerLoad.enabled=true
apollo.bootstrap.namespaces=application

其中,

  • app.id:身份信息。
  • apollo.meta:Meta Server(Config Service)。
  • apollo.bootstrap.enabled:项目启动的bootstrap阶段,向Spring容器注入配置信息。
  • apollo.bootstrap.namespaces:注入命名空间。 环境同样在main方法中指定。 启动类中指定环境
    @SpringBootApplication
    public class App {
      public static void main(String[] args) {
      // 指定环境(仅供开发演示用,不能用于生产环境))
          System.setProperty("env", "DEV");
          SpringApplication.run(App.class, args);
      }
    }
    

    Placeholder注入配置

    Placeholder注入配置。 ```java /**

  • 用户名,默认值为yinjihuan */ @Value(“${username:yinjihuan}”) private String username; ```

    Java Config使用方式

    Java Config使用方式 ```java @Data @Configuration public class UserConfig {

    @Value(“${username:yinjihuan}”) private String username;

}

使用Config配置类注入
```java
@Autowired
private UserConfig userConfig;

ConfigurationProperties使用方式

ConfigurationProperties的使用方法

@Data
@Configuration
@ConfigurationProperties(prefix = "redis.cache")
public class RedisConfig {
private String host;
}

配置中心只需要增加redis.cache.host配置项即可实现注入,配置内容如下:

redis.cache.host = 192.168.1.1

ConfigurationProperties方式有个缺点,当配置的值发生变化时不会自动刷新,而是需要手动实现刷新逻辑,笔者建议大家不要使用这种方式,比较繁琐。如果有配置需要加统一前缀的方式可以用Java Config的方式代替。

Spring Annotation支持

  • (1)@ApolloConfig 用来自动注入Apollo Config对象 ```java @ApolloConfig private Config config;

@GetMapping(“/config/getUserName3”) public String getUserName3() { return config.getProperty(“username”, “yinjihuan”); }


- (2)@ApolloConfigChangeListener
用来自动注册ConfigChangeListener
```java
@ApolloConfigChangeListener
private void someOnChange(ConfigChangeEvent changeEvent) {
    if(changeEvent.isChanged("username")) {
    System.out.println("username发生修改了");
    }
}
  • (3)@ApolloJsonValue 用来把配置的JSON字符串自动注入为对象。 ```java @Data public class Student {

    private int id;

    private String name;

}

ApolloJsonValue注解使用
```java
@ApolloJsonValue("${stus:[]}")
private List<Student> stus;

后台增加配置内容如下:

stus = [{"id":1,"name":"jason"}]

Search

    微信好友

    博士的沙漏

    Table of Contents