Spring Boot 项目实战(六)集成 Apollo
一、前言
上篇介绍了 Spring Boot 集成 Dubbo,使我们的系统打下了分布式的基础。随着程序功能的日益复杂,程序的配置日益增多:各种功能开关、参数配置、服务器地址等;对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制等;在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。分布式配置中心应运而生。本篇将主要介绍分布式配置中心 Apollo 的集成过程。
二、部署 Apollo
① 部署教程见官方文档:https://github.com/ctripcorp/apollo/wiki/分布式部署指南
② 架构剖析:https://mp.weixin.qq.com/s/-hUaQPzfsl9Lm3IqQW3VDQ
三、使用 Apollo
① 登录 Apollo 管理控制台后创建项目,其中应用 ID 全局唯一。
② 创建成功后跳转到项目维护界面,左侧上方为环境列表,中间区域为项目信息,下方可操作集群及 namespace 。右侧为默认 namespace :application ,具体配置项在此区域维护。
四、Spring Boot 集成 Apollo
4.1 引入 Apollo 依赖包
① 首先在项目父 pom 文件中声明 Apollo 依赖。
<dependencyManagement>
<dependencies>
...省略其余部分...
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
</dependencyManagement>
② 其次在 demo-biz 层中的 pom 文件添加上述 Apollo 依赖。
<dependencies>
...省略其余部分...
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
</dependency>
</dependencies>
4.2 添加 Apollo 配置项
① 在 application.properties 文件中的添加 Apollo 相关的配置项:
# 应用全局唯一的身份标识
app.id = 20000
# Apollo Meta Server 地址
apollo.meta = http://xxx.xxx.xxx.xxx:7881
# 自定义本地配置文件缓存路径
apollo.cacheDir = ./config
# 设置在应用启动阶段就加载 Apollo 配置
apollo.bootstrap.enabled = true
# 注入 application namespace
apollo.bootstrap.namespaces = application
② 将 application.properties 文件中的除了 Apollo 及 Logback 的其他配置项都转移到 Apollo 控制台中维护。
4.3 验证 Apollo
① 启动日志中可以看到 Apollo 从 Meta Server 拉取配置项,并缓存到本地 config 目录。
② 访问 http://localhost:8080/demo/test?id=1 接口正常返回。
4.4 托管 Logback 配置项
① Apollo 1.2.0 版本后支持托管日志相关配置项,只需要在 application.properties 文件中增加以下 Apollo 配置项。
# 将 Apollo 配置加载提到初始化日志系统之前,需要托管日志配置时开启
apollo.bootstrap.eagerLoad.enabled = true
② 将 Logback 配置项转移到 Apollo 控制台中维护。
4.5 本地开发模式
某些情况下比如 Dubbo 接口本地联调,需要修改依赖方的接口版本,此时可以开启本地开发模式,在本地开发模式下,Apollo 只会从本地文件读取配置信息,不会从 Apollo 服务器读取配置。通过设置 JVM 参数开启。
4.6 Dubbo 及 Apollo 的兼容问题
官方在集成 Dubbo 及 Apollo 时提供了两种方式:
- ① 纯 Spring Boot 方式;即依赖 dubbo-spring-boot-starter 包。
- ② 原生 Dubbo 方式;即依赖 dubbo 、zookeeper 、 zkclient 、curator-framework 包,然后通过 XML 方式配置,配置项用 ${} 占位符。
而我当时为了能清楚知道,对外提供了哪些 Dubbo 接口以及依赖了哪些外部 Dubbo 接口,使用 Spring XML 的形式配置 Dubbo,同时又依赖了 dubbo-spring-boot-starter 包,结果将 Dubbo 配置项托管至 Apollo 后,出现无法找到 Dubbo 配置项的情况。原因是通过 Spring XML 方式配置 Dubbo 时所依赖的 OverrideDubboConfigApplicationListener 执行时机太早了(远早于 Apollo 配置加载的时机)。Apollo 1.2.0 版本支持「 apollo.bootstrap.eagerLoad.enabled 」配置项后虽然能解决这个问题,但还是不推荐 dubbo-spring-boot-starter + XML 这种形式的配置方式,推荐纯 Spring Boot 方式。
五、结语
至此 Spring Boot 集成 Apollo 的过程介绍完毕,相关代码已同步至 GitHub 。
Spring Boot 项目实战(六)集成 Apollo的更多相关文章
- Spring Boot 项目实战(五)集成 Dubbo
一.前言 上篇介绍了 Redis 的集成过程,可用于解决热点数据访问的性能问题.随着业务复杂度的提高,单体应用越来越庞大,就好比一个类的代码行数越来越多,分而治之,切成多个类应该是更好的解决方法,所以 ...
- Spring Boot 项目实战(四)集成 Redis
一.前言 上篇介绍了接口文档工具 Swagger 及项目监控工具 JavaMelody 的集成过程,使项目更加健壮.在 JAVA Web 项目某些场景中,我们需要用缓存解决如热点数据访问的性能问题,业 ...
- Spring Boot 项目实战(三)集成 Swagger 及 JavaMelody
一.前言 上篇介绍了 Logback 的集成过程,总体已经达到了基本可用的项目结构.本篇主要介绍两个常用工具,接口文档工具 Swagger .项目监控工具 JavaMelody 的集成步骤. 二.Sw ...
- Spring Boot 项目实战(二)集成 Logback
一.前言 上篇介绍了 Spring Boot Maven 多模块项目的搭建方法以及 MyBatis 的集成.通常在调试接口或者排查问题时我们主要借助于日志,一个设计合理的日志文件配置能大大降低我们的排 ...
- Spring Boot 项目实战(一)Maven 多模块项目搭建
一.前言 最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程. 二.软件及硬件环境 macOS S ...
- Github 上热门的 Spring Boot 项目实战推荐
最近经常被读者问到有没有 Spring Boot 实战项目可以学习,于是,我就去 Github 上找了 10 个我觉得还不错的实战项目.对于这些实战项目,有部分是比较适合 Spring Boot 刚入 ...
- 携程Apollo(阿波罗)配置中心在Spring Boot项目快速集成
前提:先搭建好本地的单机运行项目:http://www.cnblogs.com/EasonJim/p/7643630.html 说明:下面的示例是基于Spring Boot搭建的,对于Spring项目 ...
- Spring Boot 2.X(六):Spring Boot 集成Redis
Redis 简介 什么是 Redis Redis 是目前使用的非常广泛的免费开源内存数据库,是一个高性能的 key-value 数据库. Redis 与其他 key-value 缓存(如 Memcac ...
- Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目
在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...
随机推荐
- Linux Oracle bash: “sqlplus / as sysdba”: command not found 解决方法
bash: sqlplus: command not found 解决方法 注:本文来源于 < bash: sqlplus: command not found 解决方法 > 1: ...
- Confluence 6 在数据源连接中启用校验查询
确定 Confluence 在数据库连接池中校验数据库连接: 停止 Confluence. 编辑 <installation-directory>/conf/server.xml 文件(或 ...
- ActiveMQ消息的消费原理
消费端消费消息: 在 初识ActiveMQ 中我提到过,两种方法可以接收消息,一种是使用同步阻塞的ActiveMQMessageConsumer#receive方法.另一种是使用消息监听器Messag ...
- Python实战二
要求:按照要求完成对文件的增.删.改.查操作. def add(**kwargs): '''新增内容,在指定位置新增''' while True: flag = False with open(&qu ...
- 如何在PDF中添加水印,PDF添加水印技巧
PDF文件现在的使用很是普遍,不管是工作中还是学习中都会使用到PDF文件,制作一个PDF文件就很辛苦的,我们要是想把PDF文件中添加水印防止抄袭的时候应该要怎么做呢,其实吧PDF文件添加水印还挺简单的 ...
- django配置一个网站建设
第一步: 安装数据库MySQL,也可以使用pycharm自带的数据库sqllite,大项目要使用数据库.安装请参考上篇. 数据库在pycharm中驱动设置,setting文件中修改驱动文件密码等信息. ...
- bzoj 4011
看了好多篇题解才看懂的题,我实在太菜了... 首先根据一个我不知道的算法,可以证明在没有加入新的边的时候,原图的所有生成树的方案数就是所有点(除1以外)的度之积 那么在新加入这条边之后,我们仍然可以这 ...
- 第八周学习总结-C#、C++
2018年9月2日 今天是小学期开始第三天,本周前几天看了看C#和C++,用C#窗体做了个计算器,然后还用Scratch做了一个贪吃蛇的脚本. 31号小学期开始,到今天我把A类基本做完了.一开始做通讯 ...
- openssl中RSA数字签名的使用
参考: OpenSSL命令行工具验证数字签名 客户端需要生成一对密钥,服务器需要生成一对密钥,分别记为client_private.pem/client_public.pem和server_priva ...
- Junit4 IDEA测试学习一
1.Junit4 下载 https://github.com/junit-team/junit4/releases 4.12 还需要还导入hamcrest-core-1.3.jar 2.IDEA Te ...