说明
- 本文将分析 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 插件设计的规范新建插件模块代码
- 在数据库中添加插件相关信息
具体自定义插件将在下篇文章中给出。