使用lua开发apisix自定义插件并发布

接到老大需求:需要对cookie进行操作,遂查询apisix的自带插件,发现有,但不满足,于是自己开发了一个插件并部署,把开发部署流程写在这里打个日志怕以后忘掉。

一、需求

插件很简单,就是在request和response中打上自己的标记

二、编写插件

插件怎么编写,规范是什么我就不一一赘述了,点击这里查看官方文档,已经很详细。

把我写的也粘一下把:

local core = require("apisix.core")
local plugin_name = "cookie-plugin"

local schema = {
    type = "object",
    properties = {},
}

local _M = {
    version = 0.1,
    priority = 0, -- 设置插件优先级
    name = plugin_name,
    schema = schema,
}

function _M.check_schema(conf)
    return core.schema.check(schema, conf)
end

function _M.access(conf, ctx)
    -- 添加请求头
    core.request.set_header(ctx, "cookie-plugin", "success")
end

function _M.header_filter(conf, ctx)
    -- 添加响应头
    core.response.set_header("cookie-plugin", "success")
end

return _M

三、部署插件

最坑的就是怎么部署,官方有文档但看的一头雾水,详细介绍部署:
先介绍两概念Admin和Dashboard,Admin提供了API能力,Dashboard提供了可视化能力

3.1、放置lua脚本至插件文件夹下

把lua脚本改为你写的plugin_name,例如我上边写的就是cookie-pluginlua,然后放到Admin服务的plugins文件夹底下,一般在/usr/local/apisix/apisix/plugins/,直接放底下就行,当然也可以自己写路径指定,但你的config.yaml得自己指定路径,开头官方文档有介绍。

3.2、修改config.yaml文件

在config.yaml的plugins里加插件名

plugins:                         
  - cookie-plugin

这里除了这个,还需要把config-default.yaml里的插件挪过来,不然之后就你这个插件能用,官方插件就用不了了,最终效果:
在这里插入图片描述

3.2、刷新插件

当然可以apisix stop之后再apisix start启动,但有更优雅的方式,不需要重启可以热加载插件:

curl --location --request PUT 'http://自己的IP:端口/apisix/admin/plugins/reload' \
--header 'X-API-KEY: 你自己的key' 

这个时候apisix的插件已经可以用了,以刚才我们的插件为例,添加一个路由:

curl http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d '
{
    "uri": "/example",
    "plugins": {
        "cookie-plugin": {}
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "httpbin.org:80": 1
        }
    }
}'

请求:

 curl -i http://127.0.0.1:9080/example 

在这里插入图片描述
可以看到response中已有cookie-plugin: success,证明插件生效。

3.4、生成schema.json

这个schema.json是Dashboard提供可视化需要的文件,也就是现在说api已经可以使用了,但是如果你想在Dashboard配置是配置不了的,会报插件不存在,这时候是因为之前的schema.json对新插件没有描述,这个也不用自己写,查看官方文档
在这里插入图片描述

curl 127.0.0.1:9090/v1/schema > schema.json

3.5、替换schema.json

复制到Dashboard的config目录下替换就行,之后重启Dashboard服务就ok
在这里插入图片描述
好了这样一个apisix使用lua脚本自定义插件和部署就可以了

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当然可以! 下面是一个简单的例子,该插件可以将响应体中的所有字符转换为大写: ```lua local json = require "cjson" local _M = {} function _M.rewrite(response) local body = response.body if body then response.body = string.upper(body) end return response end return _M ``` 这个插件使用了 cjson 库来解析和修改 json 格式的响应体。安装cjson库可以使用luarocks 安装,在命令行输入: ``` luarocks install cjson ``` 这个插件的工作流程如下: 1. 通过 `response.body` 获取响应体 2. 调用 `string.upper` 函数将响应体中所有字符转换为大写 3. 使用 `response.body` 将修改后的响应体重新赋值 4. 最后返回修改后的 `response` 对象 需要注意的是,上面这个例子只能处理字符串类型的响应体,如果要处理其他类型的响应体,需要进行适当的修改。 最后需要将这个插件配置到Apisix中,在Apisix的配置文件中加入如下代码: ``` - plugin: response-body-upper config: {} ``` 完整示例可以参考Apisix文档. ### 回答2: 当然可以帮您编写一个用于转换响应体的 apisix 插件。下面是一个示例: ```lua local cjson = require("cjson.safe") local _M = {} function _M.transform_response_body(conf, ctx) -- 获取响应体内容 local response_body = ngx.arg[1] -- 进行响应体的转换操作 local transformed_body = cjson.decode(response_body) -- 修改转换后的响应体 transformed_body.new_property = "new_value" -- 将修改后的响应体序列化为 JSON 字符串 local new_response_body = cjson.encode(transformed_body) -- 修改响应体的长度 ngx.arg[2] = string.len(new_response_body) -- 更新响应体内容 ngx.arg[1] = new_response_body end return _M ``` 该示例中的 `transform_response_body` 函数将会被调用来转换响应体。您可以根据您的需求自定义该函数内的转换逻辑。在示例中,我们使用 `cjson` 模块来进行 JSON 格式的序列化和反序列化操作,将响应体转换为 Lua 表并进行修改,然后再序列化回 JSON 字符串以更新响应体内容。 请注意,使用以上代码仅仅可以作为您编写 apisix 插件的参考示例,具体实现还需要根据您的具体需求进行调整。希望这样的回答对您有所帮助。 ### 回答3: 以下是一个使用Lua编写的apisix插件,用于转换响应体: ```lua local BasePlugin = require("apisix.plugins.base") local plugin_name = "response-transform" local ResponseTransformHandler = BasePlugin:extend() ResponseTransformHandler.PRIORITY = 10 function ResponseTransformHandler:new() ResponseTransformHandler.super.new(self, plugin_name) end function ResponseTransformHandler:access(conf, ctx) ResponseTransformHandler.super.access(self) -- 检查是否需要转换响应体 if conf.transform_body == true then -- 获取原始响应体 local res_body = ngx.arg[1] -- 执行转换操作,这里可以根据需要进行自定义逻辑 local transformed_body = res_body:gsub("foo", "bar") -- 保存转换后的响应体 ngx.arg[1] = transformed_body end end return ResponseTransformHandler ``` 请注意,上述代码中的转换逻辑仅仅是简单的示范,您可以根据实际需求进行自定义转换操作。 要将此插件Apisix一起使用,您可以将该代码保存到`response_transform.lua`文件中,并将其放置在Apisix的插件目录中。然后在Apisix的配置文件中添加以下内容来启用插件: ```yaml plugins: - name: response-transform enable: true config: transform_body: true ``` 上述配置将在所有请求的响应体上执行转换操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值