Ark 容器插件机制

Ark 插件启动

Ark 中提供了插件启动的接口 com.alipay.sofa.ark.spi.service.PluginActivator ,其定义如下:

  1. public interface PluginActivator {
  2. /**
  3. * Start Plugin
  4. * @param context plugin context
  5. * @throws ArkException
  6. */
  7. void start(PluginContext context) throws ArkException;
  8. /**
  9. * Stop Plugin
  10. * @param context
  11. * @throws ArkException
  12. */
  13. void stop(PluginContext context) throws ArkException;
  14. }

插件只需要实现此接口,并在 MANIFEST.MF 中配置 activator 属性,就会在启动时执行 start 方法,停止时执行 stop 方法

Ark 插件通信

Ark 之间的通信是通过服务来完成的, 在上述启动接口方法的入参类型 com.alipay.sofa.ark.spi.model.PluginContext 中提供了发布服务和引用服务的接口

  1. /**
  2. * Publish Plugin Service
  3. * @param ifClass service interface
  4. * @param implObject service implement object
  5. * @param <T>
  6. * @return
  7. */
  8. <T> ServiceReference<T> publishService(Class<T> ifClass, T implObject);
  9. /**
  10. * Get Service publish by plugin, when there are multiple services, return the highest priority plugin service
  11. * @param ifClass service interface
  12. * @param <T>
  13. * @return service reference
  14. */
  15. <T> ServiceReference<T> referenceService(Class<T> ifClass);
  16. /**
  17. * Get Service publish by one specific plugin
  18. * @param ifClass service interface
  19. * @param <T>
  20. * @param pluginName the name of the plugin which publish the service
  21. * @return service reference
  22. */
  23. <T> ServiceReference<T> referenceService(Class<T> ifClass, String pluginName);
  24. /**
  25. * Get Service List publish by plugin
  26. * @param ifClass service interface
  27. * @param <T>
  28. * @return
  29. */
  30. <T> List<ServiceReference<T>> referenceServices(Class<T> ifClass);

插件服务是以接口为粒度的,针对同一个接口:

  • 每一个插件只允许发布一个服务,重复发布则会直接返回已经发布服务的引用
  • 当多有个插件发布服务时,若通过 referenceService 引用单个服务
    • 当不指定 pluginName 时,则返回优先级最高的服务
    • 当指定 pluginName 时,则返回该插件发布的服务
      返回的服务引用 ServiceReference 定义如下:
  1. public interface ServiceReference<T> {
  2. /**
  3. * get Service Object
  4. * @return service
  5. */
  6. T getService();
  7. /**
  8. * get Service Metadata
  9. * @return
  10. */
  11. ServiceMetadata getServiceMetadata();
  12. }
  13. public interface ServiceMetadata {
  14. /**
  15. * get Service Unique Name
  16. * @return service name
  17. */
  18. String getServiceName();
  19. /**
  20. * get Service Interface Class
  21. * @return interface class
  22. */
  23. Class<?> getInterfaceClass();
  24. /**
  25. * get ServiceProvider
  26. * @return
  27. */
  28. ServiceProvider getServiceProvider();
  29. }

其中通过

  • getService() 可以获取到服务的实体 (也即发布服务时的 implObject)
  • getServiceMetadata() 可以获取到服务的元数据信息,包括
    • 服务名:即服务的接口名
    • 服务接口
    • 服务的提供方:包括提供方名字(插件名等)、提供方优先级(插件优先级)

原文: https://alipay.github.io/sofastack.github.io/docs/plugin.html