Apollo使用篇 - Apollo客户端的使用

news/2024/7/7 18:48:13

准备工作

环境要求

Java 1.8+

Guava 20.0+

必选设置

导入依赖

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

客户端使用

1、API 方式

API 方式是最简单、高效使用使用 Apollo 配置的方式,不依赖 Spring 框架即可使用。

获取命名空间的配置

// 1、获取默认的命名空间的配置
Config config = ConfigService.getAppConfig();

// 2、获取properties格式的命名空间的配置
// String somePublicNamespace = "CAT";
// Config config = ConfigService.getConfig(somePublicNamespace);

// 3、获取yaml/yml格式的命名空间的配置
// Config config = ConfigService.getConfig("application.yml");

// 4、获取其它格式的命名空间的配置
// ConfigFile configFile = ConfigService.getConfigFile("test", ConfigFileFormat.XML);
// String content = configFile.getContent();

String someKey = "someKeyFromDefaultNamespace";
String someDefaultValue = "someDefaultValueForTheKey";
String value = config.getProperty(someKey, someDefaultValue);

通过 Config 的 getProperty 方法可以获取到指定属性对应的属性值。

监听配置变化事件

Config config = ConfigService.getAppConfig();
config.addChangeListener(new ConfigChangeListener() {
  @Override
  pubic 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()));
    }
  }
});

希望配置发生变化时得到通知。通过 Config 的 addChangeListener 方法添加一个 ConfigChangeListener 监听器。

2、Spring 整合方式

可以在代码中直接使用,如:@Value("${someKeyFromApollo:someDefaultValue}")

也可以在配置文件中使用,如:spring.datasource.url:${someKeyFromApollo:someDefaultValue}

甚至可以直接托管 Spring 中的配置。如:在 Apollo 中直接配置 spring.datasource.url=jdbc:mysql://localhost:3306/somedb

支持 Spring Boot 的 @ConfigurationProperties 方式。

也支持结合 API 方式使用,如:@ApolloConfig private Config config;

2.1 配置

2.1.1 基于 Spring 的配置

注入默认的命名空间的配置到 Spring 中

@Configuration
@EnableApolloConfig
public class AppConfig {
  
}

注入多个命名空间的配置到 Spring 中

@Configuration
@EnableApolloConfig({"FX.apollo", "application.yml"})
public class AnotherAppConfig {
  
}

注入多个命名空间的配置到 Spring 中,并且指定顺序

在 @EnableApolloConfig 注解中的 order 属性指定顺序,值越小则顺序越靠前。

@Configuration
@EnableApolloConfig(order = 2)
public class AppConfig {
  
}

@Configuration
@EnableApolloConfig(value = {"FX.apollo", "application.yml"}, order = 1)
public class AnotherAppConfig {
  
}

2.1.2 基于 Spring Boot 的配置

额外支持通过 application.properties / bootstrap.properties 进行配置,该方式可以使配置在更早的阶段注入,比如使用 @ConditionalOnProperty 的场景或者有一些 spring-boot-starter 在启动阶段就需要读取配置然后做一些事情。

# 启动阶段注入application命名空间的配置
apollo.bootstrap.enabled = true

也支持注入多个命名空间的配置。

# 启动阶段注入application,FX.apollo,application.yml命名空间的配置
apollo.bootstrap.enabled = true
apollo.bootstrap.namespaces = application,FX.apollo,application.yml

可以让 Apollo 的加载顺序在日志系统之前,比如希望把日志相关的配置(logging.level.root=info 或者 logback-spring.xml 中的参数)也交给 Apollo 管理。

# 启动阶段注入application命名空间的配置
apollo.bootstrap.enabled = true
# 让 Apollo 的加载顺序在日志系统之前
apollo.bootstrap.eagerLoad.enabled = true

2.1.3 基于 Spring Boot Config Data Loader 的配置

详细内容参考官方文档 - Spring Boot Config Data Loader

2.2 使用

2.2.1 Spring Placeholder 的使用

在 Spring 环境中,可以使用占位符的形式注入配置,如:${someKey:someDefaultValue}

建议在实际使用时尽量给出默认值,以免由于 key 没有定义导致运行时错误。

从 v0.10.0 版本开始,支持占位符的运行时自动更新。想要关闭占位符的运行时自动更新,可以选择如下任意方法:

1、通过设置系统参数,如启动时传入 -Dapollo.autoUpdateInjectedSpringProperties=false

2、通过设置 META-INF/app.properties 中的 apollo.autoUpdateInjectedSpringProperties 属性,如:

app.id = SampleApp
apollo.autoUpdateInjectedSpringProperties = false
2.2.1.1 XML 中占位符的使用

假设 TestXmlBean 中有两个配置项需要注入。

public class TestXmlBean {
  private int timeout;
  private int batch;
 
  public void setTimeout(int timeout) {
    this.timeout = timeout;
  }

  public void setBatch(int batch) {
    this.batch = batch;
  }
 
  public int getTimeout() {
    return timeout;
  }
 
  public int getBatch() {
    return batch;
  }
}

在 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:config/>
    <bean class="com.ctrip.framework.apollo.spring.TestXmlBean">
        <property name="timeout" value="${timeout:100}"/>
        <property name="batch" value="${batch:200}"/>
    </bean>
</beans>
2.2.1.2 Java Config 中占位符的使用

假设 TestJavaConfigBean 中,需要注入两个属性。

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;
  }
}
@Configuration
@EnableApolloConfig
public class AppConfig {
  
  @Bean
  public TestJavaConfigBean javaConfigBean() {
    return new TestJavaConfigBean();
  }
}

2.2.2 ConfigurationProperties 的使用

Spring Boot 提供了 @ConfigurationProperties 注解用于将配置注入到 bean 对象中。

Apollo 也支持这种方式。

@ConfigurationProperties(prefix = "redis.cache")
public class SampleRedisConfig {
  private int expireSeconds;
  private int commandTimeout;

  public void setExpireSeconds(int expireSeconds) {
    this.expireSeconds = expireSeconds;
  }

  public void setCommandTimeout(int commandTimeout) {
    this.commandTimeout = commandTimeout;
  }
}
@Configuration
@EnableApolloConfig
public class AppConfig {
  @Bean
  public SampleRedisConfig sampleRedisConfig() {
    return new SampleRedisConfig();
  }
}

需要注意的是,@ConfigurationProperties 如果需要在配置发生变化时自动更新注入的值,需要配合使用 EnvironmentChangeEvent 或者 RefreshScope,可以参考 EnvironmentChangeEvent 样例、RefreshScope 样例1、RefreshScope 样例2。

2.2.3 Spring Annotation 的使用

Apollo 在 Spring 环境中,提供了如下三个注解:

  • @ApolloConfig:用来自动注入 Config 对象。
  • @ApolloConfigChangeListener:用来自动注册 ConfigChangeListener。
  • @ApolloJsonValue:用来将配置的 json 字符串自动注入为对象。
public class TestApolloAnnotationBean {
  
  @ApolloConfig
  private Config config;					 // 注入“application”命名空间的配置
  
  @ApolloConfig("application")
  private Config anotherConfig;		 // 注入“application”命名空间的配置
  
  @ApolloConfig("FX.apollo")
  private Config yetAnotherConfig; // 注入“FX.apollo”命名空间的配置
  
  @ApolloConfig("application.yml")
  private Config ymlConfig;				 // 注入“application.yml”命名空间的配置
  
  /**
   * jsonBeanProperty=[{"someString":"hello","someInt":100},{"someString":"world!","someInt":200}]
   */
  @ApolloJsonValue("${jsonBeanProperty:[]}")
  private List<JsonBean> anotherJsonBeans;	// 将“jsonBeanProperty”字符串解析并注入
  
  @Value("${batch:100}")
  private int batch;
  
  @ApolloConfigChangeListener
  public void someOnChange(ConfigChangeEvent changeEvent) {	// 监听“application”命名空间的配置的变化
    if (changeEvent.isChanged("batch")) {
      this.batch = config.getIntProperty("batch", 100);
    }
  }
  
  @ApolloConfigChangeListener({"application", "FX.apollo", "application.yml"})
  public void yetAnotherOnChange(ConfigChangeEvent changeEvent) {	// 监听“application”、“FX.apollo”、“application.yml”命名空间的配置的变化
    
  }
  
}
@Configuration
@EnableApolloConfig
public class AppConfig {
  
  @Bean
  public TestApolloAnnotationBean testApolloAnnotationBean() {
    return new TestApolloAnnotationBean();
  }
}

2.2.4 已有配置迁移

详细内容参考官方文档 - 已有配置迁移


http://lihuaxi.xjx100.cn/news/859402.html

相关文章

算法设计 - 前缀和 差分数列

一维数组前缀和的概念 前缀和的概念很简单&#xff0c;我们用一维数组的前缀和来举例&#xff0c;有如下一维数组&#xff1a; arr [1, 2, 3, 4, 5] 该数组的前缀和数组如下 preSum [1, 3, 6, 10, 15] 关系如下&#xff1a; preSum[0] arr[0]preSum[1] arr[0] arr[1]pre…

路由器刷固件

前言 我希望可以远程访问我的电脑。但&#xff0c;我不希望电脑总是处于运行状态&#xff0c;因为那样比较费电。所以需要一个方案&#xff0c;能将睡眠/关机中的电脑唤醒。 方案一&#xff1a;选用智能插座&#xff0c;远程给电脑上电。电脑设置上电自启。但&#xff0c;这存…

随着攻击者适应绕过零信任,公司在苦苦挣扎

商业情报公司 Gartner 表示&#xff0c;零信任安全方法有望减少威胁并降低成功攻击的破坏性&#xff0c;但公司不应期望实施零信任原则会很容易或阻止大多数攻击。 虽然对零信任架构的兴趣很高&#xff0c;但目前只有大约 1% 的组织拥有满足零信任定义的成熟程序。 该公司还估…

LightningChart JS v4.0.0 and LightningChart NET

LightningChart JS v4.0.0 引入了新的 DataGrid 组件、全面的折线图类型和视觉主题。2023 年 2 月 9 日 - 16:05 新版本特征 下一代色彩主题&#xff1a; 暗金。网络空间。绿松石六角形。光。光自然。自定义 - 创建您自己的下一代颜色主题。新的 DataGrid 组件 DataGrid 组件是…

虹科方案 | 制药环境中冰箱温度记录的最佳实践——全集成温度监测系统

有效监测冰箱温度是药店、医疗中心和制药实验室的一项重要要求。保持准确的冰箱温度记录对所有储存处方药和疫苗的设施来说是必不可少的&#xff0c;但实现这一目标的最佳方法是什么&#xff1f;● 制药机构需要在特定的温度下储存疫苗和处方药&#xff0c;以保证病人的安全并确…

数据仓库,数据湖

1. 数据仓库 早期系统采用数据库来管理和存放数据&#xff0c;但随着大数据技术的兴起&#xff0c;大家想要通过大数据技术来找到数据之间可能存在的关系&#xff0c;所以大家设计了一套新的数据存储管理系统&#xff0c;把所有的数据全部存储到数据仓库&#xff0c;然后统一对…

RabbitMQ-消息应答

一、介绍为了保证消息在发送过程中不丢失&#xff0c;rabbitmq引入消息应答机制&#xff0c;消息应答就是&#xff1a;消费者在接收到消息并且处理该消息之后&#xff0c;告诉rabbitmq它已经处理了&#xff0c;rabbitmq可以把该消息删除了。二、自动应答消息发送之后立即被认为…

浅谈保护数据的加密策略

加密是一种将信息从可读格式转换为混乱字符串的技术。这样做可以防止数据传输中的机密数据泄露。文档、文件、消息和所有其他形式的网络通信都可以加密。加密策略和身份验证服务的结合&#xff0c;还能保障企业机密信息只对授权用户开启访问权限。常见的数据加密包括以下两种&a…