Apollo的前世今生

Apollo是什么

  • Apollo是携程开发的一款灵活配置的框架(配置中心)。
  • 分为Server端和Client端,Server端需要单独部署。
  • 通过用户名密码登录后在Server端配置参数,Client端引入依赖后获取配置
  • 部署一套Server端,可以为多应用配置多环境参数。

Apollo怎么使用

  • 引入maven依赖
xml 复制代码
<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>${apollo-client.version}</version>
</dependency>
  • 在Starter类上添加@EnableApolloConfig注解
less 复制代码
@SpringBootApplication
@EnableApolloConfig
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 在yml或properties配置文件中
yaml 复制代码
app:
  id: test
apollo:
  meta: http://xx.xx.xx.xx:8080
  bootstrap:
    enabled: true
  • 好,那么此时,在服务端登录配置就可以通过@Value,@ApolloJsonValue获取到配置了。

Apollo怎么做到的?

初次加载

  1. 初始化Spring上下文时调用applyInitializers方法 ApolloApplicationContextInitializer 此阶段很早 还未初始化Spring Bean
  2. 初始化时会创建RemoteConfigRepository,在构造方法中会schedulePeriodicRefresh(固定时延调用trySync方法刷新配置),scheduleLongPollingRefresh长轮询循环调用apollo服务端,发http get请求获取配置
  3. 将配置添加进environment中,AutowiredAnnotationBeanPostProcessor处理器处理添加了@Autowired和@Value注解的方法或字段,将${xx.xx.xx}解析为xx.xx.xx然后通过PropertySourcesPropertyResolver的getProperty取到env环境变量里的参数
  • 加载流程
  • 图中红线框起来的是与Server端交互的核心方法

字段注入时

  1. SpringValueProcessor和ApolloJsonValueProcessor实现了BeanPostProcessor。
  2. SpringValueProcessor处理添加了@Value的字段或者添加了@Value或@Bean的方法,将这些bean封装成SpringValue与key对应存储到Registry中
  3. ApolloJsonValueProcessor处理添加了ApolloJsonValue注解的字段或方法。主要是通过google的gson解析成字段所属类型,转化完后赋值给对应字段,并将这些bean封装成SpringValue与key对应存储到Registry中。
  4. ApolloJsonValueProcessor多了将值注入给field或method的过程,因为此时没用@Value注解,Spring不会自动注入,只能这里手动设值。
  • 这是SpringValueProcessor和ApolloJsonValueProcessor的抽象父类ApolloProcessor,其中processField、processMethod是主要实现。此处用到了模板方法设计模式。

特有注解

  1. ApolloAnnotationProcessor 处理添加了@ApolloConfig的字段(注入config属性) 和 添加了@ApolloConfigChangeListener的方法(注册自定义监听)
  2. 当使用ApolloConfigChangeListener注解添加到方法上时,配置变更就会触发注册的方法,并将变更对象传入。
    Aopllo的注解包 com.ctrip.framework.apollo.spring.annotation

变更对比

  1. 当长轮询返回code为200并且响应体不为空时,会触发notify通知。
  2. 将拉取到的配置Properties与本地已存储的配置Properties对比,找新增、删除或者value变更的值。
  3. 配置数据变化后,根据发布订阅模式,发布事件调用监听器,由AutoUpdateConfigChangeListener更新之前注册过的SpringValue的值。
  4. 把新的配置更新到本地配置文件 C:\opt\data\xxx\config-cache中,防止server宕机。
  • 长轮询主方法截图
  • 判断链路
  • 对比过程,本质上就是两个Set的对比得出新增、删除、更新事件

  • 发布事件后,会反射更新文中提到的SpringValue对象中Spring对象的值

更新展望

  • Server采用push推变更到Client,减少长轮询操作。(新版本应该已支持)
  • 无法更新被Spring逻辑加载后的结果,例如定时任务。

思维拓展

基于此种思路,思考如何应用到自身开发工作中。

全文基于 apollo-client 1.3.0 有错误欢迎指正

相关推荐
我命由我123457 小时前
Android Studio - Android Studio 自定义预览尺寸
android·java·ide·java-ee·android studio·android-studio·android runtime
mCell7 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
咖啡八杯8 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
AIGS0018 小时前
企业AI落地的关键认知:向量空间JBoltAI的本体语义平台
java·人工智能·人工智能ai大模型应用
KaMeidebaby9 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
醉城夜风~10 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
数智化转型推荐官11 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互11 小时前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维
IT_陈寒11 小时前
SpringBoot自动配置不是你以为的那样的智能
前端·人工智能·后端
程序员张313 小时前
SpringBoot集成BCrypt密码加密库
java·spring boot·后端