Apollo与Zuul整合的几点简单记录
Apollo部署安装
部署安装参考gihub的官方教程就可以了,比较详细,附上链接QuickStart,这里记录几个主要步骤:
1.下载apollo项目
2.安装mysql
3.初始化数据库,初始化sql在apollo项目的mysql目录,有两个,分别对应ApolloPortalDB和ApolloConfigDB,两个都要初始化
4.编辑项目中的demo.sh文件,添加数据库配置,下面是默认的配置,如果跟实际不一样按实际修改
#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)
5.启动服务,在项目的目录下执行下面的命令,注意这里要留意对应的接口是否被占用,apollo默认有3个接口,8070、8080、8090,其中8070是apllo管理后台,8080是内置的eureka服务,8090是adminservice的,启动需要一点时间,大概几分钟
./demo.sh start
这时成功启动的提示,如果失败可以查看日志,日志在/service/apollo-service.log
可以通过访问8080端口查看apollo启动的服务
到这里Apollo就启动成功了,接下来可以访问8070端口进入Apollo的管理后台管理我们的项目配置
zuul配置Apollo参数
在zuul的bootstrap.yml中加入以下配置,连接到Apollo服务器
apollo:
#configservice的服务器地址,默认是8080端口
meta: http://localhost:8080
bootstrap:
enabled: true
#需要加载的配置
namespaces: application
#@value的自动更新
autoUpdateInjectedSpringProperties: true
zuul启动的时候会根据上面的配置从Apollo服务器中加载,如果配置都正确的话,可以看到控制台会输出appid,当前的环境,连接到的Apollo服务器地址,在这里可以检查自己的配置是否正确。
这里注意一个坑,namespace的命名问题,Apollo默认只支持properties方式的namespace命名方式,即用.来分割,如下图有两个namespace分别是eureka-zuul-app和eureka.zuul.app,在启动的时候由于eureka-zuul-app的命名问题会读取不到,而eureka.zuul.app是可以成功读取的,这里要注意!
指定工作环境
Apollo支持多种环境,可以根据应用的环境读取不同环境的配置文件,官方提供了三种方法来设置
- DEV
- Development environment
- FAT
- Feature Acceptance Test environment
- UAT
- User Acceptance Test environment
- PRO
- Production environment
工作环境如果没有指定成功,zuul启动的时候会提示Environment is set to null,需要按照提示设置变量,这里是通过第一种方式配置的
zuul读取Apollo配置
大体分为两种方式获取配置,通过@Value和配置类方式获取,@Value跟平常用法一样,没有什么区别,但是可以指定默认值,主要提一下配置类方式:
主要两个注入@Configuration -- 注入到spring的配置中,@EnableApolloConfig -- 开启从Apollo获取配置
@Configuration
@EnableApolloConfig
public class ApolloConfig {
@ConfigurationProperties("zuul")
public ZuulProperties zuulProperties(){
return new ZuulProperties();
}
}
zuul实时动态刷新配置
实际开发中,一般会使用@ConfigurationProperties获取配置,但是默认情况下Apollo并不会自动刷新这种方式的配置,上面的Apollo的配置参数中有一个参数autoUpdateInjectedSpringProperties是开启自动刷新配置的,但是这个参数只对@Value方式获取配置有效,对于@ConfigurationProperties来获取配置的不会生效,需要实现一个监听器来自动刷新。
Apollo的官方文档中有提到@ApolloConfigChangeListener注解,这个注解就代表Apollo配置更新监听器,当Apollo的配置更新发布之后,就会触发这个注解修饰的方法,但是官方文档并没有给出这个方法的实现,下面是从网上搜集的一种实现方式,通过实现applicationContextAware发布事件更新修改了的配置参数,亲测可用!
@Component
public class ApolloConfigChange implements ApplicationContextAware {
private ApplicationContext applicationContext;
@ApolloConfigChangeListener
private void someChangeHandler(ConfigChangeEvent changeEvent) {
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
System.out.println("Found change - "+change.toString());
}
// 更新相应的bean的属性值,主要是存在@ConfigurationProperties注解的bean
this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}