应用对接apollo
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要
额外安装Tomcat等应用容器。
官方github:https://github.com/ctripcorp/apollo
主要组件:
- apollo-configservice:提供配置获取接口,提供配置更新推送接口,接口服务对象为Apollo客户端
- apollo-adminservice:提供配置管理接口,提供配置修改、发布等接口,接口服务对象为Portal,以及Eureka
- apollo-portal:提供Web界面供用户管理配置
- apollo-client:Apollo提供的客户端程序,为应用提供配置获取、实时更新等功能
原理图:
- 上图简要描述了配置发布的大致过程:
- 用户在Portal操作配置发布
- Portal调用Admin Service的接口操作发布
- Admin Service发布配置后,发送ReleaseMessage给各个Config Service
- Config Service收到ReleaseMessage后,通知对应的客户端
2.1:准备项目
- 登陆apollo的portal http://******:6060
- 创建项目
注意应用id就是app.id后面会用到
- 添加集群选择环境,按照实际情况填写
关注点:Apollo默认会读取机器上/opt/settings/server.properties(linux)或C:\opt\settings\server.properties(windows)文件中的idc属性作为集群名字.
- 新增和发布配置
2.2:准备pom文件
由于apollo底层实现需要spring所以需要spring的依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
其它的依赖
<!-- 自己封装包 -->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-core</artifactId>
<version>1.11.0.yc</version>
</dependency>
<!-- 自己封装包 -->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.11.0.yc</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.inject/guice -->
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.2.2</version>
</dependency>
2.3:准备需要的文件参考:
- 准备server.properties文件
Windows机器:C:\opt\settings\server.properties
Linux机器:/opt/settings/server.properties
#env属性值是你选择的环境 env=FAT #idc属性值是在创建集群时所填的集群名 idc=test-flink |
- 确保classpath:/META-INF/app.properties文件存在,并且其中内容形如:app.id=YOUR-APP-ID
由于apollo core jar包里面已经封装了apollo.meta信息,所以这里不需要指定
2.4:应用程序编写以及测试
1: flink整合apollo,样例代码
{
public static void main(String[] args) throws Exception {
// set up the streaming execution environment
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
env.setParallelism(1);
env.addSource(new RichSourceFunction<String>() {
private Config config;
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
config = ConfigService.getAppConfig();
config.addChangeListener(new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent configChangeEvent) {
for (String key : configChangeEvent.changedKeys()) {
ConfigChange change = configChangeEvent.getChange(key);
System.out.println("changed key:"+change.getPropertyName()+" changed old value:"+change.getOldValue()+" changed new value:"+change.getNewValue()
+ change.getChangeType());
}
}
});
}
@Override
public void run(SourceContext<String> ctx) throws Exception {
while (true) {
ctx.collect(config.getProperty("name", "zxr"));
Thread.sleep(3000);
}
}
@Override
public void cancel() {
}
}).print();
env.execute("zxr flink Apollo");
}
}
然后运行程序,控制台输出远程配置已经更新说明成功
此时,你可以去portal对发布的属性进行修改,比如我这里
把TIME_WINDOW_RANGE属性由1||100||1000||10000||30005 改成1||100||1000||10000||30000
Configserver很快监听到配置变化,并输出如下日志:
2: spring boot整合apollo,样例代码
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.model.ConfigChange;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfig;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@EnableApolloConfig
@RestController
@SpringBootApplication
public class ApolloFlinkApplication {
@ApolloConfig
private Config config; //inject config for namespace application
@Value("${TIME_WINDOW_RANGE:test}")//读取不到,默认赋值为test,避免应用启动报错
String TIME_WINDOW_RANGE;
@RequestMapping("apollo")
public String apollo() {
return TIME_WINDOW_RANGE;
}
@ApolloConfigChangeListener
private void someOnChange(ConfigChangeEvent changeEvent) {
//update injected value of batch if it is changed in Apollo
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
System.out.println("changed key:"+change.getPropertyName()+" changed old value:"+change.getOldValue()+" changed new value:"+change.getNewValue()
+ change.getChangeType());
}
}
public static void main(String[] args) {
SpringApplication.run(ApolloFlinkApplication.class, args);
}
}
注意点:
1:由于删除应用影响面较大,所以现在暂无删除应用功能。此外,除了appId之外,其它app相关信息都能修改,所以不建议删除app。如果确实需要删除应用的话,可以参照下面的sql手动删除数据库相关的表。
2:建议app.id命名格式为:app.id={yourcompany}-{component}-{Usage}-{Environment}
Tips:
Yourcompany=yc
Component=flink/spark/hive/.......
Usage=realtime-etl/offline-etl/interfacelogview/.......
Environment=DEV/FAT/UAT/PRO
环境说明:DEV开发环境
FAT测试环境,相当于alpha环境(功能测试)
UAT集成环境,相当于beta环境(回归测试)
PRO生产环境