除了 APISIX 官方内置的插件之外,我们也可以根据自己的需求去自定义插件,要自定义插件需要使用到 APISIX 提供的 Runner,目前已经支持 Java、Go 和 Python 语言的 Runner,这个 Runner 相当于是 APISIX 和自定义插件之间的桥梁,比如 apache-apisix-python-runner
这个项目通过 Python Runner 可以把 Python 直接应用到 APISIX 的插件开发中,整体架构如下所示:
其中的 Plugin Runner
就是各语言的插件运行器,当配置 Plugin Runner 后,APISIX 会启动一个子进程运行 Plugin Runner,该子进程与 APISIX 进程属于同一个用户,当我们重启或重新加载 APISIX 时,Plugin Runner 也将被重启。
如果你为一个给定的路由配置了 ext-plugin-*
插件,请求命中该路由时将触发 APISIX 通过 Unix Socket
向 Plugin Runner 发起 RPC 调用。调用分为两个阶段:
-
ext-plugin-pre-req
:在执行 APISIX 内置插件之前 -
ext-plugin-post-req
:在执行 APISIX 内置插件之后
接下来我们就以 Python 为例来说明如何自定义插件,首先获取 apache-apisix-python-runner
项目:
➜ git clone https://github.com/apache/apisix-python-plugin-runner.git
➜ cd apisix-python-plugin-runner
➜ git checkout 0.1.0 # 切换刀0.1.0版本
如果是开发模式,则我们可以直接使用下面的命令启动 Python Runner:
➜ APISIX_LISTEN_ADDRESS=unix:/tmp/runner.sock python3 apisix/main.py start
启动后需要在 APISIX 配置文件中新增外部插件配置,如下所示:
➜ vim /path/to/apisix/conf/config.yaml
apisix:
admin_key:
- name: "admin"
key: edd1c9f034335f136f87