首页 > 其他分享 >Apollo 4 客户端 SDK 设计

Apollo 4 客户端 SDK 设计

时间:2023-12-13 14:45:43浏览次数:27  
标签:Spring 轮询 配置 监听器 SDK RemoteConfigRepository Apollo 客户端

前言

之前聊了客户端的一些功能,例如融入 Spring, @value 注解的自动刷新实现,长轮询等,这次从客户端的整体设计来聊聊。

设计

上图是 client 项目的包结构。

其中,核心包就是 internals 包,包含了客户端的主要功能逻辑。主要有以下功能:
0. 获取 ConfigService 服务的远程配置。

  1. 长轮询/定时轮询 ConfigService。
  2. 监听机制——更新后,立即通知应用程序。
  3. 兼容 Spring 各个版本(这个是在 spring 包中,但我认为也算重要功能 ^_^)。
首先说第一个功能:获取 ConfigService 服务的远程配置
实现此功能的类为:RemoteConfigRepository。该类有以下几个重要的方法:
  1. 构造方法:该方法里包含了很多初始化的过程,虽然我觉得应该放在 init 之类的方法中
  2. getConfig() 根据 namespace 获取配置
  3. onLongPollNotified() 当收到长连接通知时触发响应
  4. addChangeListener() 添加监听器
  5. removeChangeListener() 删除监听器

注意:setUpstreamRepository 是空的。看注释,是个 fallback 设计。

其中,getConfig 方法是获取这个 namespace 的配置,返回的是 Properties 对象(就是个 Map)。然后,从这个对象中取出对应的值,就 ok 了。

第二个功能:长轮询/定时轮询 ConfigService。

这个功能的主要实现类是:RemoteConfigLongPollService。

该类主要的方法有 2 个,构造方法和 submit 方法。注意,这个类是单例的(由 google 的 inject 实现)。
构造方法中,做了很多的初始化工作。而 submit 方法则是开启长轮询,轮询的方式是:携带 AppId 去请求 ConfigServcie,得到所有的 namespace 更新通知,然后通知对应的 RemoteConfigRepository 去请求真正的数据。大概的设计如下图:

image.png

每一个 namespace 在一个应用中,都对应一个 RemoteConfigRepository,所有的 RemoteConfigRepository 都归属 RemoteConfigLongPollService 长轮询服务管理,当长轮询得到通知,便通知对应的 RemoteConfigRepository 进行服务请求以便执行更新本地缓存和通知监听器操作。

通知,作为 fallback 方案—— 定时轮询也充当了长轮询失效的最后屏障。

第三个功能:监听机制——更新后,立即通知应用程序。

从上图可以看出,轮询之后,如果有更新响应,则立即通知 RemoteConfigRepository,然后,RemoteConfigRepository 再次从配置中心拉取配置,从而更新本地 Config 对象的内容。

更新完毕后,则通知 Config 的“配置变化监听器”。也就是 ConfigChangeListener 的 onChange 方法。这个监听器是监听 Config 对象的。

实际上,每个 Config 对象在初始化的时候,都会往 RemoteConfigRepository 对象里添加一个监听器,实际上就是添加自己。

当 RemoteConfigRepository 发生变化的时候,触发 onRepositoryChange 方法,onRepositoryChange 又会触发 onChange 方法。大概的设计图就是下面这个样子:

上图中,紫色的 DefaultConfig 是核心,他依赖了 RemoteConfigRepository, 而 RemoteConfigRepository 反过来组合了他,同时 DefaultConfig 也聚合了用户实现的监听器 ConfigChangeListener 的子类。

那么,当远程 Repository 变化的时候,就可以通知 Client 的缓存 Config 对象,而 Config 缓存对象变化的时候,就可以通知用户的程序(监听器)。实现整体的监听机制。

总的来说,就是通过两层监听机制来实现的。其中 DefaultConfig 实现了两个角色,既是观察者,也是被观察者。

第四个功能:兼容 Spring 各个版本

首先,如果没有这个功能,Apollo 也会能够正常运行的,不过,你只能使用 API 的方式,不能使用注解,标签等 Spring 应用熟悉的方式。

如果想用 Spring 的方式使用 Apollo ,那么就得遵守 Spring 的约定,实现 Spring 的接口,将自己融入到 Spring 中。

其中,主要解决的问题就是,如何在 Spring 初始化的时候,Apollo 也初始化?这点我们在之前的文章中说了,也就是 Spring 的 3 个入口。在这些入口里初始化。

另外,将配置放置到 Spring 的环境中,也是一个工作,因为,如果不放到环境中,Spring 初始时需要的那些参数就无法取到了。

所以,要将 Config 对象包装成 Spring 熟悉的 ConfigPropertySource 对象,算是一个适配器模式吧。

在初始化配置的时候,会从远程配置中心拿到配置,包装成 ConfigPropertySource 对象,再利用 CompositePropertySource 组合属性配置(多个 namespace)聚合所有 Config 对象。

CompositePropertySource 最后会添加到 ConfigurableEnvironment 环境对象中,spring 就可以从这个对象 中取出配置进行初始化。

并且,在 SpringBoot 环境下,Apollo 可以优先加载指定的配置,这些配置在 SpringContext 容器初始化的时候就开始被注入到环境中,这样就可以将一些系统初始化的配置也放到配置中心了,尽量让本地少一点配置。这个功能的启用需要参数:apollo.bootstrap.enabled=true,配置的namespace 则是 apollo.bootstrap.namespaces = XXX

并且,该配置的优先级是最高的,Apollo 将这个配置放在了 Spring 环境对象中的第一个位置,当循环获取配置的时候,优先获取这个配置。

总结

好了,关于 Apollo 客户端的设计,大概就是这些,总体来讲比较简单, 4 个功能:

  1. 获取远程配置
  2. 长轮询/定时轮询
  3. 配置更新监听机制。
  4. 兼容 Spring。

抛出一个问题:

Apollo 似乎没有给用户留扩展接口?如果能像 Spring,Mybatis 一样,留一个或者多个切面给用户,让用户能够在加载配置的时候,做一些事情啥的,或许更好。

作者:莫那鲁道
出处: 博客园:http://www.cnblogs.com/stateis0/

标签:Spring,轮询,配置,监听器,SDK,RemoteConfigRepository,Apollo,客户端
From: https://www.cnblogs.com/softidea/p/17898984.html

相关文章

  • 使用 AWS Go SDK 读取审计日志(CloudTrail)
    背景公司的海外业务需要将云上的操作读取到内部的日志文件中,永久保存,供内部审计使用。由于之前没有用过AWS相关的SDK,在使用过程中也遇到一些困难,这里记录一下,并且总结一下过程。代码快速开始代码参考地址:https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/go/examp......
  • JSSDK获取signature签名,史上最全,没有之一
    微信公众号JSSDK获取signature签名,史上最全,没有之一1.操作流程1、通过appId和appSecret获取access_token;2、使用access_token获取jsapi_ticket;3、用时间戳、随机数、jsapi_ticket和要访问的url按照签名算法拼接字符串;4、对第三步得到的字符串进行SHA1加密,得到签名。2.上代码获取a......
  • 【开源项目推荐】-支持GPT的智能数据库客户端与报表工具——Chat2DB
    2023年是人工智能爆火的一年,ChatGPT为首的一系列的大模型的出现,让生成式人工智能彻底火了一把。但有人会说,GPT对于我们数据开发来说并没有什么作用啊?今天为大家推荐的开源项目,就是GPT在数据领域的一个优秀实践项目。让我们一起来看看吧~Chat2DB是一个集成了ChatGPT功能的数据库S......
  • 编译Platinum SDK库
    PlatinumSDK是一款开源的库,方便用户在各种平台上快算实现DLNARender功能,本文章主要介绍,使用AndroidNDK编译PlatinumSDK,方便后续在Android平台上使用。一.Platinum源代码下载地址:https://github.com/plutinosoft/Platinum二.编译环境准备:Platinum官方的Android编译介绍只......
  • 智能监控平台/视频共享融合系统EasyCVR接入大华SDK后只有一路通道可云台控制该如何解
    TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,包括对人、车、......
  • arcgis 最全SDK下载
    一、产品介绍:作为开发人员,您可以在自己的制图应用程序中使用我们的高级制图服务,也可以灵活使用ArcGIS系统来满足组织的特定需求。解决方案合作伙伴、集成商和Esri自己的开发人员使用ArcGIS应用程序编程接口(API)和软件开发工具包(SDK)来开发启用位置的产品、解决方案,......
  • VS2022中ArcGIS Pro SDK for .NET安装和卸载指南
    VS2022中ArcGISProSDKfor.NET安装和卸载指南下载:资源下载安裝ArcGISProSDKfor.NET升级ArcGISProSDKfor.NET卸载ArcGISProSDKfor.NET使用专用图库分发适用于.NET的ArcGISProSDK概述ArcGISProSDKfor.NET提供以下3个VisualStudio扩展......
  • Qt/C++音视频开发59-使用mdk-sdk组件/原qtav作者力作/性能凶残/超级跨平台
    一、前言最近一个月一直在研究mdk-sdk音视频组件,这个组件是原qtav作者的最新力作,提供了各种各样的示例demo,不仅限于支持C++,其他各种比如java/flutter/web/android等全部支持,性能上也是杠杠的,目前大概是在V0.23版本,大部分软件发布基本上都是在1.0版本才是比较稳定的,不过目前用下来......
  • 基于Html+腾讯云播SDK开发的m3u8播放器
    周末业余时间在家无事,学习了一下腾讯的云播放sdk,并制作了一个小demo(m3u8播放器),该在线工具是基于腾讯的云播sdk开发的,云播sdk非常牛,可以支持多种播放格式。预览地址m3u8player.org源码地址https://github.com/geeeeeeeek/m3u8player开发步骤第一步:集成播放器SDK:播放器SDK......
  • Hadoop 配置Windows 客户端
    1.根据Hadoop版本下载Windows依赖,并放置到非中文目录下https://github.com/cdarlint/winutils2.配置环境变量HADOOP_HOME->放置的目录地址PATH->追加%HADOOP_HOME%\bin3.测试环境双击winutils.exe,如出现运行错误,则需要安装相关的运行库解决。......