apollo功能

  • 配置功能
    • namespace
    • config
    • key
  • 灰度
    • 自定义字段,如uid
    • 配置灰度百分比
    • 在执行方法时传入该uid

  • 服务端
    • agent监听zk,将该服务订阅的配置下载到本地,保存为文件
    • sdk监听文件,修改内存中的配置
  • app
    • 将配置按服务端过程下载至服务器本地
    • app通过http接口,在返回前台时调用
  • 小程序
    • 同app

配置链路

WX20220623-162455@2x

  • 修改或新增配置后,发布给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)
        • 在reset方法中会将spaces重置为findAll中查询到的names

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中
  • 然后调用callbackDispatcher.getConfigCallbackExecutor().addCallback(namespace, config, callback);添加callback方法
  • 在ToggleRepository的put方法中,会调用notifyToggleUpdated
    • 在该方法中会执行callbackDispatcher.execute方法

apollo模板配置化

apollo可通过自定义模板的方式,实现配置化,以达到对某列表数据的增删改查