简介

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

Spring Boot 整合 Apollo的更多相关文章

  1. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...

  2. spring boot整合jsp的那些坑(spring boot 学习笔记之三)

    Spring Boot 整合 Jsp 步骤: 1.新建一个spring boot项目 2.修改pom文件 <dependency>            <groupId>or ...

  3. spring boot 系列之四:spring boot 整合JPA

    上一篇我们讲了spring boot 整合JdbcTemplate来进行数据的持久化, 这篇我们来说下怎么通过spring boot 整合JPA来实现数据的持久化. 一.代码实现 修改pom,引入依赖 ...

  4. Spring Kafka和Spring Boot整合实现消息发送与消费简单案例

    本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 先前我已经分享了Kafka的基本介绍与集群环境搭建方法.关于Kafka的 ...

  5. Spring Boot整合Mybatis并完成CRUD操作

    MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...

  6. spring boot整合Hadoop

    最近需要用spring boot + mybatis整合hadoop,其中也有碰到一些坑,记录下来方便后面的人少走些弯路. 背景呢是因为需要在 web 中上传文件到 hdfs ,所以需要在spring ...

  7. Spring Boot整合Elasticsearch

    Spring Boot整合Elasticsearch   Elasticsearch是一个全文搜索引擎,专门用于处理大型数据集.根据描述,自然而然使用它来存储和搜索应用程序日志.与Logstash和K ...

  8. spring boot 整合 百度ueditor富文本

    百度的富文本没有提供Java版本的,只给提供了jsp版本,但是呢spring boot 如果是使用内置tomcat启动的话整合jsp是非常困难得,今天小编给大家带来spring boot整合百度富文本 ...

  9. spring boot 整合quartz ,job不能注入的问题

    在使用spring boot 整合quartz的时候,新建定时任务类,实现job接口,在使用@AutoWire或者@Resource时,运行时出现nullpointException的问题.显然是相关 ...

随机推荐

  1. [安卓基础] 003.建立你的第一个App

    创建一个android工程项目 我们使用android提供的集成开发工具(Eclipse+ADT)来创建android工程项目.用这个集成开发工具创建项目,简单,方便,快捷,且自动帮助我们生成基础的文 ...

  2. Flask SSTI | Python3 学习记录

    Flask SSTI | Python3 引言 昨天原本是打算继续python的每日一练的,这次按日程一样是要练习用一个web框架写一个留言板的,于是打算用flask搞一下,但是正打算写的时候,突然想 ...

  3. PreparedStatement实现针对不同表的通用查询操作

    PreparedStatement实现针对不同表的通用查询操作:查询一样和多行 PreparedStatementQueryTest package com.aff.PreparedStatement ...

  4. (linux)Centos 7 xfsdump文件系统的备份和恢复

         XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据.xfsdump 按inode顺序备份一个XFS文件系统. centos7选择xfs格式作为默认文件 ...

  5. Javascript中target事件属性,事件的目标节点的获取。

    window.event.srcElement与window.event.target 都是指向触发事件的元素,它是什么就有什么样的属性 srcElement是事件初始化目标html元素对象引用,因为 ...

  6. (Java实现)洛谷 P2095 营养膳食

    题目描述 Mr.L正在完成自己的增肥计划. 为了增肥,Mr.L希望吃到更多的脂肪.然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养.Mr.L通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超 ...

  7. Java实现 蓝桥杯VIP 算法提高 P0404

    计算一个无符号整数的阿尔法乘积.对于一个无符号整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身:否则的话,x的阿尔法乘积就等于它的各位非0的数字相乘所得到的那 ...

  8. Java实现 LeetCode 210 课程表 II(二)

    210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0, ...

  9. Java实现 LeetCode 139 单词拆分

    139. 单词拆分 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可 ...

  10. Java实现 LeetCode 102 二叉树的层次遍历

    102. 二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 2 ...