Apollo #
基本概念 #
架构原理 #
Config Server一般配置为集群,客户端通过 Eureka 的服务发现机制连接该集群。为了解决其它语言没有Eureka的问题,Apollo引入了 Meta Server,通过引入代理层来实现服务发现。
当用户在页面上修改配置后,Portal页面会调用Admin Server,Admin Server会往DB中插入一条消息记录,Config Server会定时扫描该表,有新记录通知客户端。服务端和客户端之间使用长轮询维持连接。技术栈中之所以没有引入消息队列是为了保持架构简单,减少复杂性。
动态配置原理 #
基于http长轮询请求和Spring扩展机制实现。在Spring容器启动过程中,Apollo通过自定义的BeanPostProcessor和BeanFactoryPostProcessor将参数中包含${...}
占位符和@Value
注解的Bean注册到Apollo框架中定义的注册表中。然后通过http长轮询不断的去获取服务端的配置信息,一旦配置发生变化,Apollo会根据变化的配置key找到对应的Bean,然修改Bean的属性,从而实现了配置动态生效的特性。
基本组成 #
- application:应用。唯一性基于appid。
- environment:环境。可选值:dev/fat/uat/pro。
- cluster:集群。将单应用的不同实例进行分组,主要用于不同的数据中心。
- namespace:命名空间。将单应用的配置进行分组,默认分组为application。一般可以按照功能进行分组,例如数据库配置,消息队列配置,应用配置等;也可以用来引用不属于任何服务的公共配置,如线程池数量等。
- 命名空间分类:私有、公有(全局唯一)、关联(私有继承公有)。
- 私有命名空间会覆盖公共命名空间。
- 不同命名空间应用中先定义的先使用。
- item:配置项。支持键值对,json,xml。定位方式如下:
- 私有配置:env+app+cluster+namespace+item_key
- 公有配置:env+cluster+namespace+item_key
- 权限
Portal页面 #
应用管理页面
大量修改配置时,可以选择使用【文本】Tab进行编辑。
【实例列表】Tab上可以查看当前已连接到Apollo的所有客户端实例。