Ark 容器启动流程

Ark 应用的整体启动流程如下图所述:

image.png

当用java -jar命令启动 Ark 包或者在 IDE 中通过SofaArkBootstrap.launch 启动 Ark 应用时,相应的Launcher入口会负责启动应用。其中会反射调用ArkContainer的入口,初始化ArkService ,然后依次执行 pipeline,来完成整个 Ark 应用的启动。

ArkService

Ark Serivce 是 Ark 容器中的服务,底层使用 Guice 对服务进行管理。同时针对服务,提供了生命周期接口 com.alipay.sofa.ark.spi.service.ArkService

    public interface ArkService{

/**
 * Ark Service init
 * @throws ArkException
 */
        void init() throws ArkException;

/**
 * Ark Service dispose
 * @throws ArkException
 */
        void dispose() throws ArkException;

    }

当服务实现了上述接口时,在 Ark Serivce 容器启动时和停止时会调用相应的生命周期接口。

Pipeline 服务

Pipeline 也是注册在 Ark Service 容器中的一个服务,服务本身没有顺序和优先级。在 Pipeline 中会对服务进行一些组装,同时完成整个 Ark 容器的启动。流程如下:

  1. 解析 Archive。

    在 Pipeline 的最开始,会将运行的 fatjar 解析成运行时需要的模型,主要包括 Ark 插件模型和 Ark 业务模型,并将这些模型注册到 Ark Service 中的PluginManagerService以及BizManagerService中。

  2. 初始化环境。

    设置一些运行时需要的默认参数。比如设置log4j.ignoreTCLtrue,让log4j/log4j2初始化,使日志不从ThreadContextClassloader中寻找配置文件。更多信息,请参见Proper way to switch TCCL

  3. 注册容器服务。

    在 Ark 容器中会发布一些服务供其它的插件来使用。比如发布BizDeployer,让 SOFAArk 官方插件 sofa-jarslink 来完成 Biz 的动态加载、卸载等。

  4. 部署 Ark 插件。

    PluginManagerService 中获取到所有的 Ark 插件,并按照插件优先级顺序:

    • ClassloaderService准备插件 export 类的 map 映射。

    • PluginDeployService启动插件的com.alipay.sofa.ark.spi.service.PluginActivator

  5. 启动 Ark 业务。

    BizManagerService 中获取到所有的 Ark 业务,并执行业务配置在MANIFEST.MF属性Main-Class中提供的入口 main 函数。