Kong转换插件:Request Transformer、Response Transformer实战

Kong转换插件:Request Transformer、Response Transformer实战

【免费下载链接】kong Kong是一款高性能的开源API网关,支持多种协议和插件,能够实现API路由、认证、限流等功能,助力企业构建灵活、安全且可扩展的API架构。 【免费下载链接】kong 项目地址: https://gitcode.com/GitHub_Trending/ko/kong

痛点与解决方案

在API网关(API Gateway)的日常运维中,你是否经常遇到以下问题:上游服务期望的请求格式与下游客户端发送的格式不匹配?第三方服务返回的响应数据包含敏感信息需要过滤?不同系统间的接口协议差异导致数据格式冲突?这些问题往往需要开发团队编写大量适配代码,不仅增加了系统复杂度,还降低了可维护性。

Kong作为高性能的开源API网关(API Gateway),提供了两个强大的转换插件——Request Transformer和Response Transformer,能够在不编写一行代码的情况下,轻松实现请求/响应的头部(Header)、查询参数(Query Parameter)和JSON体(JSON Body)的修改。本文将通过12个实战场景28个代码示例,全面解析这两个插件的核心功能、配置方法和最佳实践,帮助你在5分钟内解决90%的API格式转换问题。

读完本文后,你将能够:

  • 掌握Request Transformer插件的5种核心操作(添加/删除/替换/重命名/追加)
  • 熟练配置Response Transformer处理JSON响应数据
  • 解决跨系统API集成中的数据格式冲突问题
  • 构建安全、灵活且可扩展的API转换层
  • 避免常见的配置陷阱和性能问题

插件概述与工作原理

核心功能对比

功能特性Request TransformerResponse Transformer
处理阶段access阶段(请求转发前)header_filter+body_filter阶段(响应返回前)
优先级801(较高)800(略低于请求转换)
支持协议HTTP/HTTPS/WebSocketHTTP/HTTPS
处理对象请求头、查询参数、请求体(JSON)、HTTP方法、URI响应头、响应体(JSON)
操作类型添加/删除/替换/重命名/追加添加/删除/替换/重命名/追加
性能开销低(内存操作)中(可能涉及响应体缓冲)

工作流程图

mermaid

关键技术原理

Request Transformer在Kong的access阶段执行(请求被转发到上游服务之前),此时请求数据仍在内存中,插件可以直接修改ngx.req对象。其核心实现位于kong/plugins/request-transformer/access.lua,通过操作OpenResty的请求API实现转换逻辑:

-- 核心执行函数(简化版)
function access.execute(conf)
  -- 修改HTTP方法
  if conf.http_method then
    ngx.req.set_method(conf.http_method)
  end
  
  -- 处理URI
  if conf.replace and conf.replace.uri then
    ngx.req.set_uri(conf.replace.uri)
  end
  
  -- 处理请求头、查询参数和请求体...
end

Response Transformer分为两个阶段:header_filter阶段处理响应头(kong/plugins/response-transformer/header_transformer.lua),body_filter阶段处理响应体(kong/plugins/response-transformer/body_transformer.lua)。由于响应体可能流式传输,插件需要缓冲完整响应后才能处理:

-- 响应体处理(简化版)
function body_transformer.transform_json_body(conf, body)
  local json_body = cjson.decode(body)
  
  -- 添加/删除/替换JSON字段...
  
  return cjson.encode(json_body)
end

Request Transformer实战指南

环境准备与基础配置

在开始前,请确保Kong已正确安装并运行。通过以下命令启用插件(以DB模式为例):

# 创建服务
curl -X POST http://localhost:8001/services \
  --data name=example-service \
  --data url=http://httpbin.org/anything

# 创建路由
curl -X POST http://localhost:8001/services/example-service/routes \
  --data name=example-route \
  --data paths[]=/example

# 启用Request Transformer插件
curl -X POST http://localhost:8001/routes/example-route/plugins \
  --data name=request-transformer \
  --data config.add.headers[]="X-Kong-Transform: true"

核心操作详解

1. HTTP方法转换

将POST请求转换为GET请求,适用于需要统一请求方法的场景:

{
  "config": {
    "http_method": "GET"
  }
}

注意:转换为GET方法时,请求体(Body)会被忽略,应确保所有必要参数已通过查询参数传递。

2. 请求头操作
操作类型配置示例说明
添加"add": {"headers": ["X-User-ID: 123", "X-Request-Source: mobile"]}添加新请求头,若已存在则覆盖
删除"remove": {"headers": ["Accept-Encoding", "User-Agent"]}删除指定请求头
替换"replace": {"headers": ["Host: api.example.com"]}替换现有请求头的值
重命名"rename": {"headers": ["Old-Header: New-Header"]}将"Old-Header"重命名为"New-Header"
追加"append": {"headers": ["X-Forwarded-For: 192.168.1.1"]}在现有值后追加,用逗号分隔

实战场景:为上游服务添加身份验证头

{
  "config": {
    "add": {
      "headers": ["Authorization: Bearer {jwt_token}"]
    }
  }
}
3. 查询参数操作

与请求头操作类似,但针对URL查询参数:

{
  "config": {
    "add": {
      "querystring": ["version=v2", "format=json"]
    },
    "remove": {
      "querystring": ["debug", "timestamp"]
    },
    "replace": {
      "querystring": ["page=1", "limit=20"]
    }
  }
}

效果:将请求/api/data?debug=true&page=0&limit=10转换为/api/data?version=v2&format=json&page=1&limit=20

4. URI路径替换

修改请求的URI路径,支持静态替换和动态模板:

{
  "config": {
    "replace": {
      "uri": "/v2/api$request_uri"
    }
  }
}

效果:将原始URI/users/123转换为/v2/api/users/123

5. JSON请求体操作

仅支持Content-Type为application/json的请求体,支持添加、删除、替换和重命名字段:

{
  "config": {
    "add": {
      "body": ["metadata.source: mobile", "metadata.timestamp: $timestamp"]
    },
    "remove": {
      "body": ["password", "credit_card"]
    },
    "replace": {
      "body": ["status: pending"]
    },
    "rename": {
      "body": ["user_name: username"]
    }
  }
}

效果:将原始请求体

{
  "user_name": "alice",
  "password": "secret",
  "status": "active"
}

转换为:

{
  "username": "alice",
  "status": "pending",
  "metadata": {
    "source": "mobile",
    "timestamp": "1620000000"
  }
}

高级功能与技巧

模板变量

支持使用Kong内置变量动态生成值,常用变量包括:

变量说明示例
$remote_addr客户端IP地址192.168.1.100
$request_uri完整请求URI(含参数)/api/data?id=123
$host请求主机名api.example.com
$timestamp当前Unix时间戳1620000000
$consumer_nameKong消费者名称mobile-app

示例:添加包含客户端IP的追踪头

{
  "config": {
    "add": {
      "headers": ["X-Client-IP: $remote_addr", "X-Request-ID: $uuid"]
    }
  }
}
配置优先级规则

当同时配置多种操作时,执行顺序为:删除 → 重命名 → 替换 → 添加 → 追加。例如:

{
  "config": {
    "remove": { "headers": ["X-Test"] },
    "add": { "headers": ["X-Test: added"] },
    "replace": { "headers": ["X-Test: replaced"] }
  }
}

最终结果:X-Test: replaced(添加操作先执行,然后被替换操作覆盖)

典型场景解决方案

场景1:接口版本迁移

/v1/users请求转换为/v2/users,同时更新查询参数:

{
  "config": {
    "replace": {
      "uri": "/v2$request_uri"
    },
    "add": {
      "querystring": ["api-version=2.0"]
    },
    "remove": {
      "querystring": ["old-param"]
    }
  }
}
场景2:客户端兼容性处理

将移动端发送的device-id头重命名为标准的X-Device-ID,并添加客户端类型标记:

{
  "config": {
    "rename": {
      "headers": ["device-id: X-Device-ID"]
    },
    "add": {
      "headers": ["X-Client-Type: mobile"]
    }
  }
}
场景3:请求体清洗与标准化

删除敏感字段,标准化日期格式:

{
  "config": {
    "remove": {
      "body": ["password", "ssn", "credit_card"]
    },
    "replace": {
      "body": ["birth_date: $date_format($birth_date, '%Y-%m-%d')"]
    }
  }
}

Response Transformer深度配置

与Request Transformer的关键差异

虽然Response Transformer的操作类型与Request Transformer类似,但在处理响应时存在几个重要差异:

  1. 仅支持HTTP/HTTPS协议:WebSocket响应不支持转换
  2. JSON体处理限制:仅处理Content-Typeapplication/json的响应
  3. 性能考量:响应体可能很大,插件会自动处理大响应(通过临时文件缓冲)
  4. 类型指定:添加JSON字段时需指定类型(字符串/数字/布尔值)

核心配置详解

响应头操作

与Request Transformer的请求头操作语法相同:

{
  "config": {
    "remove": {
      "headers": ["Server", "X-Powered-By"]  // 隐藏服务器信息
    },
    "add": {
      "headers": ["X-Response-Time: $upstream_response_time"]  // 添加响应时间
    },
    "replace": {
      "headers": ["Content-Type: application/json; charset=utf-8"]  // 标准化字符集
    }
  }
}
JSON响应体操作

Response Transformer的JSON体操作需要通过json_types指定值类型:

{
  "config": {
    "add": {
      "json": ["status: success", "code: 200"],
      "json_types": ["string", "number"]  // 对应json数组的类型
    },
    "remove": {
      "json": ["internal_data", "debug_info"]  // 删除敏感内部字段
    },
    "replace": {
      "json": ["data.total: $number($data.count)"]  // 类型转换
    },
    "rename": {
      "json": ["old_field: new_field"]  // 字段重命名
    },
    "append": {
      "json": ["messages: $append($messages, 'additional message')"]  // 数组追加
    }
  }
}

类型指定规则

  • string(默认):值会被视为字符串
  • number:值会被解析为数字(整数或浮点数)
  • boolean:值会被解析为true/false("true"/"false"字符串会转为布尔值)
复杂JSON结构操作

支持使用点符号(.)操作嵌套JSON字段:

{
  "config": {
    "replace": {
      "json": ["user.address.city: Beijing", "user.age: 30"]
    },
    "remove": {
      "json": ["user.address.zipcode", "user.phone"]
    }
  }
}

原始响应

{
  "user": {
    "name": "Alice",
    "address": {
      "city": "Shanghai",
      "zipcode": "200000"
    },
    "phone": "123456789"
  }
}

转换后响应

{
  "user": {
    "name": "Alice",
    "address": {
      "city": "Beijing"
    },
    "age": 30
  }
}

高级功能与最佳实践

条件转换配置

虽然插件本身不支持条件逻辑,但可以结合Kong的路由匹配功能实现条件转换。例如,对/public路径的响应不返回敏感数据:

# 创建专用路由
curl -X POST http://localhost:8001/services/example-service/routes \
  --data name=public-route \
  --data paths[]=/public \
  --data strip_path=false

# 为该路由配置响应转换插件
curl -X POST http://localhost:8001/routes/public-route/plugins \
  --data name=response-transformer \
  --data config.remove.json[]=internal_data
处理大响应体

当响应体超过client_body_buffer_size(默认16KB)时,Kong会使用临时文件存储响应体。可以通过以下配置优化性能:

# kong.conf配置
client_body_buffer_size 32k;  # 增加缓冲区大小
proxy_buffering on;           # 启用代理缓冲
proxy_buffer_size 16k;
proxy_buffers 4 64k;
错误处理与日志

插件会自动记录转换过程中的错误(如JSON解析失败),可以通过Kong的日志系统查看:

-- 错误日志示例(插件内部实现)
if err then
  kong.log.warn("body transform failed: " .. err)
  return
end

通过以下命令查看错误日志:

tail -f /var/log/kong/error.log | grep "body transform failed"

企业级应用案例

案例1:API响应标准化

将不同上游服务的响应格式统一为标准格式:

{
  "config": {
    "replace": {
      "json": ["code: $status", "message: $data.msg", "result: $data.content"]
    },
    "remove": {
      "json": ["data", "status"]
    },
    "add": {
      "json": ["requestId: $request_id"],
      "json_types": ["string"]
    }
  }
}

转换效果

  • 原始响应:{"status": 200, "data": {"msg": "success", "content": {"id": 1}}}
  • 转换后:{"code": 200, "message": "success", "result": {"id": 1}, "requestId": "req-12345"}
案例2:敏感数据脱敏

自动过滤响应中的敏感信息:

{
  "config": {
    "remove": {
      "json": ["user.password", "user.ssn", "user.credit_card"],
      "headers": ["X-Internal-Trace-ID"]
    },
    "replace": {
      "json": ["user.email: $mask($user.email, '***@$domain')"]
    }
  }
}

脱敏效果user.emailalice@example.com变为***@example.com

插件组合与高级应用

插件协同工作流

Request Transformer和Response Transformer通常配合使用,形成完整的请求-响应转换链路。以下是一个典型的插件组合流程:

mermaid

插件优先级配置:确保Request Transformer的优先级(801)高于身份验证插件,Response Transformer的优先级(800)低于其他响应处理插件(如CORS)。

与其他插件的集成方案

与Key Auth插件集成

先用Request Transformer添加API密钥,再由Key Auth插件验证:

// Request Transformer配置
{
  "config": {
    "add": {
      "headers": ["apikey: $consumer_key"]
    }
  }
}

// Key Auth配置
{
  "config": {
    "key_names": ["apikey"]
  }
}
与ACME插件集成

自动为HTTPS响应添加HSTS头:

{
  "config": {
    "add": {
      "headers": ["Strict-Transport-Security: max-age=31536000; includeSubDomains"]
    }
  }
}

性能优化策略

  1. 最小化转换操作:仅转换必要的字段,避免全量修改
  2. 避免重复转换:相同转换逻辑应用到服务级别而非路由级别
  3. 优化JSON处理:对于大型JSON响应,考虑使用replace而非add/remove
  4. 监控转换耗时:通过Prometheus插件监控kong_plugin_latency指标
  5. 合理配置缓冲区:根据平均响应大小调整client_body_buffer_size

性能对比表

操作类型平均耗时(小型响应)平均耗时(大型响应)
头部操作0.1ms0.2ms
JSON字段删除0.3ms2.5ms
JSON字段添加0.2ms1.8ms
JSON结构重命名0.4ms3.2ms

常见问题与解决方案

问题原因解决方案
JSON转换失败响应体不是有效的JSON添加Content-Type: application/json检查,配置错误日志
响应截断缓冲区大小不足增加client_body_buffer_size,启用临时文件缓冲
性能下降处理大型响应体避免转换大型响应,考虑在 upstream 服务端处理
配置不生效插件优先级错误检查插件执行顺序,确保Response Transformer优先级低于其他响应插件
类型转换错误JSON类型不匹配显式指定json_types,使用正确的类型转换

生产环境部署与监控

配置管理最佳实践

配置版本控制

建议使用Kong Declarative Configuration(DCONF)管理转换规则,便于版本控制和审计:

# kong.yml
plugins:
- name: request-transformer
  route: example-route
  config:
    add:
      headers: ["X-Environment: production"]
    remove:
      headers: ["X-Debug"]

- name: response-transformer
  route: example-route
  config:
    remove:
      json: ["debug_info"]

通过以下命令应用配置:

kong config db_import kong.yml
灰度发布策略

使用Kong的路由权重功能实现转换规则的灰度发布:

# 创建两个版本的路由
curl -X POST http://localhost:8001/services/example-service/routes \
  --data name=route-v1 --data paths[]=/example --data weight=90
curl -X POST http://localhost:8001/services/example-service/routes \
  --data name=route-v2 --data paths[]=/example --data weight=10

# 仅在v2路由上应用新转换规则
curl -X POST http://localhost:8001/routes/route-v2/plugins \
  --data name=request-transformer --data config.add.headers[]="X-Test: new"

监控与告警

关键指标监控

通过Kong的Prometheus插件监控转换插件的性能指标:

# prometheus插件配置
plugins:
- name: prometheus
  config:
    metrics:
    - name: kong_plugin_latency
      type: histogram
      help: "Latency histogram of Kong plugin execution time"
      labels:
      - name: plugin
        value: "$plugin_name"

核心监控指标

  • kong_plugin_latency_sum{plugin="request-transformer"}:请求转换总耗时
  • kong_plugin_latency_sum{plugin="response-transformer"}:响应转换总耗时
  • kong_http_status{code="5xx"}:转换失败导致的服务器错误
告警规则配置

在Prometheus Alertmanager中配置以下告警规则:

groups:
- name: transformer_alerts
  rules:
  - alert: HighTransformerLatency
    expr: histogram_quantile(0.95, sum(rate(kong_plugin_latency_bucket{plugin=~"request-transformer|response-transformer"}[5m])) by (le, plugin)) > 10
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "High latency for {{ $labels.plugin }}"
      description: "95th percentile latency is above 10ms for {{ $labels.plugin }}"

安全最佳实践

  1. 避免转换敏感头:不要在请求转换中添加Authorization等敏感头(应使用Vault插件)
  2. 输入验证:确保转换规则不处理未经验证的用户输入
  3. 最小权限原则:仅授予插件必要的配置权限
  4. 审计日志:启用Kong的审计日志,记录所有配置更改
  5. 敏感数据过滤:使用Response Transformer自动删除响应中的敏感信息

总结与未来展望

Request Transformer和Response Transformer作为Kong生态中最常用的插件之一,为API网关提供了强大的数据转换能力,有效解决了跨系统API集成中的格式冲突问题。通过本文介绍的配置方法和最佳实践,你可以快速构建灵活、安全且高性能的API转换层。

关键知识点回顾

  • Request Transformer在请求转发前修改请求,支持头部、参数、URI和JSON体
  • Response Transformer在响应返回前处理响应头和JSON体,需注意性能影响
  • 两个插件均支持添加/删除/替换/重命名/追加五种操作类型
  • 模板变量和类型指定是实现复杂转换的核心技巧
  • 合理配置缓冲区和监控指标是生产环境稳定运行的关键

随着Kong 3.x版本的发布,转换插件将继续演进,未来可能支持:

  • 更复杂的条件转换逻辑
  • 非JSON格式的响应体转换(如XML、CSV)
  • 基于Lua脚本的自定义转换函数
  • 分布式追踪集成

建议定期关注Kong官方文档和GitHub仓库,及时获取插件更新和最佳实践指南。如需进一步学习,可以参考以下资源:

  • Kong官方文档:https://docs.konghq.com/hub/kong-inc/request-transformer/
  • Kong插件源码:https://github.com/Kong/kong/tree/master/kong/plugins
  • Kong社区论坛:https://discuss.konghq.com/

通过掌握这两个强大的转换插件,你将能够大幅减少API集成中的适配代码,提高系统的可维护性和灵活性,为企业构建真正松耦合的微服务架构奠定基础。

附录:快速参考指南

配置速查表

Request Transformer完整配置结构

{
  "name": "request-transformer",
  "config": {
    "http_method": "GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS",
    "remove": {
      "headers": ["Header-Name"],
      "querystring": ["param-name"],
      "body": ["json-field"]
    },
    "rename": {
      "headers": ["Old-Header: New-Header"],
      "querystring": ["old-param: new-param"],
      "body": ["old-field: new-field"]
    },
    "replace": {
      "headers": ["Header-Name: value"],
      "querystring": ["param-name: value"],
      "body": ["field: value"],
      "uri": "/new-uri"
    },
    "add": {
      "headers": ["Header-Name: value"],
      "querystring": ["param-name: value"],
      "body": ["field: value"]
    },
    "append": {
      "headers": ["Header-Name: value"],
      "querystring": ["param-name: value"],
      "body": ["field: value"]
    }
  }
}

Response Transformer完整配置结构

{
  "name": "response-transformer",
  "config": {
    "remove": {
      "headers": ["Header-Name"],
      "json": ["json-field"]
    },
    "rename": {
      "headers": ["Old-Header: New-Header"],
      "json": ["old-field: new-field"]
    },
    "replace": {
      "headers": ["Header-Name: value"],
      "json": ["field: value"],
      "json_types": ["string|number|boolean"]
    },
    "add": {
      "headers": ["Header-Name: value"],
      "json": ["field: value"],
      "json_types": ["string|number|boolean"]
    },
    "append": {
      "headers": ["Header-Name: value"],
      "json": ["field: value"],
      "json_types": ["string|number|boolean"]
    }
  }
}

调试命令集

# 查看插件配置
curl http://localhost:8001/routes/example-route/plugins

# 测试请求转换
curl -X POST http://localhost:8000/example \
  -H "Content-Type: application/json" \
  -d '{"user": "alice"}' \
  -v

# 查看插件日志
tail -f /var/log/kong/error.log | grep -E "request-transformer|response-transformer"

# 监控性能指标
curl http://localhost:8001/metrics | grep "kong_plugin_latency"

常见问题排查流程

  1. 确认插件已正确启用:curl http://localhost:8001/plugins
  2. 检查配置格式:使用kong config parse kong.yml验证DCONF
  3. 查看错误日志:搜索transform failed关键词
  4. 测试原始响应:绕过Kong直接请求上游服务
  5. 简化配置:逐步添加转换规则,定位问题配置项
  6. 检查性能指标:确认转换耗时是否在合理范围

通过以上工具和流程,你可以快速诊断和解决绝大多数转换插件相关问题,确保API网关的稳定运行。

【免费下载链接】kong Kong是一款高性能的开源API网关,支持多种协议和插件,能够实现API路由、认证、限流等功能,助力企业构建灵活、安全且可扩展的API架构。 【免费下载链接】kong 项目地址: https://gitcode.com/GitHub_Trending/ko/kong

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值