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

说明

  • 本文将分析 Apache ShenYu 网关的插件设计以及如何简单的加入自定义插件

前言

在前面的 shenyu 网关系列文章里,我们分别写了 shenyu 网关源码环境搭建、shenyu 网关官方http、dubbo、springcloud、sofa等examples功能体验相关文章。shenyu它定位的是可热插拔热更新插件式的系统,所以它涉及到网关配置信息的同步问题,我们也分别分析了 shenyu 网关通过http长轮询、websocket、zookeeper数据同步的源码以及底层原理。本篇文章将分析 shenyu 系统的插件设计,以及如何自己加入一个新插件。

插件设计分析

相关源码分析

在写数据同步相关文章的时候,详实分析在 shenyul-admin 启动的时候会从数据库里将网关相关配置加载到进程内存中,所以现在仅简单分析一下,元数据、认证数据、插件数据、选择器数据是具体加载到哪个地方的,以及对应的数据格式是什么。

插件模式
当 shenyu 网关接收到客户端的请求后,客户端会根据请求的数据去通过责任链的方式匹配插件,若是匹配到了插件就执行相关插件里提供的功能,若是都没有匹配到则会抛出异常。

public final class ShenyuWebHandler implements WebHandler {
    ……
     private static class DefaultShenyuPluginChain implements ShenyuPluginChain {
           @Override
        public Mono<Void> execute(final ServerWebExchange exchange) {
            return Mono.defer(() -> {
                if (this.index < plugins.size()) {
                    // 遍历注册进来的所有插件,然后根据请求匹配
                    ShenyuPlugin plugin = plugins.get(this.index++);
                    ……
                    return plugin.execute(exchange, this);
                }
                return Mono.empty();
            });
        }
     }
}

数据格式
从数据同步流程来说,shenyu 网关都是会到 shenyu-admin拉取配置信息或者 shenyu-admin 给 shenyu 网关推送配置数据,所以我们只需要从 shenyu-admin 去关注数据格式。每次 shenyu 网关去 shenyu-admin 拉去配置信息的时候它最终调用的是 /configs/fetch接口,其中关于数据的核心来源接口为

public abstract class AbstractDataChangedListener implements DataChangedListener, InitializingBean {
    ……
     /**
     * 更新规则缓存
     */
    protected void updateRuleCache() {
        this.updateCache(ConfigGroupEnum.RULE, ruleService.listAll());
    }

    /**
     * 更新插件缓存
     */
    protected void updatePluginCache() {
        this.updateCache(ConfigGroupEnum.PLUGIN, pluginService.listAll());
    }
    ……
}

由此得知,插件的配置信息来源于 pluginService.listAll()。该方法去查询的shenyu 数据库中的 plugin表

列名 类型 说明
id string 唯一主键
name string 插件名称
config json string 插件相关的配置
role number 插件角色
enabled tinyint 插件是否启用
date_created timestamp 数据创建时间
date_updated timestamp 数据修改时间

于是我们得出要开发新插件要有核心的两步:

  • 遵循 shenyu 插件设计的规范新建插件模块代码
  • 在数据库中添加插件相关信息

具体自定义插件将在下篇文章中给出。

发表评论

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