apisix~lua插件开发与插件注册
开发插件的步骤
在APISIX中,要自定义插件,一般需要按照以下步骤进行操作:
编写Lua脚本:首先,你需要编写Lua脚本来实现你想要的功能。可以根据APISIX提供的插件开发文档和示例进行编写。
将Lua脚本放置到APISIX插件目录:将编写好的Lua脚本文件放置到APISIX的插件目录下,一般是
/usr/local/apisix/lua-plugins/目录。编辑配置文件:修改APISIX的配置文件,启用自定义插件。在
conf/config.yaml文件中添加对应的插件配置,指定使用你编写的Lua脚本。重启APISIX服务:完成以上步骤后,记得重启APISIX服务使配置生效,可以使用命令
apisix restart来重启APISIX。测试插件:在完成上述步骤后,你就可以通过发送请求测试你自定义的插件是否按照预期工作了。
总的来说,自定义插件的过程主要包括编写Lua脚本、放置到插件目录、编辑配置文件、重启APISIX服务以及测试插件。详细的开发步骤和示例可以参考APISIX官方文档。
部署到k8s
如果你使用Helm将APISIX部署到Kubernetes中,并且想要添加自定义插件,可以按照以下步骤进行操作:
编写Lua脚本:首先,按照之前提到的步骤编写Lua脚本,实现你需要的功能。
创建ConfigMap:将编写好的Lua脚本内容放入一个ConfigMap中,可以使用如下命令创建一个ConfigMap:
kubectl create configmap my-custom-plugin --from-file=my_plugin.lua
修改Helm Chart模板:编辑APISIX的Helm Chart模板,找到对应的配置文件(一般是
values.yaml或者configmap.yaml),在其中添加对应的ConfigMap配置,指定使用你的Lua脚本。升级APISIX部署:通过Helm命令升级APISIX的部署,使新的ConfigMap生效:
helm -n apisix upgrade apisix -f ./apisix/values.override.yaml ./apisix
- 验证插件:升级完成后,可以发送请求测试你自定义的插件是否按照预期工作了。
通过以上步骤,你就可以在使用Helm部署的APISIX中添加自定义插件。记得根据实际情况修改对应的文件路径和配置项,确保插件能够成功加载并发挥作用。
对dash board可见自定义插件
1 配置中添加插件
只有添加到配置文件中的插件才可以被apisix使用。在apisix 的conf 目录的config.yaml 中有个plugins字段,将示例插件的插件名"insert-header"添加到该字段下。
2 装载插件
需要对apisix 进行reload。直接运行 apisix reload 就可以装载插件
3 dashboard中添加插件
虽然apisix 提供了管理接口可以通过接口的方式给路由添加插件,但使用dashboard 操作会方便很多。
1、重新生成schema.json.
curl 127.0.0.1:9092/v1/schema > /usr/local/apisix/dashboard/conf/schema.json
2、重启dashboard
kill -9
(ps -ef|grep "/usr/local/apisix/dashboard"|gawk '
OpenResty
OpenResty阶段
在OpenResty中,阶段(phase)指的是请求处理过程中的不同阶段或环节。OpenResty基于Nginx并使用Lua语言进行扩展,通过定义不同的阶段可以在请求处理过程中插入自定义的Lua代码来实现各种功能。
在OpenResty中,请求经过一系列预定义的处理阶段,每个阶段都有对应的处理函数,开发者可以在这些阶段中编写Lua代码来实现各种功能,例如请求重写、访问控制、日志记录等。这些阶段可以被称为请求生命周期中的钩子点,允许开发者在特定的时机执行自定义逻辑。
常见的OpenResty阶段包括:
init_by_lua:在Nginx启动时执行,用于初始化Lua代码。init_worker_by_lua:在Worker进程启动时执行,用于初始化Lua代码。ssl_certificate_by_lua:用于SSL证书处理。rewrite_by_lua:用于请求重写。access_by_lua:用于访问控制。content_by_lua:用于生成响应内容。header_filter_by_lua:用于处理响应头。body_filter_by_lua:用于处理响应体。
通过在不同阶段插入Lua代码,开发者可以实现高度定制化的请求处理逻辑,从而满足各种需求,如API网关、反向代理、缓存控制等。因此,OpenResty的阶段机制提供了灵活且强大的扩展能力,使得开发者能够更好地控制请求处理流程。
相关处理器方法
在APISIX中,这些_M开头的方法是OpenResty的阶段处理器,用于对请求或响应进行处理。下面是它们各自的作用:
_M.check_schema**:用于定义插件配置的校验规则,可以确保插件配置符合预期的格式和类型。通过定义校验规则,可以在配置插件时进行参数检查,避免配置错误导致的问题。_M.header_filter:用于处理响应头,在API响应返回给客户端之前执行。_M.new:用于创建新的请求或响应对象,可以在此阶段对请求或响应进行初始化操作。_M.incoming:用于处理请求体,在请求被路由到后端服务之前执行。_M.access:用于访问控制,可以在此阶段进行权限验证、IP过滤等操作。_M.rewrite:用于重写请求,可以在此阶段修改请求的URI、参数等信息。_M.api()**:用于注册插件的API接口,使得插件可以通过API方式被外部调用。通过定义API接口,可以让插件暴露特定的功能给用户使用,实现更加灵活的插件扩展和定制
除了上述提到的预置方法外,APISIX还提供了其他一些预置的方法,例如:_M.balancer:用于负载均衡,可以在此阶段选择合适的后端节点进行请求转发。_M.init_worker:用于初始化Worker进程,在启动时执行一次,通常用于加载配置、初始化数据等操作。_M.log:用于日志记录,可以在此阶段记录请求、响应信息到日志系统。
总结来说,APISIX通过这些预置的方法(阶段处理器)提供了丰富的扩展点,开发者可以根据需求在不同阶段对请求和响应进行定制化处理,实现灵活的API网关功能。
一个完整的插件demo
- 向响应头输出X-Custom-Header头
-- 定义一个 Lua 函数,用于处理请求
local core = require("apisix.core")
local ngx = ngx
local ngx_encode_base64 = ngx.encode_base64
local ngx_decode_base64 = ngx.decode_base64
local ngx_time = ngx.time
local schema={} -- 注意,需要先定义它,再使用它
local _M={
version=0.1,
priority=1011,
name = "lind-test",
schema=schema
}
function _M.access(api_ctx)
core.log.warn("hit access phase")
end
function _M.header_filter(ctx)
core.log.warn("hit header_filter phase") -- 在apisix控制台打印日志
core.response.add_header("X-Custom-Header", "apisix-3.9.1")
end
function _M.body_filter(ctx)
core.log.warn("hit body_filter phase")
end
function _M.log(ctx)
core.log.warn("hit log phase")
end
-- 注册插件
return _M
注册插件
values.yaml
- 找到plugins节点,将现有的config-default.xml中的默认插件添加,避免自定义插件覆盖默认插件的情况
- 默认插件列表获取方式:http://127.0.0.1:9180/apisix/admin/plugins/list
9180是apisix-admin的容器端口
plugins: ["real-ip","ai","client-control","proxy-control","request-id","zipkin","ext-plugin-pre-req","fault-injection","mocking","serverless-pre-function","cors","ip-restriction","ua-restriction","referer-restriction","csrf","uri-blocker","request-validation","chaitin-waf","multi-auth","openid-connect","cas-auth","authz-casbin","authz-casdoor","wolf-rbac","ldap-auth","hmac-auth","basic-auth","jwt-auth","jwe-decrypt","key-auth","consumer-restriction","forward-auth","opa","authz-keycloak","proxy-cache","body-transformer","proxy-mirror","proxy-rewrite","workflow","api-breaker","limit-conn","limit-count","limit-req","gzip","server-info","traffic-split","redirect","response-rewrite","degraphql","kafka-proxy","grpc-transcode","grpc-web","public-api","prometheus","datadog","loki-logger","elasticsearch-logger","echo","loggly","http-logger","splunk-hec-logging","skywalking-logger","google-cloud-logging","sls-logger","tcp-logger","kafka-logger","rocketmq-logger","syslog","udp-logger","file-logger","clickhouse-logger","tencent-cloud-cls","inspect","example-plugin","aws-lambda","azure-functions","openwhisk","openfunction","serverless-post-function","ext-plugin-post-req","ext-plugin-post-resp"]
values.override.yaml
- 添加自定义插件
- 通过ConfigMap的方式将插件内容放到配置文件中
apisix:
admin:
type: NodePort
nodePort: 30087
customPlugins:
enabled: true
luaPath: "/opt/?.lua"
plugins:
- name: "lind-test"
configMap:
name: "my-plugins-config"
mounts:
- key: "lind-test.lua"
path: "/opt/apisix/plugins/lind-test.lua" #相当于把my-plugins-config下的lind-test.lua这个key,映射到容器下面/opts/custom_plugins目录,apisix/plugins是相对目录(是固定的),文件名还是lind-test.lua
向route添加自定义插件
- 目前在dashborad中无法看到自定义插件
- 在/apisix/admin/plugins/list中可以看到插件
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"methods": ["GET"],
"uri": "/test",
"id": 1,
"plugins": {
"lind-test": {
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'
访问页面
- http://apisix-gateway/test
- 将test前缀的请求,转发到
upstream,真实地址是127.0.0.1的1980端口指向的服务 - 在浏览器的响应头中,看到由
lind-test插件添加的标识X-Custom-Header
apisix~lua插件开发与插件注册的更多相关文章
- 详解 APISIX Lua 动态调试插件 inspect
作者罗锦华,API7.ai 技术专家/技术工程师,开源项目 pgcat,lua-resty-ffi,lua-resty-inspect 的作者. 原文链接 为什么需要 Lua 动态调试插件? Apac ...
- WebAssembly 助力云原生:APISIX 如何借助 Wasm 插件实现扩展功能?
本文将介绍 Wasm,以及 Apache APISIX 如何实现 Wasm 功能. 作者朱欣欣,API7.ai 技术工程师 原文链接 什么是 Wasm Wasm 是 WebAssembly 的缩写.W ...
- Lua编写wireshark插件初探——解析Websocket上的MQTT协议
一.背景 最近在做物联网流量分析时发现, App在使用MQTT协议时往往通过SSL+WebSocket+MQTT这种方式与服务器通信,在使用SSL中间人截获数据后,Wireshark不能自动解析出MQ ...
- 【eclipse插件开发实战】Eclipse插件开发4——插件JDE、PDE开发方式及plugin.xml配置文件结构
Eclipse插件开发4--插件JDE.PDE开发方式及plugin.xml配置文件结构 开发方式分为:java开发环境JDE开发插件的方式和插件开发环境PDE开发插件方式. 插件通过添加到预定义的扩 ...
- Dynamics CRM 本地插件注册器连CRMAn unsecured or incorrectly secured fault was received from the other party
今天遇到个问题,在本地打开插件注册器连接到远程CRM服务器时报如下问题 但我在CRM服务器上连接注册器是可以打开的,所以不存在账号权限这类的问题了(当然我用的是超管的账号也不可能存在),最后查询得知是 ...
- Dynamics CRM2013 6.1.1.1143版本插件注册器的一个bug
最近在做的项目客户用的是CRM2013sp1版本,所以插件注册器使用的也是与之对应的6.1.1.1143,悲剧的事情也因此而开始. 在插件中注册step时,工具里有个run in user's con ...
- Dynamics CRM 插件注册时报Assembly must be registered in isolation的解决方法
在插件注册的时候经常会遇到"Assembly must be registered in isolation"的问题导致无法注册,之前经常会被同事或者朋友问到这个问题,遇到这个问题 ...
- Dynamics CRM2013/2015 插件注册工具登录后无法显示assembly列表问题的解决办法二
本篇接前面的一篇博文:http://blog.csdn.net/vic0228/article/details/47079717,前篇提供了一种解决方案,将本机系统的语言切换成英文即可,今天再来介绍第 ...
- 【eclipse插件开发实战】Eclipse插件开发7——插件发布jar包
Eclipse插件开发7--插件发布jar包 最省事的方式就是直接导出jar包,然后放到eclipse的plugins目录下,重启eclipse即可. step1: 对需要打包的插件工程右击→导出(E ...
- Dynamics Crm Plugin插件注册的问题及解决方案(持续更新。。。。。。)
1.注册插件的时候回遇到如下提示 Plug-in assembly does not contain the required types or assembly content cannot be ...
随机推荐
- C 多维数组、特殊字符和字符串函数详解
C 多维数组 数组,也称为单维数组.这些非常棒,是您在 C 语言编程中会经常使用的东西.然而,如果您想要将数据存储为表格形式,例如带有行和列的表格,则需要熟悉多维数组. 二维数组 二维数组也称为矩阵, ...
- Health Kit接入资质要求详解,开发不迷路!
开发运动/健康应用过程中,需要使用Health Kit提供的数据能力,作为独立的个人开发者或是企业开发者,接入时分别需要满足什么样的条件呢? 个人开发者接入资质审核要求 •个人开发者应用需上架至华为应 ...
- 一图读懂HUAWEI HiAI Foundation
作为华为端侧AI的创新开放平台,HMS Core的HUAWEI HiAI Foundation开放AI算力,助力AI应用高效开发,同时联合多领域打造AI生态,实现日调用600亿次的突破,助力AI生态繁 ...
- 【FAQ】用户访问次数不变,访问时长却突增2倍,分析服务发生数据异常该如何解决?
在产品运营的工作过程中,需要每日关注产品的核心指标变化情况,监控其整体运营状况.华为分析服务提供查看吸引新用户卡片,该卡片展示了新增用户数.人均会话次数.人均访问时长.人均页面访问数.借助该页面运营可 ...
- openGauss数据与PostgreSQL的差异对比
openGauss 数据与 PostgreSQL 的差异对比 前言 openGauss 数据库已经发布 2.0.1 版本了,中启乘数科技是一家专业的专注于极致性能的数据库服务提供商,所以也关注 ope ...
- Sample上新,从API 8开始支持!速来拿走
原文:https://mp.weixin.qq.com/s/TxUOSXySZRwQaECenxt-Og ,点击链接查看更多技术内容. 搭载API 8的新SDK已经发布.围绕着新SDK,官方贴心地输出 ...
- Perm 排列计数——Lucas&dfs
思路:这道题给出的公式看明白后即可得出正解,我们可以把他想象成一颗二叉树,任意一个点的任意一个子孙一直除以2后最终都会到达一终点,终点则为以该点为根的子树的最小值. so--我们可以将根节点作为最后终 ...
- CTR预估系列模型漫谈
FM FM的主要内容 了解fm模型之前,需要先说一下lr带入一下场景.lr作为早期ctr预估里面的模型,其速度上有着无可比拟的优势,而偏偏ctr场景下伴随着有大量的离散特征,高维稀疏特征,这个很适合l ...
- Telnet qsnctfwp
Windows 安装 Telnet 在控制面板的程序和功能中选择打开或关闭Windows功能 启用 Telnet 客户端并单击确认退出 启动终端,输入命令 telnet 打开 Telnet 客户端 在 ...
- MMDeploy部署实战系列【第三章】:MMdeploy pytorch模型转换onnx,tensorrt
MMDeploy部署实战系列[第三章]:MMdeploy pytorch模型转换onnx,tensorrt 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善.如果有那个地方没看懂,评论区问就 ...