Spring Boot 整合 Apollo
简介
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。
<dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client</artifactId><version>1.3.0</version></dependency><!-- 为了编码方便,并非apollo 必须的依赖 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.8.1</version></dependency>
application.yml
server:port: 8761app:id: springboot-apolloapollo:meta: http://127.0.0.1:8080bootstrap:enabled: trueeagerLoad:enabled: truelogging:level:com:gf:controller: debug
配置说明:
- app.id :AppId是应用的身份信息,是配置中心获取配置的一个重要信息。
- apollo.bootstrap.enabled :在应用启动阶段,向Spring容器注入被托管的application.properties文件的配置信息。
- apollo.bootstrap.eagerLoad.enabled :将Apollo配置加载提到初始化日志系统之前。
- logging.level.com.gf.controller :调整 controller 包的 log 级别,为了后面演示在配置中心动态配置日志级别。
HelloController
@RestControllerpublic class HelloController {private static Logger logger = LoggerFactory.getLogger( HelloController.class );@Value( "${server.port}" )String port;@GetMapping("hi")public String hi(String name) {logger.debug( "debug log..." );logger.info( "info log..." );logger.warn( "warn log..." );return "hi " + name + " ,i am from port:" + port;}}
启动类
@SpringBootApplication@EnableApolloConfigpublic class SpringbootApolloApplication {public static void main(String[] args) {SpringApplication.run( SpringbootApolloApplication.class, args );}}
启动项目。现在需要去配置中心做些关于这个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配置中心,但在配置中心修改日志等级,依然需要重启应用才生效,下面我们就通过监听配置的变化,来达到热更新的效果。
@Configurationpublic class LoggerConfig {private static final Logger logger = LoggerFactory.getLogger(LoggerConfig.class);private static final String LOGGER_TAG = "logging.level.";@Autowiredprivate LoggingSystem loggingSystem;@ApolloConfigprivate Config config;@ApolloConfigChangeListenerprivate void configChangeListter(ConfigChangeEvent changeEvent) {refreshLoggingLevels();}@PostConstructprivate void refreshLoggingLevels() {Set<String> keyNames = config.getPropertyNames();for (String key : keyNames) {if (StringUtils.containsIgnoreCase(key, LOGGER_TAG)) {String strLevel = config.getProperty(key, "info");LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level);logger.info("{}:{}", key, strLevel);}}}}
关键点讲解:
- @ApolloConfig注解 :将Apollo服务端的中的配置注入这个类中。
- @ApolloConfigChangeListener注解 :监听配置中心配置的更新事件,若该事件发生,则调用refreshLoggingLevels方法,处理该事件。
- ConfigChangeEvent参数 :可以获取被修改配置项的key集合,以及被修改配置项的新值、旧值和修改类型等信息。
application.yml 中配置的日志级别是 debug ,访问 http://127.0.0.1:8761/hi?name=zhangsan,控制台打印如下。
2019-03-05 18:29:22.673 DEBUG 4264 --- [nio-8762-exec-1] com.gf.controller.HelloController : debug log...2019-03-05 18:29:22.673 INFO 4264 --- [nio-8762-exec-1] com.gf.controller.HelloController : info log...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,控制台打印如下。
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的更多相关文章
- Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...
- spring boot整合jsp的那些坑(spring boot 学习笔记之三)
Spring Boot 整合 Jsp 步骤: 1.新建一个spring boot项目 2.修改pom文件 <dependency> <groupId>or ...
- spring boot 系列之四:spring boot 整合JPA
上一篇我们讲了spring boot 整合JdbcTemplate来进行数据的持久化, 这篇我们来说下怎么通过spring boot 整合JPA来实现数据的持久化. 一.代码实现 修改pom,引入依赖 ...
- Spring Kafka和Spring Boot整合实现消息发送与消费简单案例
本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 先前我已经分享了Kafka的基本介绍与集群环境搭建方法.关于Kafka的 ...
- Spring Boot整合Mybatis并完成CRUD操作
MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...
- spring boot整合Hadoop
最近需要用spring boot + mybatis整合hadoop,其中也有碰到一些坑,记录下来方便后面的人少走些弯路. 背景呢是因为需要在 web 中上传文件到 hdfs ,所以需要在spring ...
- Spring Boot整合Elasticsearch
Spring Boot整合Elasticsearch Elasticsearch是一个全文搜索引擎,专门用于处理大型数据集.根据描述,自然而然使用它来存储和搜索应用程序日志.与Logstash和K ...
- spring boot 整合 百度ueditor富文本
百度的富文本没有提供Java版本的,只给提供了jsp版本,但是呢spring boot 如果是使用内置tomcat启动的话整合jsp是非常困难得,今天小编给大家带来spring boot整合百度富文本 ...
- spring boot 整合quartz ,job不能注入的问题
在使用spring boot 整合quartz的时候,新建定时任务类,实现job接口,在使用@AutoWire或者@Resource时,运行时出现nullpointException的问题.显然是相关 ...
随机推荐
- RabbitMQ镜像集群搭建
RabbitMQ 官网 https://www.rabbitmq.com/ 小编使用的系统环境是CentOS7.4 系统 IP hostname CentOS7.4 1.1.1.1 hostname0 ...
- Java分层经验
在学习和使用Java的过程中,我们时常要用到各种工具与技术,它们在某些时候可以大幅度地简化编程,利用好它们,可以让代码更强壮.下面的表格是我总结的关于java开发可能会用到的工具与它们在项目中扮演的角 ...
- Java 从入门到精通-反射机制
导读 Java反射机制是开发者迈向结构化开发的重要一步,同时掌握了反射机制也就掌握了所有框架的核心实现思想. 认识反射机制 简单例子 通过以上的程序就会发现,除了对象的正向处理操作之外,还可以通过ge ...
- Linux(十) —— 使用 rz 和 sz 命令上传与下载
以CentOS 7 系统为例,一般上传下载都是使用的第三方工具,但是在操作上并不方便,每次都要找到对应的目录才可以执行上传.下载操作,比较麻烦. 而CentOS为例的 Linux 系统可以通过安装 插 ...
- Java实现 LeetCode 449 序列化和反序列化二叉搜索树
449. 序列化和反序列化二叉搜索树 序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建. 设计一个算法 ...
- Java实现 蓝桥杯VIP 算法训练 回文数
import java.util.Scanner; public class 回文数 { static int time = 0; public static int change(String st ...
- Java实现 LeetCode 72 编辑距离
72. 编辑距离 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字 ...
- Java实现无向图的欧拉回路判断问题
1 问题描述 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试 ...
- 在树莓派3b or 3a or 4a or 4b上搭建OpenWebRX
OpenWebRx OpenWebRX 项目提供了搭建WebSDR的解决方案,该项目基于 Python 编写,除了完全开源外,官方还提供了完备的技术文档.您只需要一台电脑或是树莓派,一个SDR设备和网 ...
- https://www.cnblogs.com/mrchige/p/6409444.html
https://www.cnblogs.com/mrchige/p/6409444.html http://c.biancheng.net/view/2172.html https://www.cnb ...