apollo功能
- 配置功能
- namespace
- config
- key
- 灰度
- 自定义字段,如uid
- 配置灰度百分比
- 在执行方法时传入该uid
端
- 服务端
- agent监听zk,将该服务订阅的配置下载到本地,保存为文件
- sdk监听文件,修改内存中的配置
- app
- 将配置按服务端过程下载至服务器本地
- app通过http接口,在返回前台时调用
- 小程序
- 同app
配置链路
- 修改或新增配置后,发布给distributor
- distributor分发给各机房独立的zk
- notifier服务通知agent监听指定的zk节点,agent为容器内部的apollo agent
- 业务服务集成sdk,初始访问时sdk在本地文件找不到开关配置,发请求给agent,agent监听本机房zk获取配置存到本地
apollo初始化
实始化reader
- 在init()方法中首先会实始化reader
- reader用于读取apollo配置文件
- reader的path为
/home/xxx/ep/as/store
通过reader创建 RepositoryContainer实例
- 在创建RepositoryContainer实例过程中会创建ConfNamespaceWatcher的实例
- 在创建ConfNamespaceWatcher的实例时,会传入scheduler,scheduler实际为PeriodicScheduler的实例
- 在RepositoryContainer的init方法中会执行initApolloRepository和watchConfigGroups
- initApolloRepository中会创建三个Repository
- 三个Repository分别是ToggleRepository,UserGroupRepository,NamespaceRepository,分别对应/home/xxx/ep/as/store下面的三个目录
- 以NamespaceRepository为例
- 在创建createNamespaceRepository时会创建NamespaceLoader的实例
- 在创建NamespaceLoader时,会传入reader&scheduler
- NamespaceLoader是BaseLoader的子类
- 通过上述NamespaceLoader的实例loader创建NamespaceRepository
- 在NamespaceRepository的构造方法中,会调用startWatch()
- 在startWatch中会通过loader.watch(即NamespaceLoader)执行Callback
- callback中有三个方法,分别为upserted,deleted,error,finished
- loader.watch即BaseLoader.watch,在该方法中通过scheduler每秒执行一次load(callback)方法
- load方法中分别执行loadNameAndModifiedTime、handleUpsert、handleDelete&setLastLoadStatus
- loadNameAndModifiedTime会获取本次修改的namespace
- 该方法中会获取/home/xxx/ep/as/store/namespace(以NamespaceLoader为例)下的文件
- 该方法返回一个map,key为文件名,value为最后一次修改时间
- handleUpsert
- 在该方法中会循环loadNameAndModifiedTime返回的map,并与lastLoadStatus中该namespace对应的时间进行比较
- 如果不同,则执行callback.upserted
- handleDelete判断是否该namespace已不存在,如果是则执行
callback.deleted(name)
方法 - setLastLoadStatus重置lastLoadStatus
- watchConfigGroups方法中会执行confNamespaceWatcher.watch(callback)
- callback存在3个方法,分别为added,deleted,error
- 在added方法中,会获取该namespace对应的配置,并put到index中
- 在deleted方法中,会将该namespace从index中删除
- index实际为一个ConcurrentMap,key为namespace,value为Repository的实现
- Repository中存在put,delete,get等方法,可向namespace中添加,删除或获取配置
- confNamespaceWatcher.watch
- 在watch方法中,会通过scheduler定时执行Runnable代码块,每秒执行1次
- 在Runnable代码块中执行findAll、handleChanged方法及reset
- findAll中通过
this.reader.loadNames("conf")
找到所有的namespace文件名 - handleChanged方法中会执行handleAdded及handleDeleted
- 在handleAdded中循环findAll中查到的所有namespace,并判断当前spaces中是否存在,如果不存在则调用
callback.added(name)
- handleDeleted方法中循环spaces中所有namespace,并判断findAll中查找到的是否存在该namespace,如果不存在,则调用
callback.deleted(name)
- 在handleAdded中循环findAll中查到的所有namespace,并判断当前spaces中是否存在,如果不存在则调用
- 在reset方法中会将spaces重置为findAll中查询到的names
- findAll中通过
Apollo.addConfigCallback
- 在Apollo 执行init方法时,会创建CallbackDispatcher实例,CallbackDispatcher用于执行callback,将不同的FileChangeEvent,交给不同的CallbackExecutor
- 以
addConfigCallback(String namespace, ConfigNamespaceChangeCallback callback)
为例- 在执行Apollo.addConfigCallback时会通过
callbackDispatcher.getConfigNamespaceCallbackExecutor()
判断CallbackDispatcher实例中的对应CallbackExecutor是否为null - 如果为null,则会进行初始化
- 将callbackDispatcher通过
repositoryContainer.setCallbackDispatcherForConf(callbackDispatcher)
保存至repositoryContainer中- 在该方法中会将callbackDispatcher set至ToggleRepository中
- 在执行Apollo.addConfigCallback时会通过
- 然后调用
callbackDispatcher.getConfigCallbackExecutor().addCallback(namespace, config, callback);
添加callback方法 - 在ToggleRepository的put方法中,会调用notifyToggleUpdated
- 在该方法中会执行callbackDispatcher.execute方法
apollo模板配置化
apollo可通过自定义模板的方式,实现配置化,以达到对某列表数据的增删改查