kong网关function 插件使用及路由匹配规则 | 客服服务营销数智化洞察_晓观点
       

kong网关function 插件使用及路由匹配规则

一、pre-plugins和post-plugins概念介绍

两个插件都可以在路由、service中进行配置

kong网关function 插件使用及路由匹配规则

pre-plugins:

表示在其他插件之前动态执行lua代码

post-plugins:

表示在其他插件之后动态执行lua代码

该lua代码无法执行一些不安全的操作

  • string.rep:可用于在一次操作中分配数百万字节
  • {set|get}metatable:可用于修改全局对象(字符串、数字)的元表
  • collectgarbage:可能被滥用来降低其他工人的绩效
  • _G:是可以访问所有函数的根节点它被临时表屏蔽
  • load{file|string}:因为它可以授予对全局环境的访问权限,因此被视为不安全
  • raw{get|set|equal}:由于沙盒依赖于某些元表操作,因此可能不安全
  • string.dump:可以显示服务器机密信息(例如功能的实现)
  • math.randomseed:可能会影响主机系统Kong Gateway 已经正确地为随机数生成器播种
  • 全部os.*(除os.clockos.difftime和 之外os.time)os.execute均可显著改变主机系统
  • io.*:提供对硬盘的访问
  • dofile|require:提供对硬盘的访问
  • 所有提供的模块(如stringtable)都是只读的,不能修改
  • 字节码执行被禁用
  • 指向kong.cache专用于 Serverless Functions 插件的缓存实例它不提供对全局 Kong Gateway 缓存的访问它仅公开方法无法使用或等get显式写入操作setinvalidate

二、常用的kong function脚本

下列脚本可放入pre-plugins或post-plugins中

设置转发路径、设置header头

在pre-plugins中的Access块中填入如下代码:

kong网关function 插件使用及路由匹配规则
return function()
  -- 获取请求地址
  local original_uri = kong.request.get_path()
  -- 将/test2前缀去除,此处使用正则匹配,“-”需要被 “%” 转义
  local new_uri = original_uri:gsub("^/test%-2/", "/")
  -- 设置新的URI
  kong.service.request.set_path(new_uri)
  kong.service.request.add_header("ThisIsAHeader", "ThisIsHeaderValue")
  -- 清除上一行设置的header头 "ThisIsAHeader"
  kong.service.request.clear_header("ThisIsAHeader")
end

在function中拆分字符串,在日志中获取debug输出

return function()
  -- 请求路由为: /test/route-1/
  local original_uri = kong.request.get_path()
  local result = {}
  local from = 1
  local delim_from, delim_to = string.find(original_uri, "/", from)
  while delim_from do
    table.insert(result, string.sub(original_uri, from, delim_from - 1))
    from = delim_to + 1
    delim_from, delim_to = string.find(original_uri, "/", from)
  end
  table.insert(result, string.sub(original_uri, from))
  local parts = result
  -- 下列语句的日志输出在/usr/local/kong/logs/的日志文件中可以看到
  ngx.log(ngx.ERR, "parts[3] is :  ", parts[3])
  if parts[3] == "sdk-jd" then
    kong.service.request.add_header("test-header", "test-headervalue")
    local new_uri = original_uri:gsub("^/test/route%-1/", "/")
    kong.service.request.set_path(new_uri)
  else
    kong.service.request.set_path("/path-unknown")
  end
end

遍历数组中的元素

-- 遍历数组中的元素
local fruits = {"Apple", "Banana", "Cherry"}
for i = 1, #fruits do
    print(fruits[i])
end

for循环

-- 使用for i模式
--   起始,次数,步长
for i =0, 10, 1 do
  print(i)
end

nil判断

local myVar = nil

if not myVar then
    print("myVar is nil or false")
else
    print("myVar has a value")
end

三、路由匹配规则(路径长度匹配低于正则匹配的优先级)

如果给定请求的规则数在两个路由AB相同,则将按照列出的顺序应用以下规则进行决胜。如果满足以下条件,A将优先选择路由B

  • A仅具有“普通”主机标头,并且B具有一个或多个“通配符”主机标头
  • A具有比更多的非主机标头B
  • A至少有一个“正则表达式”路径,并且B只有“普通”路径
  • A的最长路径比的B最长路径长
  • A.created_at < B.created_at
免费试用 更多热门智能应用                        
(0)
研发专家-Halk研发专家-Halk
上一篇 2024年12月21日
下一篇 2024年12月21日

相关推荐