简介

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

Apollo和Spring Cloud Config对比

通过对比,可以看出,生成环境中 Apollo 相比 Spring Cloud Config 更具有优势一些。

安装 Apollo 配置中心

搭建教程

参照 https://github.com/ctripcorp/apollo/wiki/Quick-Start搭建 Apollo 配置中心,文档写的很清楚,这里就赘述了。

查看样例配置

搭建完成并启动后,访问 http://localhost:8070,界面如下。

输入用户名 apollo,密码 admin 后登录后,点击SampleApp进入配置界面。

与 Spring Boot 整合使用

创建一个springboot项目,主要代码如下。

pom.xml

添加 Apollo 客户端的依赖,为了编码方便引入commons-lang3。

  1. <dependency>
  2. <groupId>com.ctrip.framework.apollo</groupId>
  3. <artifactId>apollo-client</artifactId>
  4. <version>1.3.0</version>
  5. </dependency>
  6. <!-- 为了编码方便,并非apollo 必须的依赖 -->
  7. <dependency>
  8. <groupId>org.apache.commons</groupId>
  9. <artifactId>commons-lang3</artifactId>
  10. <version>3.8.1</version>
  11. </dependency>

application.yml

  1. server:
  2. port: 8761
  3. app:
  4. id: springboot-apollo
  5. apollo:
  6. meta: http://127.0.0.1:8080
  7. bootstrap:
  8. enabled: true
  9. eagerLoad:
  10. enabled: true
  11. logging:
  12. level:
  13. com:
  14. gf:
  15. controller: debug

配置说明:

  • app.id :AppId是应用的身份信息,是配置中心获取配置的一个重要信息。
  • apollo.bootstrap.enabled :在应用启动阶段,向Spring容器注入被托管的application.properties文件的配置信息。
  • apollo.bootstrap.eagerLoad.enabled :将Apollo配置加载提到初始化日志系统之前。
  • logging.level.com.gf.controller :调整 controller 包的 log 级别,为了后面演示在配置中心动态配置日志级别。

HelloController

  1. @RestController
  2. public class HelloController {
  3. private static Logger logger = LoggerFactory.getLogger( HelloController.class );
  4. @Value( "${server.port}" )
  5. String port;
  6. @GetMapping("hi")
  7. public String hi(String name) {
  8. logger.debug( "debug log..." );
  9. logger.info( "info log..." );
  10. logger.warn( "warn log..." );
  11. return "hi " + name + " ,i am from port:" + port;
  12. }
  13. }

启动类

  1. @SpringBootApplication
  2. @EnableApolloConfig
  3. public class SpringbootApolloApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run( SpringbootApolloApplication.class, args );
  6. }
  7. }

启动项目。现在需要去配置中心做些关于这个springboot客户端的一些配置。

配置中心的配置

创建项目

第一步:访问 http://localhost:8070登录后,选择创建项目。

第二步:填写配置信息。

配置说明:

  • 部门 :选择应用所在的部门。(想自定义部门,参照官方文档,这里就选择样例)
  • 应用AppId :用来标识应用身份的唯一id,格式为string,需要和客户端。application.properties中配置的app.id对应。
  • 应用名称 :应用名,仅用于界面展示。
  • 应用负责人 :选择的人默认会成为该项目的管理员,具备项目权限管理、集群创建、Namespace创建等权限。

提交配置后会出现如下项目配置的管理页面。

添加配置项

第一步:点击 “新增配置”,配置需要管理的 application.properties 中的属性。

点击提交,之后按照同样的方法,新增需要动态管理的 application.properties 中的属性。

提交后,跳转到配置的管理界面:

发布配置

配置只有在发布后才会真的被应用使用到,所以在编辑完配置后,需要发布配置。点击“发布按钮”。

填写发布相关信息,点击发布 。

测试

在配置中心,修改 server.port 的值为 8762 并发布。

Postman 访问之前写个测试接口 http://127.0.0.1:8761/hi?name=zhangsan,返回如下。

说明 客户端 获取到了 配置中心修改后的 server.port 的值 。

注意:

  • 服务的端口依然还是 8761,这是因为 apollo 修改配置,不会像Spring Cloud Config 那样去重启应用。
  • 重启应用后,客户端会加载使用 配置中心中配置的属性的值,例如我们重启我们的应用,服务端口会变成8762。

监听配置的变化

需求

日志模块是每个项目中必须的,用来记录程序运行中的相关信息。一般在开发环境下使用DEBUG级别的日志输出,为了方便查看问题,而在线上一般都使用INFO或者ERROR级别的日志,主要记录业务操作或者错误的日志。那么问题来了,当线上环境出现问题希望输出DEBUG日志信息辅助排查的时候怎么办呢?修改配置文件,重新打包然后上传重启线上环境,以前确实是这么做的。

虽然上面我们已经把日志的配置部署到Apollo配置中心,但在配置中心修改日志等级,依然需要重启应用才生效,下面我们就通过监听配置的变化,来达到热更新的效果。

  1. @Configuration
  2. public class LoggerConfig {
  3. private static final Logger logger = LoggerFactory.getLogger(LoggerConfig.class);
  4. private static final String LOGGER_TAG = "logging.level.";
  5. @Autowired
  6. private LoggingSystem loggingSystem;
  7. @ApolloConfig
  8. private Config config;
  9. @ApolloConfigChangeListener
  10. private void configChangeListter(ConfigChangeEvent changeEvent) {
  11. refreshLoggingLevels();
  12. }
  13. @PostConstruct
  14. private void refreshLoggingLevels() {
  15. Set<String> keyNames = config.getPropertyNames();
  16. for (String key : keyNames) {
  17. if (StringUtils.containsIgnoreCase(key, LOGGER_TAG)) {
  18. String strLevel = config.getProperty(key, "info");
  19. LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());
  20. loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level);
  21. logger.info("{}:{}", key, strLevel);
  22. }
  23. }
  24. }
  25. }

关键点讲解:

  • @ApolloConfig注解 :将Apollo服务端的中的配置注入这个类中。
  • @ApolloConfigChangeListener注解 :监听配置中心配置的更新事件,若该事件发生,则调用refreshLoggingLevels方法,处理该事件。
  • ConfigChangeEvent参数 :可以获取被修改配置项的key集合,以及被修改配置项的新值、旧值和修改类型等信息。

application.yml 中配置的日志级别是 debug ,访问 http://127.0.0.1:8761/hi?name=zhangsan,控制台打印如下。

  1. 2019-03-05 18:29:22.673 DEBUG 4264 --- [nio-8762-exec-1] com.gf.controller.HelloController : debug log...
  2. 2019-03-05 18:29:22.673 INFO 4264 --- [nio-8762-exec-1] com.gf.controller.HelloController : info log...
  3. 2019-03-05 18:29:22.673 WARN 4264 --- [nio-8762-exec-1] com.gf.controller.HelloController : warn log...

现在在配置中心修改日志级别为 warn。

再次访问 http://127.0.0.1:8761/hi?name=zhangsan,控制台打印如下。

  1. 2019-03-05 19:07:19.469 WARN 4264 --- [nio-8762-exec-3] com.gf.controller.HelloController : warn log...

说明日志级别的配置,已经支持热更新了。关于apollo 的更多应用 ,可以参照github的文档。

源码

https://github.com/gf-huanchupk/SpringBootLearning/tree/master/springboot-apollo

最新文章

  1. openStack windows时间偏移
  2. Unity3D 简单的倒计时
  3. 玩转Windows Azure存储服务——网盘
  4. 利用mybatis-generator自动生成代码
  5. ruby中proc和lambda的return区别
  6. SerializationUtility
  7. Jquery插件学习
  8. DFS 10.1.5.253 1501
  9. Sqoop处理Clob与Blob字段
  10. ubuntu 14.04 安装svn server (subversionedge )
  11. 基于Promise封装uni-app的request方法,实现类似axios形式的请求
  12. xampp——apache服务启动问题(端口占用)
  13. 还原真实,javascript之预编译 / 预解析
  14. vue与dajngo
  15. crontab 从nano 转换为 vim
  16. CSS-联合选择器
  17. 关于The specified Android SDK Build Tools version (26.0.2) is ignored, as it is below the minimum...
  18. golang变量声明
  19. pycharm加载多个项目
  20. Android 图板之保存图像

热门文章

  1. Java中的集合(三)继承Collection的Queue接口
  2. NIO 的非阻塞式网络通信
  3. for循环结构的使用
  4. Java动态代理与静态代理以及它能为我们做什么
  5. 11 . Python3之异常,调试和测试
  6. for循环的嵌套 函数方法
  7. Java实现桐桐的数学难题
  8. 第四届蓝桥杯JavaC组国(决)赛真题
  9. Java实现 蓝桥杯 算法提高 矩形靶
  10. Java实现字符串的包含