ToB企服应用市场:ToB评测及商务社交产业平台

标题: apisix~lua插件开发与插件注册 [打印本页]

作者: 去皮卡多    时间: 2024-5-20 15:25
标题: apisix~lua插件开发与插件注册
开发插件的步调

在APISIX中,要自界说插件,一般需要按照以下步调进行操作:
总的来说,自界说插件的过程重要包罗编写Lua脚本、放置到插件目录、编辑配置文件、重启APISIX服务以及测试插件。详细的开发步调和示例可以参考APISIX官方文档。
摆设到k8s

如果你利用Helm将APISIX摆设到Kubernetes中,并且想要添加自界说插件,可以按照以下步调进行操作:
  1. 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阶段包罗:
通过在差异阶段插入Lua代码,开发者可以实现高度定制化的请求处置惩罚逻辑,从而满足各种需求,如API网关、反向代理、缓存控制等。因此,OpenResty的阶段机制提供了灵活且强大的扩展能力,使得开发者可以或许更好地控制请求处置惩罚流程。
相关处置惩罚器方法

在APISIX中,这些_M开头的方法是OpenResty的阶段处置惩罚器,用于对请求或响应进行处置惩罚。下面是它们各自的作用:
总结来说,APISIX通过这些预置的方法(阶段处置惩罚器)提供了丰富的扩展点,开发者可以根据需求在差异阶段对请求和响应进行定制化处置惩罚,实现灵活的API网关功能。
一个完备的插件demo

  1. -- 定义一个 Lua 函数,用于处理请求
  2. local core      = require("apisix.core")
  3. local ngx = ngx
  4. local ngx_encode_base64 = ngx.encode_base64
  5. local ngx_decode_base64 = ngx.decode_base64
  6. local ngx_time = ngx.time
  7. local schema={} -- 注意,需要先定义它,再使用它
  8. local _M={
  9.     version=0.1,
  10.     priority=1011,
  11.     name = "lind-test",
  12.     schema=schema
  13. }
  14. function _M.access(api_ctx)
  15.     core.log.warn("hit access phase")
  16. end
  17. function _M.header_filter(ctx)
  18.     core.log.warn("hit header_filter phase") -- 在apisix控制台打印日志
  19.     core.response.add_header("X-Custom-Header", "apisix-3.9.1")
  20. end
  21. function _M.body_filter(ctx)
  22.     core.log.warn("hit body_filter phase")
  23. end
  24. function _M.log(ctx)
  25.     core.log.warn("hit log phase")
  26. end
  27. -- 注册插件
  28. return _M
复制代码
注册插件

values.yaml

  1. 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

  1. apisix:
  2.   admin:
  3.     type: NodePort
  4.     nodePort: 30087
  5.   customPlugins:
  6.     enabled: true
  7.     luaPath: "/opt/?.lua"
  8.     plugins:
  9.       - name: "lind-test"
  10.         configMap:
  11.           name: "my-plugins-config"
  12.           mounts:
  13.             - key: "lind-test.lua"
  14.               path: "/opt/apisix/plugins/lind-test.lua" #相当于把my-plugins-config下的lind-test.lua这个key,映射到容器下面/opts/custom_plugins目录,apisix/plugins是相对目录(是固定的),文件名还是lind-test.lua
复制代码
向route添加自界说插件

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  2. {
  3.     "methods": ["GET"],
  4.     "uri": "/test",
  5.     "id": 1,
  6.     "plugins": {
  7.         "lind-test": {
  8.         }
  9.     },
  10.     "upstream": {
  11.         "type": "roundrobin",
  12.         "nodes": {
  13.             "127.0.0.1:1980": 1
  14.         }
  15.     }
  16. }'
复制代码
访问页面


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4