插件扩展

    • 插件是 网关的核心执行者,每个插件在开启的情况下,都会对匹配的流量,进行自己的处理。
    • Apache ShenYu 网关里面,插件分为两类。
      • 一类是单一职责的调用链,不能对流量进行自定义的筛选。
      • 一类是能对匹配的流量,执行自己的职责调用链。
    • 用户可以参考 shenyu-plugin 模块,新增自己的插件处理,如果有好的公用插件,可以向官网提交pr
    • 引入如下依赖:
    • 用户新增一个类 MyShenyuPlugin,直接实现 org.apache.shenyu.plugin.api.ShenyuPlugin
    1. public interface ShenyuPlugin {
    2. /**
    3. * Process the Web request and (optionally) delegate to the next
    4. * {@code WebFilter} through the given {@link ShenyuPluginChain}.
    5. *
    6. * @param exchange the current server exchange
    7. * @param chain provides a way to delegate to the next filter
    8. * @return {@code Mono<Void>} to indicate when request processing is complete
    9. */
    10. Mono<Void> execute(ServerWebExchange exchange, ShenyuPluginChain chain);
    11. /**
    12. * return plugin order .
    13. * This attribute To determine the plugin execution order in the same type plugin.
    14. * @return int order
    15. */
    16. int getOrder();
    17. /**
    18. * acquire plugin name.
    19. * if you impl AbstractShenyuPlugin this attribute not use.
    20. *
    21. * @return plugin name.
    22. */
    23. default String named() {
    24. return "";
    25. }
    26. /**
    27. * plugin is execute.
    28. * if return true this plugin can not execute.
    29. *
    30. * @param exchange the current server exchange
    31. * @return default false.
    32. */
    33. default Boolean skip(ServerWebExchange exchange) {
    34. return false;
    35. }
    36. }
    • 引入如下依赖:
    1. <dependency>
    2. <groupId>org.apache.shenyu</groupId>
    3. <version>${project.version}</version>
    4. </dependency>
    • 新增一个类 CustomPlugin,继承 org.apache.shenyu.plugin.base.AbstractShenyuPlugin

    • 以下是参考:

    • 详细讲解:

      • 继承该类的插件,插件会进行选择器规则匹配。

      • 重新登陆 shenyu-admin 后台,可以看见刚新增的插件,然后就可以进行选择器规则匹配。

      • 在 基础配置 —> 插件处理管理 中,可以给插件的不同位置添加自定义字段。然后在相应位置添加条目时,就可以为这些字段指定值,它们将以 json 格式发送给插件,从而达到动态配置插件的目的。其中 选择器规则 处的字段,分别可以在 doExecute() 方法中,通过 selector.getHandle();rule.getHandle(); 获取,然后进行你的操作。

    • 注册成Springbean,参考如下或者直接在实现类上加 @Component 注解。

    1. @Bean
    2. public ShenyuPlugin customPlugin() {
    3. return new CustomPlugin();
    4. }
    • 新增一个类 PluginDataHandler,实现 org.apache.shenyu.plugin.base.handler.PluginDataHandler
    • 注意 pluginNamed() 要和你自定义的插件名称相同。

    1. @Bean
    2. public PluginDataHandler pluginDataHandler() {
    3. }