通过 Higress Wasm 插件 3 倍性能实现 Spring-cloud-gateway 功能

作者:韦鑫,Higress Committer,来自南京航空航天大学分布式系统实验室

导读:本文将和大家一同回顾 Spring Cloud Gateway 是如何满足 HTTP 请求/响应转换需求场景的,并为大家介绍在这种场景下使用 Higress 云原生网关的解决方案,同时还对比了两者的性能差异。

SCG 修改请求/响应

在 Spring Cloud Gateway [ 1] (以下简称为 SCG) 中,当我们需要对 HTTP 请求或响应进行修改时,SCG 提供了许多内置的 GatewayFilter [ 2] 来满足我们对这种应用场景的需求,例如 AddRequestHeader,AddRequestParameter, DedupeResponseHeader,MapRequestHeader, ModifyRequestBody 等。

考虑以下简单用例:

  • 添加请求头部 X-First,值从请求路径中获取,例如从 /response-headers?testKey=testValue 中获取 “response-headers”;

  • 将请求头部 X-First 的值映射给 X-Second;

  • 添加请求查询参数 k1=v1;

  • 剔除重复的响应头部 X-Dedupe。

在 SCG 中使用 GatewayFilter 我们可以这样配置:

# application.yaml:spring:cloud:gateway:routes:- id: test_routeuri: lb://httpbin-svcpredicates:- Path=/{api}/**filters:- AddRequestHeader=X-First, {api}- MapRequestHeader=X-First, X-Second- AddRequestParameter=k1, v1- DedupeResponseHeader=X-Dedupe, RETAIN_FIRST

相信拥有 SCG 使用经验的同学对上述配置一定不陌生,那么本文将重点给出另一种能够**满足上述需求并且性能更加优越的解决方案——使用 Higress 云原生网关的 Transformer 插件。

Higress 插件与 SCG 性能比较

我们在同一吞吐量水平(QPS)上,开启/关闭 Higress Transformer 插件 [ 3] 和 SCG 相应 GatewayFilters,统计两者在 CPU 和内存资源上的开销。

经过测试 [ 13] ,我们得到的结论是:

  • 在 Higress 未启用 Transformer 插件,SCG 未启用 GatewayFilters 的条件下,SCG 的 CPU, 内存资源开销分别约为 Higress的 3.30, 4.88倍;
  • 在 Higress 启用 Transformer 插件,SCG 启用相应 GatewayFilters 的条件下,SCG 的 CPU,内存资源开销分别约为 Higress 的 2.98, 3.19倍。

图片

可见 Higress Transformer 相比于 SCG GatewayFilter 有着相当不错的性能表现!

接下来我们将进一步为大家介绍 Higress 云原生网关以及上述提到的 Higress Transformer 插件。

Higress 简介

Higress [ 4] 是基于阿里内部的 Envoy Gateway 实践沉淀、以开源 Istio + Envoy 为核心构建的下一代云原生网关,实现了流量网关+微服务网关+安全网关三合一的高集成能力,深度集成 Dubbo、Nacos、Sentinel 等微服务技术栈,能够帮助用户极大地降低网关的部署及运维成本且能力不打折;在标准上全面支持 Ingress 与 Gateway API,积极拥抱云原生下的标准 API 规范;同时,Higress Controller 也支持 Nginx Ingress 平滑迁移,帮助用户零成本快速迁移到 Higress。

Higress 提供了一套 Wasm (WebAssembly) SDK [ 5] ,使得开发者能够轻松使用 C++,Golang,Rust 开发 Wasm 插件增强网关能力。下面将为大家介绍 Higress Transformer 插件的基本功能,最后简单说明 Transformer 插件的核心代码逻辑。

图片

Transformer 插件介绍

Higress Transformer 插件可以对请求/响应头部、请求查询参数、请求/响应体参数进行转换,支持的转换操作类型包括删除(remove)、重命名(rename)、更新(replace)、添加(add)、追加(append)、映射(map)和去重(dedupe)。

接下来我们复现最开始提到的 SCG GatewayFilter 简单用例,来演示如何使用该插件(以下使用 Higress 控制台可以很方便地部署插件,当然也可以使用 K8s YAML Manifests 的方式 [ 12] ):

  1. 首先根据官方文档 [ 6] 快速安装 Higress,结果如下:
$ kubectl -n higress-system get deploy
NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
higress-console              1/1     1            1           1d
higress-console-grafana      1/1     1            1           1d
higress-console-prometheus   1/1     1            1           1d
higress-controller           1/1     1            1           1d
higress-gateway              1/1     1            1           1d
  1. 通过 Higress 控制台添加域名(foo.bar.com)、路由配置(foo),将流量转发至后端的 httpbin [ 7] 服务:

图片

图片

  1. 为 foo 路由添加 Transformer 插件(当前未推送插件至官方镜像仓库,可以先使用 docker.io/weixinx/transformer:v0.1.0,或到代码仓库自行构建):

图片

注:为了能够同时完成请求和响应转换的需求,我们需要为 foo 路由再添加一个 Transformer 插件,命名为 transformer-resp,用于处理响应方向。

  1. 添加 Transformer 配置并开启该插件:
  • 添加请求头部 X-First,值从请求路径中获取,例如从 /response-headers?testKey=testValue 中获取 “response-headers”;
  • 将请求头部 X-First 的值映射给 X-Second;
  • 添加请求查询参数 k1=v1;
  • 剔除重复的响应头部 X-Dedupe。
# transformer:
type: request  # 指定 Transformer 类型
rules:         # 指定转换规则
- operate: add # 指定转换操作类型headers:     # 指定头部转换规则- key: X-Firstvalue: $1  # 正则表达式捕获组 $1,支持 RE2 语法path_pattern: ^\/(\w+)[\?]{0,1}.*$querys:      # 指定查询参数转换规则- key: k1value: v1
- operate: mapheaders:- key: X-Firstvalue: X-Second
---
# transformer-resp:
type: response
rules:
- operate: dedupeheaders:- key: X-Dedupevalue: RETAIN_FIRST
  1. 发送请求进行测试:
# 验证请求方向转换
$ curl -v -H "host: foo.bar.com" "console.higress.io/get"
...
>
< HTTP/1.1 200 OK
...
<
{"args": {# 添加了查询参数 k1=v1"k1": "v1"},"headers": {..."X-First": "get", # 添加了请求头部 X-First,值 "get" 来自请求路径"X-Second": "get" # 映射了请求头部 X-Second},...# 添加了查询参数 k1=v1"url": "http://foo.bar.com/get?k1=v1"
}# 验证响应方向转换
$ curl -v -H "host: foo.bar.com" \
"console.higress.io/response-headers?X-Dedupe=1&X-Dedupe=2&X-Dedupe=3"
...
>
< HTTP/1.1 200 OK
< x-dedupe: 1 # 保留了响应头部 X-Dedupe 的第一个值
...
<
{...# 通过查询参数传给 httpbin 的自定义响应头部"X-Dedupe": ["1","2","3"],...
}

❗️需要注意的是:

  • 与上述例子相同,若有同时处理请求和响应转换的需求,则需要为相应路由添加两个 Transformer 插件,分别处理请求方向和响应方向(正在优化);
  • 请求体支持的 Content-Type 有:application/json,application/x-www-form-urlencoded,multipart/form-data;而响应体仅支持 application/json;
  • 更多说明详见插件文档 [ 3]

Transformer 逻辑

本节将简单说明 Higress Transformer 插件的核心代码逻辑,希望可以为有兴趣优化该插件或进行二次开发的同学提供一些帮助。

首先该插件代码位于Higress 仓库的 plugins/wasm-go/extensions/transformer 目录下,使用 Higress 提供的 Wasm SDK [ 5] 进行开发(关于如何开发 Wasm 插件详见官方文档 [ 8] )。

插件的配置模型 TransformerConfig:

# 模型以插件配置的形式暴露给用户
type TransformerConfig struct {typ   string          # Transformer 类型,[request, response]rules []TransformRule # 转换规则trans Transformer # Transformer 实例,不对用户暴露配置,用于实际的转换操作
}type TransformRule struct {operate string   # 转换操作类型headers []Param  # header 参数 querys  []Param  # query 参数body    []Param  # body 参数
}type Param struct {key         string # 表示字段的 keyvalue       string # 表示字段的 value 或 key (map) 或 strategy (dedupe)valueType   string # 为 application/json body 指定 value 的数据类型hostPattern string # host 正则匹配模式pathPattern string # path 正则匹配模式
}

其中 Transformer 作为接口分别有请求和响应两个实现(requestTransformer, responseTransformer),主要实现了 3 个接口方法 TransformHeaders,TransformerQuerys 和 TransformBody:

type Transformer interface {TransformHeaders(host, path string, hs map[string][]string) errorTransformQuerys(host, path string, qs map[string][]string) errorTransformBody(host, path string, body interface{}) error...
}var _ Transformer = (*requestTransformer)(nil)
var _ Transformer = (*responseTransformer)(nil)

由于头部(Headers)和查询参数(Querys)都是以 key-value 的形式存在,因此通过 kvHandler 对两者采用统一的处理逻辑;而 Body 由于请求、响应支持不同的 Content-Type,因此分别通过 requestBodyHandler (kvHandler,jsonHandler 组合)和 responseBodyHandler (jsonHandler) 进行处理。综上,在修改该插件逻辑时,主要对kvHandler 和 jsonHandler 进行修改即可,其中 jsonHandler 依赖 GJSON [ 9] 和 SJSON [ 10] 工具库。图片目前 handler 中的转换顺序是被硬编码的(remove -> rename -> replace -> add -> append -> map -> dedupe),我们对此有优化的打算,也欢迎感兴趣的同学参与进来 ~

总结

本文带大家了解了 Higress Transformer 插件,并与 Spring Cloud Gateway 进行了性能比较,在文章的最后还说明了该插件的核心代码逻辑,希望能够为大家从 Spring Cloud Gateway 迁移至 Higress 提供帮助!

如果您觉得 Higress 对您有帮助,欢迎前往 Github: Higress [ 11] 为我们 star⭐️ 一下!期待与您在 Higress 社区相遇 ~

相关链接:

[1] Spring Cloud Gateway

https://cloud.spring.io/spring-cloud-gateway/reference/html/

[2] SCG GatewayFilter Factories

https://cloud.spring.io/spring-cloud-gateway/reference/html/#gatewayfilter-factories

[3] Higress Transformer 插件

https://github.com/alibaba/higress/tree/main/plugins/wasm-go/extensions/transformer

[4] Higress 官方文档

https://higress.io/zh-cn/

[5] Higress Wasm SDK

https://github.com/alibaba/higress/tree/main/plugins

[6] Higress 快速开始

https://higress.io/zh-cn/docs/user/quickstart

[7] httpbin

https://httpbin.org/

[8] 开发 Higress Wasm 插件

https://higress.io/zh-cn/docs/user/wasm-go

[9] GJSON

https://github.com/tidwall/gjson

[10] SJSON

https://github.com/tidwall/sjson

[11] Higress 代码仓库

https://github.com/alibaba/higress

[12] Transformer Demo

https://github.com/higress-group/higress-demo/tree/main/wasm-demo/wasm-demo-go/wasm-plugin-transformer

[13] 性能对比配置

https://gist.github.com/WeixinX/c24f4ded37832dd7e753b2d27470f0fc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/294120.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日志服务 SLS 深度解析:拥抱云原生和 AI,基于 SLS 的可观测分析创新

云布道师 10 月 31 日&#xff0c;杭州云栖大会上&#xff0c;日志服务 SLS 研发负责人简志和产品经理孟威等人发表了《日志服务 SLS 深度解析&#xff1a;拥抱云原生和 AI&#xff0c;基于 SLS 的可观测分析创新》的主题演讲&#xff0c;对阿里云日志服务 SLS 产品服务创新以…

Qt的简单游戏实现提供完整代码

文章目录 1 项目简介2 项目基本配置2.1 创建项目2.2 添加资源 3 主场景3.1 设置游戏主场景配置3.2 设置背景图片3.3 创建开始按钮3.4 开始按钮跳跃特效实现3.5 创建选择关卡场景3.6 点击开始按钮进入选择关卡场景 4 选择关卡场景4.1场景基本设置4.2 背景设置4.3 创建返回按钮4.…

redis主从复制(在虚拟机centos的docker下)

1.安装docker Docker安装(CentOS)简单使用-CSDN博客 2.编辑3个redis配置 cd /etc mkdir redis-ms cd redis-ms/ vim redis6379.conf vim redis6380.conf vim redis6381.conf# master #端口号 port 6379#设置客户端连接后进行任何其他指定前需要使用的密码 requirepass 12345…

从0到1部署gitlab自动打包部署项目

本文重点在于配置ci/cd打包 使用的是docker desktop 第一步安装docker desktop Docker简介 Docker 就像一个盒子&#xff0c;里面可以装很多物件&#xff0c;如果需要某些物件&#xff0c;可以直接将该盒子拿走&#xff0c;而不需要从该盒子中一件一件的取。Docker中文社区、…

智能优化算法应用:基于人工大猩猩部队算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工大猩猩部队算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工大猩猩部队算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工大猩猩部队算法4.实验参…

2023.12.21 关于 Redis 常用数据结构 和 单线程模型

目录 各数据结构具体编码方式 查看 key 对应 value 的编码方式 Reids 单线程模型 经典面试题 IO 多路复用 Redis 常用数据结构 Redis 中所有的 key 均为 String 类型&#xff0c;而不同的是 value 的数据类型却有很多种以下介绍 5 种 value 常见的数据类型 注意&#xff1…

深入了解 Android 中的应用程序签名

深入了解 Android 中的应用程序签名 一、应用程序签名介绍1.1 应用程序签名1.2 应用程序签名的意义1.3 应用程序签名的流程1.4 应用程序签名的方案1.5 签名的重要性和应用场景 二、AOSP 的应用签名2.1 AOSP的应用签名文件路径2.2 应用程序指定签名文件 三、Android Studio 的应…

GIT具体配置步骤详解

GIT配置具体步骤如下 SDK 使用 Repo 工具管理&#xff0c;拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workf…

php学习01-Hello World

开发环境搭建 参考 如果没有搭建的请参考上面的文章进行搭建 新建index.php <?php echo Hello World; ?>访问 修改index.php代码 <?php phpinfo() //主要是用来打印php的一些配置信息方便后期排查配置是否正确以及插件是否开启 ?>

IP应用场景的规划

IP地址作为互联网通信的基石&#xff0c;在现代社会中扮演着至关重要的角色。本文将深入探讨IP地址在不同应用场景中的规划与拓展&#xff0c;探讨其在网络通信、安全、商业、医疗和智能城市等领域的关键作用与未来发展趋势。 IP地址的基本原理 IP地址是分配给网络上设备的数…

输电线路定位:应对复杂环境,确保电力传输畅通无阻

在现代社会&#xff0c;电力作为我们生活和工业生产的重要能源&#xff0c;其安全、稳定、高效的传输显得尤为重要。而输电线路的定位与监测&#xff0c;正是保障电力传输畅通无阻的关键环节。恒峰智慧科技将详细介绍输电线路分布式故障定位及隐患监测装置HFP-GZS2000的技术原理…

万界星空开源MES/注塑MES/开源注塑MES/免费MES/MES源码

一、系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES、好看的数据大屏、功能齐全开源mes. 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&…