shenyu自定义插件
年初学习 soul 网关的时候,写了一系列入门文章。最近发现 soul 项目进入了 apache 孵化基金会,并且改名为shenyu。当时发现 shenyu 发了几个issue,我接了其中一个,由于当时正在迁移仓库到apache,加上我不熟悉插件开发流程,最后我花了2个月才完成这个任务。下面说下我完成issue的经历。
成为Contributor
平常可以关注下项目的issue列表,为了避免错过,可以订阅shenyu的开发邮件,订阅步骤如下:
- 1.首先使用任意邮箱发送邮件到 :dev-subscribe@shenyu.apache.org (主题subscribe或者为空,内容也可为空)
- 2.会收到来自dev-subscribe@shenyu.apache.org的confirm,再回复(内容为空即可)
- 3.最后后收到Welcome的邮件,订阅成功
然后遇到有兴趣的issue,可以回复说自己有兴趣做,然后贡献代码,等待PR成功,就成为Contributors了。
贡献代码指南:https://dromara.org/zh/projects/soul/contributor/
接任务
回复issue,有指定任务权限的人看到会给你回复。我当时在4月接的任务,真正完成是在7月初了。
完成任务
接了任务之后,有不懂的,可以在issue里问,或者加shenyu的贡献者微信群,在里面提问。
我这个任务,很明显,就是添加一个可以修改response header的插件,当然后面做着做着,发现response body 也要支持自定义修改,这也是我任务完成时间过长的原因之一。
最后在大佬们的帮助下,我圆满完成了任务。
如何开发一个shenyu自定义插件
定义插件
1.在shenyu-plugin模块下新增一个子模块,例如我开发的是 shenyu-plugin-modify-response
2.新增插件,继承AbstractShenyuPlugin,重写doExecute、getOrder、named、skip等函数。
3.定义枚举
在PluginEnum类里,添加自定义插件的枚举。
//三个参数分别是 插件执行顺序、对应角色、插件名
MODIFY_RESPONSE(44, 0, "modifyResponse")
4.cache和handler包属于可选
定义插件starter
1.在 shenyu-spring-boot-starter 模块的子模块 shenyu-spring-boot-starter-plugin下新增子模块,例如我新增的是
shenyu-spring-boot-starter-plugin-modify-response
2.新增插件的 configuration
@Configuration
public class ModifyResponsePluginConfiguration {
@Bean
public ShenyuPlugin modifyResponsePlugin() {
return new ModifyResponsePlugin();
}
@Bean
public PluginDataHandler modifyResponsePluginDataHandler() {
return new ModifyResponsePluginDataHandler();
}
}
3.在 resources 目录下新增一个META-INF目录
4.新增 spring.factories 和 spring.provides 文件
这里利用的是Java的SPI机制。
spring.factories文件里的内容是configuration的全地址
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.apache.shenyu.springboot.starter.plugin.modify.response.ModifyResponsePluginConfiguration
spring.provides文件里的内容是模块名
provides: shenyu-spring-boot-starter-plugin-modify-response
自定义插件使用
以上就是 shenyu 自定义插件的一般步骤了,主要的插件处理逻辑是在插件的 doExecute() 里。
如果你想要使用插件的话,要在 bootstrap 模块的 pom 文件里,加上依赖
<!-- shenyu modify response plugin start-->
<dependency>
<groupId>org.apache.shenyu</groupId>
<artifactId>shenyu-spring-boot-starter-plugin-modify-response</artifactId>
<version>${project.version}</version>
</dependency>
<!-- shenyu modify response plugin end-->
然后在 admin 后台添加并开启插件(插件名记得和枚举里的名字一样),这样就能使用了。
tips
1.如果插件需要自定义参数,可以自己定义一个 handler 实现 RuleHandle(selector同理),具体类路径如下
当然这样就需要前端也配合修改。
如果是普通的参数,可以直接在 admin 的插件处理管理来新增参数。
2.新增的插件,需要把 sql(包括插件处理管理里的数据)语句同步到 schema.h2.sql 和 schema.sql 文件里。
3.开发完成,记得加上测试用例