Apache ShenYu 网关插件模式分析(下)

说明

  • 本文将展示自定义插件流程
  • 该自定义插件只为描述自定义插件流程,插件及其简单,不涉及具体插件功能。

plugin数据插入

由上文得知,plugin的元数据都放在 plugin表中,而在shenyu-admin上没有新增插件的api,所以我们要新增插件,首先需要在 plugin表中手动插入自定义插件信息,我新加的 pulgin信息为

INSERT  INTO `plugin` (`id`, `name`, `role`, `enabled`, `date_created`, `date_updated`) VALUES ('15','diywaf','1', '0', '2021-01-25 19:17:35', '2021-01-25 19:17:35');

然后我们就可以在shenyu-admin里去开启我们的插件咯。

自定义插件开发

当前,我们在数据库里加了对应数据后,还得开发我们的插件项目。在上篇文章分析了插件接入模式,现在我们来自定义插件。

首先创建我们的自定义plugin类,并继承 shenyu插件的抽象类 AbstractShenyuPlugin,所有插件都继承自它。当下自定义插件仅演示自定义插件流程,默认拦截所以请求。

public class DiyWafPlugin extends AbstractShenyuPlugin {
    @Override
    protected Mono<Void> doExecute(ServerWebExchange exchange, ShenyuPluginChain chain, SelectorData selector, RuleData rule) {
        //简单演示,默认直接拒绝
        Object error = ShenyuResultWrap.error(-101, Constants.REJECT_MSG, null);
        return WebFluxResultUtils.result(exchange, error);
    }

    @Override
    public int getOrder() {
        return 1;
    }

    @Override
    public String named() {
        return PluginEnum.DIYWAF.getName();
    }
}

我们的shenyu插件都是以 spring boot start 方式注入的,通过starter解偶。创建一个 shenyu-spring-boot-start-diywaf 项目,并创建DiyWayPluginConfiguration配置类装配我们自定义的DiyWafPlugin,将该配置类配到 spring.factories

@Configuration
public class DiyWayPluginConfiguration {
    @Bean
    public ShenyuPlugin diyWebPlugin() {
        return new DiyWafPlugin();
    }
    ……

}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.apache.shenyu.shenyu.spring.boot.plugin.diywaf.DiyWayPluginConfiguration

然后在 shenyu-bootstrap 类中引入该starter

 <!-- shenyu diywaf plugin starter-->
<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-plugin-diywaf</artifactId>
    <version>${project.version}</version>
</dependency>
<!-- shenyu diywaf plugin end-->

最后再重启 shenyu-bootstrap项目,并在 shenyu-admin里,配置该插件相关规则。我配置的符合 /http/** uri的都匹配上我们自定义的插件给直接拒绝,返回错误码 -101。

curl http://localhost:9195/http/order/findById?id=11

{
    "code": -101,
    "message": " You are forbidden to visit",
    "data": null
}

选择器相关配置

规则配置

匹配到自定义插件的日志

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注