Kong 自定义 Plugin

    Kong 是一个可扩展的微服务和 API 网关,它使用 Lua 语言编写,同时允许开发者通过 Lua 脚本(插件)来扩展其功能。要在 Kong 中使用 Lua 脚本,你需要编写一个插件。以下是编写和使用 Kong 插件的基本步骤:

    1. 创建插件目录: 首先,在你的工作目录中,创建一个新的目录来存放插件代码。这个目录的名称通常与插件名称相同。例如:
    mkdir my-kong-plugin
    cd my-kong-plugin
    
    1. 编写插件代码: 在插件目录中,创建一个名为handler.lua的文件。这个文件将包含插件的主要逻辑。打开文件并编写以下基本结构:
    local MyKongPlugin = {
      PRIORITY = 1000, -- 插件优先级,数字越大,优先级越高
      VERSION = "0.1", -- 插件版本号
    }
    
    function MyKongPlugin:init_worker()
      -- 在 Kong 工作线程初始化时执行的代码
    end
    
    function MyKongPlugin:certificate(conf)
      -- 在 SSL/TLS 握手期间执行的代码
    end
    
    function MyKongPlugin:rewrite(conf)
      -- 在请求被代理之前,重写请求的代码
    end
    
    function MyKongPlugin:access(conf)
      -- 在代理请求到上游服务之前执行的代码
    end
    
    function MyKongPlugin:header_filter(conf)
      -- 在发送响应头部之前执行的代码
    end
    
    function MyKongPlugin:body_filter(conf)
      -- 在发送响应体之前执行的代码
    end
    
    function MyKongPlugin:log(conf)
      -- 在请求结束后执行的代码
    end
    
    return MyKongPlugin
    

    在这个文件中,你可以根据需求实现自己的逻辑。

    1. 创建插件的 schema.lua: 创建一个名为schema.lua的文件。这个文件用于定义插件的配置选项及其数据类型。例如:
    local typedefs = require "kong.db.schema.typedefs"
    
    return {
      name = "my-kong-plugin",
      fields = {
        { consumer = typedefs.no_consumer }, -- 如果插件不能应用于特定的消费者,则使用此选项
        { config = {
            type = "record",
            fields = {
              { my_option = { type = "string", default = "default_value" } },
            },
          },
        },
      },
    }
    
    1. 创建插件的 kong-plugin-my-plugin-VERSION.rockspec 文件: 在插件目录中创建一个名为 kong-plugin-my-plugin-0.1-1.rockspec 的文件,其中的 0.1-1 是插件的版本号。这个文件告诉 Kong 如何打包和安装插件。例如:
    package = "kong-plugin-my-plugin"
    version = "0.1-1"
    source = {
      url = "git://github.com/yourusername/my-kong-plugin.git",
      tag = "0.1",
    }
    description = { 
        summary = "A simple Kong plugin example",
        detailed = "This is a simple example of a Kong plugin.", 
        homepage = "[https://github.com/yourusername/my-kong-plugin](https://github.com/yourusername/my-kong-plugin)", license = "MIT", 
    }
    
    dependencies = { "lua >= 5.1", "kong >= 2.0", }
    
    build = { type = "builtin", modules = { \["kong.plugins.my-kong-plugin.handler"\] = "handler.lua", \["kong.plugins.my-kong-plugin.schema"\] = "schema.lua", }, install = { lua = { \["kong/plugins/my-kong-plugin/handler.lua"\] = "handler.lua", \["kong/plugins/my-kong-plugin/schema.lua"\] = "schema.lua", }, }, }
    
    1. 安装插件:
      在插件目录中运行以下命令,将插件安装到 Kong 的环境中:
    luarocks make
    
    1. 配置 Kong:
      打开你的 Kong 配置文件(kong.conf),在 plugins 配置项中添加你的插件名,如下所示:
    plugins = bundled,my-kong-plugin
    

    这将启用你的插件。如果你希望禁用所有插件并仅启用你的插件,请使用以下配置:

    plugins = my-kong-plugin
    
    1. 重启 Kong:
      重启 Kong 以使更改生效。你可以使用以下命令重启 Kong:
    kong restart
    
    1. 配置插件:
      现在,你可以为特定的服务、路由或消费者配置插件。以下是一个使用 curl 命令为服务配置插件的示例:
    curl -X POST [http://localhost:8001/services/{service-id}/plugins](http://localhost:8001/services/%7Bservice-id%7D/plugins)  
    \--data "name=my-kong-plugin"  
    \--data "config.my\_option=my\_value"
    

    替换 {service-id} 为你要应用插件的服务的 ID。

    现在你已经成功地使用 Lua 脚本编写了一个 Kong 插件并将其应用于服务。你可以根据需要修改 handler.lua 中的函数以实现自己的逻辑。

    评论栏