springboot版本2.2.6,apollo版本1.6.1 

一.基本概念

1.分布式:简单来说,将一台机器上的服务,分散部署在不同的机器上的,各个机器之前相互协同(一个机器可能负责N个功能)。分布式是系统部署方式,微服务是指架构设计方式,两者不是一个层面上的概念

2.apollo:能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景

3.apollo整体架构:客户端-配置中心-服务端

ap db分离架构 分布式ap_封装

4.使用方式:1)导入客户端jar包apollo-client,当前最新版本version=1.6.1;2)META-INF/app.properties文件中配置app.id;3)配置类上增加注解@EnableApolloConfig({ "要引入的namespace值"});4)使用注解@ApolloJsonValue("aa")、@ApolloConfigChangeListener({"apollo-share"})、@Value("${aaa}")或${aaa};5)设置apollo.meta参数

二.客户端源码

ap db分离架构 分布式ap_占位符_02

1.@EnableApolloConfig注解上面有@Import(ApolloConfigRegistrar.class),目的是导入ApolloConfigRegistrar.class对象

容器实例化时,往容器中注册了BeanFactory后置处理器ConfigurationClassPostProcessor的beanDefinition;

容器准备repareContext时,将主配置类DemoApplication.class的类定义信息封装成beanDefinition对象,注册进容器中;

容器刷新时:1)invokeBeanFactoryPostProcessors方法统一执行BeanFactory后置处理器,先实例化出BeanDefinitionRegistryPostProcessor类型的ConfigurationClassPostProcessor对象;2)执行ConfigurationClassPostProcessor对象往容器中注册beanDefinition的方法postProcessBeanDefinitionRegistry,取出容器中所有的beanDefinition对象(此时还属于容器早期,只有少量的beanDefinition),循环找出带有@Configuration注解,此时能找到主配置类DemoApplication.class;3)解析配置类DemoApplication.class上面的注解,如果有@Import注解,取出注解value值,如果属于ImportBeanDefinitionRegistrar类型的,执行其接口方法

2.ImportBeanDefinitionRegistrar类型的ApolloConfigRegistrar对象,目的就是向容器中注册apollo配置中心需要的类定义信息BeanDefinition,容器会在对应生命周期内实例化出相应对象

ap db分离架构 分布式ap_客户端_03

1)PropertySourcesPlaceholderConfigurer,支持xml占位符,BeanFactory后置处理器,PropertySourcesPlaceholderConfigurer上一篇文章着重介绍过

2)SpringValueDefinitionProcessor,属于BeanDefinitionRegistryPostProcessor类型的BeanFactory后置处理器;主要目的是对所有的BeanDefinition进行遍历,将属性中含有占位符${key}中的key找出来(注:此处不包括@Value注解的占位符),key和field等做好关联,封装成SpringValueDefinition对象,放入集合中,注:并没有将SpringValueDefinition注入spring容器,再多说一句,apollo使用了Google Guice 轻量级的依赖注入框架,又简单的包装了一下

3)SpringValueProcessor,属于BeanFactory、Bean后置处理器;BeanFactory后置处理器优先级低于上面的BeanDefinitionRegistryPostProcessor,作用是取出上面创建好的集合SpringValueDefinition,继续操作;Bean后置处理器作用是解析bean中带有@Value注解的属性,将占位符key和属性field建立关联封装成SpringValue对象,增加到SpringValueRegistry集合中;循环SpringValueDefinition集合,将非@Value注解的占位符也封装注册进SpringValueRegistry对象中,注:同样没有将SpringValueRegistry注入spring容器,考虑到可能并发操作SpringValueRegistry单例对象的registry集合,注册方法用了synchronized

4)ApolloAnnotationProcessor,Bean后置处理器,主要是处理带有@ApolloConfig注解和@ApolloConfigChangeListener注解的bean对象;如果属性上有@ApolloConfig,取出apollo上的配置,反射设置到属性值上,ReflectionUtils.setField(field, bean, config);如果方法上面有@ApolloConfigChangeListener,将方法封装成监听器对象,监听配置的变化;这个监听的目的是向外提供钩子,让项目可以感知远程apollo配置的变化,做出相应的处理,比如配置从1变化到2时,发出系统警告等

5)ApolloJsonValueProcessor,Bean后置处理器,主要是处理带有@ApolloJsonValue注解的bean对象,解析注解value值,找到对应配置json字符串,转化为对象;换种方式说就是将对象序列化成json串,配置在apollo上面,然后靠@ApolloJsonValue注解来将json串反序列化成对象

6)PropertySourcesProcessor,BeanFactory后置处理器,两个目的:往容器的资源配置文件中增加上远程apollo配置,如app.id=test,namespaces=apollo-test的相关配置;对新增加的配置添加自动更新的监听器AutoUpdateConfigChangeListener

三.客户端整体设计

ap db分离架构 分布式ap_封装_04