Zookeeper 配置

本文介绍如何使用 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 推断的执行指令顺序如下:

  1. 执行switch指令,激活 B 应用 1.0 版本,钝化 B 应用 2.0 版本,保证服务连续性。

  2. 执行uninstall指令,卸载 B 应用 2.0 版本。

  3. 执行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);
    }