简介

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. [SD喜爱语言PK大赛]001.PHP vs Node.js

    引言:近日,两大编程飓风之战已经愈演愈烈.在程序员社区,一些争端因PHP与Node.js而起. 观点:其实就本人及团队而言,Language just a language!不存在高低之分,而侧重的原 ...

  2. .NET编程5月小结 - Blazor, Unity, Dependency Injection

    本文是我在5月份看到的一些有趣的内容的集合.在这里你可以找到许多有关Blazor.ASPNET Core的学习资源和示例项目,有关在Unity中使用Zenject进行单元测试的博客,有关Unity项目 ...

  3. Spring AOP学习笔记01:AOP概述

    1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...

  4. Java实现 蓝桥杯VIP 算法训练 s01串

    题目描述 s01串初始为" 0" 按以下方式变换 0变1,1变01 数据规模和约定 0~19 输入 1个整数(0~19) 输出 n次变换后s01串 样例输入 3 样例输出 101 ...

  5. Java实现 LeetCode 338 比特位计数

    338. 比特位计数 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1 ...

  6. Java实现 蓝桥杯VIP 算法提高 去注释

    算法提高 去注释 时间限制:1.0s 内存限制:256.0MB 去注释 问题 给你一段C++代码,将其中的注释去除后输出剩余的代码. 注释共有两种形式: 1. 行注视:以//开头,一直作用到行尾为止. ...

  7. Java实现分割矩形

    给定平面内平行于坐标轴的一个矩形,从矩形内选 择一些点,从这些点向右和向上各射出一条射线, 请问:这些射线将矩形分成了多少份. 数据格式: 输入的第一行包含两个整数x, y,表示矩形是由(0, 0), ...

  8. java实现人员排日程

    某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天. 上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更. 此外,由于工作需要,还有如下要求: 所有人的连续工作日不能多 ...

  9. ArrayDeque使用&实现原理分析

    ArrayDeque使用&实现原理分析 学习Okhttp实现源码时,发现其任务分发时用到了ArrayDeque.因此了解一下ArrayDeque的使用方式和实现原理. 一.Deque dequ ...

  10. win7 64位系统怎么使用debug

    安装DOSbox软件 下载个debug.exe然后把这放到D盘或E盘的根目录下 然后启动dosbox软件,在下面输入 mount c d:\ enter键 c: enter键 输入debug命令就ok ...