Spring boot 集成apollo达到配置的热加载
时间:2022-07-23
本文章向大家介绍Spring boot 集成apollo达到配置的热加载,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
我们的系统集成了携程的配置中心Apollo 让我们在开发和迭代中得到了很大的方便。尤其是配置的热加载。让我们避免了多次生产发布的情况。他拥有可视化的配置界面(以Key-value的形势)。这篇文章的主要目的是看apollo是如何实现热更新的
使用
- 接入apollo
- pom文件中引入meven依赖
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.4.0</version>
</dependency>
- 在代码中引入apollo的注解 @EnableApolloConfig
在配置的客户端创建你的nameSpace且将妳的Resource里面的YML或者properity文件配置文件同步到你的namespace里面的各个环境(在apollo里面都是properity文件格式的key-value)
- 在JVM参数中配置apollo的启动参数,我是使用jekins发布的,所以会在下图的地方进行配置
其中有三个参数,分别是apollo server的域名地址,还有所对应的环境名,接下来就是你的项目名
- 启动我们的项目,就会在/opt/data/projectname 里面就会生成一个本地的配置文件(当我们发布发现配置有问题一般会在这个文件内查看apollo的配置文件是否更新到本地)
- apollo 支持热更新,当生产环境还在跑的时候,我想修改配置,一般情况下我们是需要重新build和deploy的。但是现在不需要了,修改后直接发布就可以了。 在我个人项目的实践中使用@value 可以实现热加载,但是直接使用@ConfigurationProperties不可以。(只是我个人在使用的时候遇到的问题),其实也大概不是apollo的问题吧。这两个注解在实现上的区别。在排查不能更新的的时候,查看本地的磁盘配置文件都是改掉的了而内存中的属性值确实是一直没有变化的。
Apollo
- 架构图
- 上图是一个简单版本的图 从图中我们可以看出
- ConfigService是一个独立的微服务,服务于Client进行配置获取。
- Client和ConfigService保持长连接,通过一种拖拉结合(push & pull)的模式,实现配置实时更新的同时,保证配置更新不丢失。
- AdminService是一个独立的微服务,服务于Portal进行配置管理。Portal通过调用AdminService进行配置管理和发布。
- ConfigService和AdminService共享ConfigDB,ConfigDB中存放项目在某个环境的配置信息。ConfigService/AdminService/ConfigDB三者在每个环境(DEV/FAT/UAT/PRO)中都要部署一份。
- Protal有一个独立的PortalDB,存放用户权限、项目和配置的元数据信息。Protal只需部署一份,它可以管理多套环境。
- 实时更新 其中ConfigService 和 Clent时间是推拉组合,也就是上面我们所说的,长链接,当我们服务在启动的时候我们会进行拉,当我们服务在正在running的时候修改配置文件进行推到我们本地磁盘且实现重新注入到内存中。
- 上面所说的我们使用@Value和@ConfigurationPropertie其中@Value达到了热更新的效果另一个则没有。@ConfigurationProperties如果需要在Apollo配置变化时自动更新注入的值,需要配合使用EnvironmentChangeEvent或RefreshScope。相关代码实现,可以参考apollo-use-cases项目中的ZuulPropertiesRefresher.java和apollo-demo项目中的SampleRedisConfig.java以及SpringBootApolloRefreshConfig.java
- 再仔细想想,也就是将apollo中的数据交给Spring服务进行修改其bean的属性。看一下下面这张图也许我们就能大概了解到了整合SpringBoot 的apollo的具体实现的细节
总结
- apollo 是一个分布式的文件配置中心
- 可实现配置的热更新
- 在整合SpringBoot得时候直接使用@Value可以实现热更新,而使用@ConfigurationPropertie需要热更新则需要做特殊的配置
- Apollo在spring中配置中心动态生效机制,是基于Http长轮询请求和Spring扩展机制实现的,在Spring容器启动过程中,Apollo通过自定义的BeanPostProcessor和BeanFactoryPostProcessor將参数中包含${…}占位符和@Value注解的Bean注册到Apollo框架中定义的注册表中。然后通过Http长轮询不断的去获取服务端的配置信息,一旦配置发生变化,Apollo会根据变化的配置的Key找到对应的Bean,然后修改Bean的属性,从而实现了配置动态生效的特性。
参考
https://blog.csdn.net/Rongbo_J/article/details/93379683(Apollo配置中心动态生效实现原理) https://juejin.im/entry/5b19e718e51d45067a72941a(apolo配置中心架构深度刨析) https://www.jianshu.com/p/7d91cb5109a4 (在apollo中遇到的坑)
- 解密所有APP运行过程中的内部逻辑
- RecyclerView数据动态更新
- android PakageManagerService启动流程分析
- RFID入门:Mifare1智能水卡破解分析
- RecyclerView点击事件处理
- Python 实现一个火车票查询的工具
- HTTPS迎来春天:Chrome计划将所有HTTP标记为不安全
- View绘制流程
- Linux Rootkit系列一:LKM的基础编写及隐藏
- Swift基础语法(常量变量、数据类型、元组、可选、断言)
- 【实战】Python 读写 Excel 实例应用
- 10万WordPress网站沦陷:恶意软件SoakSoak来了
- 自己动手实现一个Android Studio插件
- Oracle数据库漏洞分析:无需用户名和密码进入你的数据库
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- docker login 报错了...
- Spark-Submit 和 K8S Operation For Spark
- Spark的Dockerfile分析
- Spark on Kubernetes在Mac的Demo
- Python的Wand模块
- 机器学习第4天:预测1立方米混凝土抗压强度
- 硬件笔记之GP106-90 3GB GTX1060 3GB魔改
- Java BigDecimal 的舍入模式(RoundingMode)详解
- 实际工程中加快 Java 代码编写的小提示
- CentOS7 离线安装软件并准备依赖包
- CentOS7 SkyWalking APM8.1.0 搭建与项目集成使用
- CentOS7 cassandra安装与测试
- Centos7 搭建DNS服务器
- CentOS7 fastdfs安装与测试
- CentOS7 jdk安装