本文介绍如何使用 SOFAArk 提供的动态配置插件,通过 Zookeeper 控制 Biz 的生命周期。
引入依赖
SOFAArk 提供了 config-ark-plugin 对接 Zookeeper 配置中心,用于运行时接受配置,达到控制 Biz 生命周期的目的。引入的依赖如下:
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>config-ark-plugin</artifactId>
<version>${sofa.ark.version}</version>
</dependency>
配置 Zookeeper 地址
参考 SOFAArk 配置,在 SOFAArk 配置文件 conf/ark/bootstrap.properties
增加如下配置:
com.alipay.sofa.ark.config.address=zookeeper:<ip:port> //填写 Zookeeper 的 IP 和端口。
配置维度
SOFAArk 启动后,会在 Zookeeper 注册两个节点配置,分别是宿主应用维度和 IP 维度:
sofa-ark/${com.alipay.sofa.ark.master.biz}/
:宿主应用维度配置,应用启动时,会拉取该维度配置,控制相关 Biz 的部署;应用重启后,配置不会丢失。sofa-ark/${com.alipay.sofa.ark.master.biz}/ip/
: IP 维度配置,应用重启后丢失,通常用于运行时控制单台机器的 Biz 行为。
通过写这两个节点的配置,可以控制相关机器和应用的 Biz 运行时状态。
配置形式
动态配置采用状态声明指令,SOFAArk 收到配置后,会根据状态描述解析出具体的指令(包括 install、uninstall、switch),指令格式如下:
bizName:bizVersion:bizState?k1=v1&k2=v2
多条指令使用英文分号(;)隔开。单条指令主要由 Biz 名称、Biz 版本、Biz 预期状态及参数组成。状态配置是描述指令推送之后,所有非宿主 Biz 的状态。
例如当前 SOFAArk 容器部署了两个应用 A 和 B,版本均为 1.0。其中 A 应用为宿主应用,因为宿主应用不可卸载,因此不需要考虑宿主应用,可以简单认为当前容器的 Biz 状态声明为:
`B:1.0:Activated`
如果此时您希望安装 C 应用,版本为 1.0,文件流地址为 urlC,那么推送指令应为:
B:1.0:Activated;C:1.0:Activated?bizUrl=urlC
如果您又希望安装 B 应用,版本为 2.0,文件流地址为 urlB,且希望 2.0 版本处于激活状态,那么您推送的指令应为:
B:1.0:Deactivated;B:2.0:Actaivated?bizUrl=urlB;C:1.0:Activated
因为 SOFAArk 只允许应用一个版本处于激活状态,如果存在其他版本,则应处于非激活状态。所以当您希望激活 B 应用 2.0 版本时,B 应用 1.0 版本应该声明为非激活状态。
目前只有当安装新 Biz 时,才有可能需要配置参数 BizUrl,用于指定 Biz 文件流地址,其他场景下,参数的解析没有意义。所以,当您安装应用 B 时,可以省略 urlC 参数。
如果您希望卸载 B 应用 2.0 版本,激活 B 应用 1.0 版本,卸载 C 应用,那么推送的指令声明为:
B:1.0:Activated
从上面的操作描述看,在推送动态配置时,只需要声明期望的 Biz 状态即可,SOFAArk 会根据状态声明推断具体的执行指令,并尽可能保持服务的连续性,以上面最后一步操作为例,SOFAArk 推断的执行指令顺序如下:
执行
switch
指令,激活 B 应用 1.0 版本,钝化 B 应用 2.0 版本,保证服务连续性。执行
uninstall
指令,卸载 B 应用 2.0 版本。执行
uninstall
指令,卸载 C 应用 1.0 版本。
注意事项
目前只有在安装新 Biz 时才可能使用指令参数 BizUrl,用于指定 Biz 文件流地址。文件流地址字符串是能够直接构建 URL 对象,例如
file://xxx
或者http://xxx
。安装新 Biz 时,参数 bizUrl 不是必须的,SOFAArk 提供了以下扩展点,用于扩展实现,根据 Biz 名称和 Biz 版本返回 Biz 文件。
@Extensible public interface BizFileGenerator{ File createBizFile(String bizName,String bizVersion); }