更新时间:2025-01-09 GMT+08:00
分享

拦截插件

入口插件

  1. 实现Entry插件。

    devspore-horizon提供了抽象类Processor,用户需要继承这个抽象类,实现抽象方法doProcess(DataEvent event),把认证和鉴权的处理逻辑写到此方法体内。此方法返回值为boolean型。如果认证或者鉴权的逻辑失败,则返回false,责任链后续节点不再执行,整个请求返回不再执行;如果认证或者鉴权成功,则返回为true,继续执行后续节点。Processor代码如下:

    public abstract class Processor {
        protected MetaDocument metaDoc;
    
        private String name;
    
        private Processor next;
    
        public Processor getNext() {
            return next;
        }
    
        public void setNext(Processor next) {
            this.next = next;
        }
    
        public boolean process(DataEvent dataEvent) throws PluginException {
            if (!doProcess(dataEvent)) {
                return false;
            }
            if (null != next) {
                return next.process(dataEvent);
            }
            return true;
        }
    
        public abstract boolean doProcess(DataEvent dataEvent) throws PluginException;
    
        public String getName() {
            return name;
        }
    }

  2. 填写配置信息。

    • 完成接口实现之后,还需要填写配置信息。有关horizon的入口拦截配置信息如下:
      devspore.horizon.approvers

      实现的Entry插件,插件必须注入到spring IOC容器,并提供bean id,赋值给devspore.horizon.processors配置项。devspore.horizon.processors配置项是个数组。horizon会读取数组中每个bean id,执行已实现的鉴权、认证等逻辑。

    • 多个插件以","分隔,多个插件按配置顺序执行。
      devspore:
        horizon:
          processors: bean1,bean2

出口插件

  1. 实现exit插件。

    devspore-horizon提供了接口Observer,用户需要实现这个接口的observe(DataEvent dataEvent)方法,把变更通知、更新缓存、统一审计、统一工作流的处理逻辑写到此方法体内即可。

    Observer代码如下:

    public interface Observer {
        // receive the BO changes
        void observe(DataEvent dataEvent) throws PluginException;
    }

  2. 填写配置信息。

    • 完成接口实现之后,还需要填写配置信息。有关horizon的出口拦截配置信息如下:
      devspore.horizon.observers

      devspore.horizon.observers配置项也是个数组。horizon会读取数组中每个bean id,执行已实现的消息发送、审计等逻辑。

    • 多个插件以","分隔,多个插件按配置顺序执行。
      devspore:
        horizon:
          observers: bean1,bean2

插件参数DataEvent

DataEvent提供了插件的参数上下文,其主要包括以下信息:参数取值示例见操作示例

表1 DataEvent参数说明

参数名称

数据类型

描述

metaDocument

MetaDocument

服务的元数据对象。

operation

Operation

资源操作类型,包含增删改查、批量增删改查,自定义等操作。

@Extension注解operation参数值。

customMethod

String

扩展API中定义的method对象,仅在operation为CUSTOM时候有意义。

@Extension注解customMethod参数值。

sourceName

String

操作的资源名称。@Extension注解name参数值。

argsMap

Map

操作方法参数与对应实际入参的集合。

id

Object

操作的资源id。

  • add:创建资源对象中的资源id。
  • update:修改的资源id。
  • delete:删除的资源id。

originDo

Object

api被调用前do对象(一般从数据库取出)。

  • add:为null。
  • update:修改前数据库中的原始对象。
  • delete:删除前数据库中的原始对象。

targetDo

Object

api想要设置的do对象的克隆对象(对其进行修改不会持久化)。

  • add:需要创建的对象。
  • update:需要修改到的对象。
  • delete:为null。

methodName

String

@Extension注解所在原方法名。

className

String

@Extension注解所在的类名。

contextMap

Map<String, Object>

缓存上下文对象,由请求插件设置,并由响应插件读取,通常key是插件名称。

内置插件

开启horizon后,会自动生成两个内置插件,用户在插件中实现统一的操作前认证、鉴权,操作后消息发送、缓存更新、审计等逻辑即可:

  • Entry插件
    /**
     * default request plugin
     */
    @Component
    @javax.annotation.Generated(value = "com.huaweicloud.devspore.codegen, xxx-RELEASE")
    public class DefaultRequestPlugin extends Processor {
        @Override
        public boolean doProcess(DataEvent dataEvent) throws PluginException {
            // do your code
            return true;
        }
    }
  • Exit插件
    /**
     * default response plugin
     */
    @Component
    @javax.annotation.Generated(value = "com.huaweicloud.devspore.codegen, xxx-RELEASE")
    public class DefaultResponsePlugin implements Observer {
        @Override
        public void observe(DataEvent dataEvent) throws PluginException {
            // do your code
        }
    }
  • 配置文件
    devspore:
      horizon:
        processors: defaultRequestPlugin
        observers: defaultResponsePlugin

相关文档