以鉴权为例,介绍如何快速开发一个插件
2021,8,14 技术分享


Goku 网关由于采用了模块化的设计,你几乎可以扩展其中的所有功能,为了方便大家了解如何扩展Goku,我这里花几分钟的时间演示如何去开发Goku的鉴权插件。

首先来了解一下goku网关执行的流程,客户端发送请求给网关,当路由模块匹配成功后,会将请求下发到服务模块,在这个过程中如果配置了鉴权模块,则会先进行身份认证,符合条件的请求才会最终下发到负载均衡模块,配合服务发现,最终转发到后端服务。


在流程图中,蓝色部分是我们网关的功能模块,也可以理解为是网关执行过程中的各个阶段,灰色部分便是我们功能模块的具体功能实现,比如在路由模块中可以同时实现http、tcp等多种协议的匹配。

在Goku中,我们定义了几个基本概念:

首先是Profession,可以理解为功能模块,比如路由模块,鉴权模块,负载模块,服务模块等,不同的Profession负责不同的工作职责。

其次是Driver,可以理解为功能模块内的不同的功能,比如对于鉴权模块来说,里面包含了APIKey、Basic Auth、JWT等不同的Driver。他们都是执行鉴权的工作,但是各自的鉴权方式不同。

然后是Worker,可以理解为某个具体功能的配置信息,为运行时的配置更新器,其定义了当配置更改时,如何去对缓存进行操作



了解了这三个基本概念之后,我们就可以很快地开发一个新的插件,开发的基本流程如下:

  1. 我们需要先定义好插件的配置格式,比如xxxx
  2. 我们需要实现IWorker接口,当配置发生改变时,网关将会调用IWorker的相关方法进行更新同步,比如xxxx
  3. 我们实现Driver接口,该接口主要用于创建IWorker对象,比如xxxx
  4. 实现Factory接口,用于创建IDriver对象,比如xxxx
  5. 而此时的Factory对象,则是我们apikey驱动的入口,比如xxxx

目前我们设计了两种驱动加载的模式,一种是将驱动编译进原程序中,这样最终编译出来的是一个完整的网关程序。另外一种是将渠道单独编译成.so扩展文件,由网关节点加载.so文件。

关于插件的具体开发方式,大家可以访问我们的帮助文档来了解,如果在开发过程中遇到疑问,可以随时在我们的QQ群或者slack群内提问,我们会及时解答。