拦截插件
入口插件
- 实现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; } }
- 填写配置信息。
- 完成接口实现之后,还需要填写配置信息。有关horizon的入口拦截配置信息如下:
devspore.horizon.approvers
实现的Entry插件,插件必须注入到spring IOC容器,并提供bean id,赋值给devspore.horizon.processors配置项。devspore.horizon.processors配置项是个数组。horizon会读取数组中每个bean id,执行已实现的鉴权、认证等逻辑。
- 多个插件以","分隔,多个插件按配置顺序执行。
devspore: horizon: processors: bean1,bean2
- 完成接口实现之后,还需要填写配置信息。有关horizon的入口拦截配置信息如下:
出口插件
- 实现exit插件。
devspore-horizon提供了接口Observer,用户需要实现这个接口的observe(DataEvent dataEvent)方法,把变更通知、更新缓存、统一审计、统一工作流的处理逻辑写到此方法体内即可。
Observer代码如下:
public interface Observer { // receive the BO changes void observe(DataEvent dataEvent) throws PluginException; }
- 填写配置信息。
- 完成接口实现之后,还需要填写配置信息。有关horizon的出口拦截配置信息如下:
devspore.horizon.observers
devspore.horizon.observers配置项也是个数组。horizon会读取数组中每个bean id,执行已实现的消息发送、审计等逻辑。
- 多个插件以","分隔,多个插件按配置顺序执行。
devspore: horizon: observers: bean1,bean2
- 完成接口实现之后,还需要填写配置信息。有关horizon的出口拦截配置信息如下:
插件参数DataEvent
DataEvent提供了插件的参数上下文,其主要包括以下信息:参数取值示例见操作示例
参数名称 |
数据类型 |
描述 |
---|---|---|
metaDocument |
MetaDocument |
服务的元数据对象。 |
operation |
Operation |
资源操作类型,包含增删改查、批量增删改查,自定义等操作。 @Extension注解operation参数值。 |
customMethod |
String |
扩展API中定义的method对象,仅在operation为CUSTOM时候有意义。 @Extension注解customMethod参数值。 |
sourceName |
String |
操作的资源名称。@Extension注解name参数值。 |
argsMap |
Map |
操作方法参数与对应实际入参的集合。 |
id |
Object |
操作的资源id。
|
originDo |
Object |
api被调用前do对象(一般从数据库取出)。
|
targetDo |
Object |
api想要设置的do对象的克隆对象(对其进行修改不会持久化)。
|
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