AI原生的API网关Higress
- 今天
背景
在当今云原生和微服务架构盛行的时代,API 网关作为连接客户端与后端服务的桥梁,其重要性不言而喻。传统的网关产品,如 Nginx、Istio、Kong、Apisix 等,虽然各有特点,但随着微服务架构的演进和云原生技术的普及,业务需求变得更加复杂多样,传统网关在某些场景下已难以满足需求。
在这样的背景下,Higress 应运而生。它源于阿里巴巴内部电商、交易等核心生产场景的实践沉淀,是一款标准化、高集成、易扩展、热更新的云原生网关。Higress 的创建最初是为了解决阿里巴巴内部的“本地生活战役”中的技术难题,即实现阿里巴巴业务域与蚂蚁业务域之间 RPC 直接调用。由于两个业务域网络隔离,需要借助网关来解决这一问题。经过不断的发展和优化,Higress 逐渐成为一款功能强大且适用于多种场景的云原生网关。
介绍
(一)定义与核心特性
Higress 是一款云原生 API 网关,内核基于 Istio 和 Envoy。它将流量网关、微服务网关、安全网关三合一,深度集成了 Dubbo、Nacos、Sentinel 等微服务技术栈,能够帮助用户极大地降低网关的部署及运维成本,同时不损失其功能。以下是 Higress 的一些核心特性:
- 高集成性:与 K8s 和微服务生态紧密集成,支持 Nacos 注册和配置、Sentinel 限流降级等能力,可在一个统一的平台上管理流量、安全和微服务。
- 热更新能力:支持规则变更毫秒级生效等热更新能力,大大提高了系统的灵活性和响应速度,避免了传统网关配置更新时的流量抖动问题。
- 丰富的插件生态:不仅提供了默认的插件,还支持自定义插件的扩展。用户可以根据业务需求定制自己的网关功能,支持使用多种语言编写的 Wasm 插件进行自定义扩展,插件更新使用热插拔机制,确保更新期间零流量损失。
- 安全性:集成了多种安全功能,如限流、黑白名单、WAF(Web 应用程序防火墙)等,确保系统的安全性和稳定性。提供“API 内省”功能,可快速开发 API 开放能力,内置支持 JWT 和 OIDC 等身份验证和授权方法,确保强大的 API 安全性。
- AI 原生能力:提供了一套全面的 AI 插件和增强的后端模型编排,使开发者可以轻松地将 AI 功能集成到 API 工作流程中,从而创建智能化和自适应的服务。支持多模型统一接入,可对接国内外所有 LLM 模型厂商,提供标准化接口协议,实现 30 秒完成模型迁移。具备智能流量管理能力,包括多模型负载均衡、Token 流控和缓存优化等。
- 云原生标准合规:完全遵循 Ingress、Gateway API 和 Istio API 标准,确保了从其他遵循这些标准的网关的无缝迁移,最大限度地减少了过渡时间和工作量。
- 可扩展性:提供了一个丰富的官方插件库,用于 AI 集成、流量管理和安全等常见任务。支持使用多种语言编写的 Wasm 插件,以进行自定义扩展。插件更新使用热插拔机制,确保更新期间零流量损失。
- 生态系统集成:与流行的阿里云和开源工具(包括 Nacos、Sentinel、ChaosBlade、OpenSergo 等)无缝集成,为微服务提供了一个统一的控制和治理平面。
(二)架构设计
Higress 采用分层架构设计,主要包括控制平面、数据平面和基础设施层:
- 控制平面(Higress Controller):监听 Kubernetes API Server 资源变更,管理配置并下发至数据平面,提供扩展 API 定义。支持 Ingress API、Gateway API、Istio VirtualService 等多种流量管理标准,可平滑迁移 Nginx Ingress 配置(兼容 80%+ 注解)。深度集成 Nacos、ZooKeeper、Consul 等注册中心,支持 K8s Service、静态 IP、DNS 等多种服务发现方式,适配混合云架构。
- 数据平面(基于 Envoy 扩展):基于 Envoy C++ 高性能代理内核,结合 Istio 服务网格的控制面能力,实现微秒级流量转发与毫秒级配置热更新。支持 HTTP/1.1、HTTP/2、gRPC、WebSocket、Dubbo 等多种协议,可处理百万级并发连接,满足电商大促、实时交互等场景需求。提供 Wasm、Lua、进程外三种插件机制,支持 Go、Rust、JavaScript 等语言开发,插件热更新对流量无损。支持完全流式处理请求 / 响应 Body,可高效处理 SSE(Server-Sent Events)、AI 模型 Token 流等场景,内存开销降低 50%+。
- 基础设施层(Kubernetes/容器):Higress 部署在 Kubernetes 集群中,利用容器化技术实现资源的隔离和管理。
(三)应用场景
Higress 在多个领域都有广泛的应用场景:
- AI 网关:支持 OpenAI、Anthropic、阿里云通义千问等国内外 LLM 模型厂商,提供标准化接口协议,实现多模型统一接入。具备智能流量管理能力,如多模型负载均衡、Token 流控和缓存优化等,可支撑通义千问 APP 日均亿级请求,百炼大模型 API 调用成功率 99.99%。
- 微服务网关:作为统一的入口点,通过配置与 Nacos 或 Consul 等服务发现工具集成,实现动态的服务路由,优化服务间通信效率和安全性。解决阿里集团与蚂蚁集团跨业务域 RPC 互通问题,链路 RT 降低 50%,支撑飞猪、手淘等核心业务。与 Istio 深度联动,实现服务间 mTLS 加密、流量镜像、故障注入等高级治理功能。
- 安全防护网关:内置阿里云 Web 应用防火墙,拦截 99.9% 的 OWASP Top 10 攻击,支持自定义规则。支持 JWT、OIDC、HMAC 等多种认证方式,可对接 Keycloak、Okta 等第三方身份系统。基于 IP、Cookie 等维度的流量清洗,防御每秒 10 万级的 CC 攻击。
- Kubernetes Ingress 网关:可以作为 K8s 集群的 Ingress 入口网关,并且兼容了大量 K8s Nginx Ingress 的注解,可以从 K8s Nginx Ingress 快速平滑迁移到 Higress。支持 Gateway API 标准,支持用户从 Ingress API 平滑迁移到 Gateway API。相比 ingress - nginx,资源开销大幅下降,路由变更生效速度有十倍提升。
- 其他场景:还适用于简化的多云网关管理、AI 驱动的客户支持、高流量电子商务平台等场景。例如,一家跨多个云提供商运营的公司可以使用 Higress 实现跨所有环境的一致管理和策略执行;在线服务提供商可以利用 Higress 对 WebSocket 连接的支持以及热插拔配置更新能力,确保客户支持聊天机器人的流畅运行;电子商务公司可以借助 Higress 的性能优化和快速配置更改能力,有效处理促销活动期间的大量流量高峰。
安装
(一)在 K8s 中安装
首先,添加 Higress 的 Helm 仓库并安装 Higress 到名为 higress-system
的命名空间中:
helm repo add higress.io https://higress.cn/helm-charts
# default(with lb)
helm install higress -n higress-system higress.io/higress --create-namespace --render-subchart-notes
# host network(without lb)
helm install higress -n higress-system higress.io/higress --create-namespace --render-subchart-notes \
--set higress-core.gateway.hostNetwork=true \
--set higress-core.gateway.service.type=ClusterIP \
--set higress-core.gateway.kind=DaemonSet
Higress 的所有 Docker 镜像都使用自己独享的仓库,不受 Docker Hub 境内访问受限的影响。安装完成后,获取 Higress Gateway 的 LoadBalancer IP,并记录下来,后续可以通过该 IP 的 80 和 443 端口访问 Higress Gateway:
# default
kubectl get svc -n higress-system higress-gateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
如果 LoadBalancer IP 获取不到,说明当前的 K8s 集群不支持 LoadBalancer 类型的 Service,可以考虑以下方案:
- 使用云厂商提供的 K8s 服务,例如阿里云 ACK。
- 参考运维参数配置,开启
higress-core.gateway.hostNetwork
,让 Higress 监听本机端口,再通过其他软/硬负载均衡器转发给固定机器 IP。 - (生产不建议)使用开源的负载均衡方案 MetalLB。
随后,将higress服务暴露出来,首先将higress.k8s.local
与集群的VIP或master节点IP进行映射,并且创建以下ingress资源。
# higress-console.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: higress-console
namespace: higress-system
spec:
ingressClassName: higress
rules:
- host: higress.k8s.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: higress-console
port:
number: 8080
最后,可使用kubectl查看部署后的资源情况(host network模式):
➜ ~ kubectl get pod -n higress-system
NAME READY STATUS RESTARTS AGE
higress-console-58c69cbfb7-tn8cq 1/1 Running 0 23h
higress-controller-7698564469-rwbkz 2/2 Running 0 23h
higress-gateway-75858c85f8-rrj9w 1/1 Running 0 23h
➜ ~ kubectl get svc -n higress-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
higress-console ClusterIP 10.96.3.71 <none> 8080/TCP 23h
higress-controller ClusterIP 10.96.3.61 <none> 8888/TCP,8889/TCP,15051/TCP,15010/TCP,15012/TCP,443/TCP,15014/TCP 23h
higress-gateway ClusterIP 10.96.3.172 <none> 80/TCP,443/TCP 23h
➜ ~ kubectl get ingress -n higress-system
NAME CLASS HOSTS ADDRESS PORTS AGE
default higress * 80, 443 10d
higress-console higress higress.k8s.local 80 21m
(二)基于 Docker 的单机版安装
1. 前置条件
确保计算机上已安装了 Docker。如果尚未安装,请访问 Docker 官方指南进行安装。
2. 部署 Higress
- 创建一个工作目录:
mkdir higress && cd higress
- 启动 Higress 容器:使用
docker run
命令启动 Higress 容器,并将上述创建的工作目录挂载到容器内的指定路径,同时映射几个关键端口以供后续操作。
docker run -d --rm --name higress-ai -v ${PWD}:/data \
-p 8001:8001 -p 8080:8080 -p 8443:8443 \
higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/all-in-one:latest
这里映射的端口分别是:
8001
端口:Higress UI 控制台入口8080
端口:网关 HTTP 协议入口8443
端口:网关 HTTPS 协议入口
使用
(一)登录并配置 Higress 控制台
1. 使用控制台界面配置
-
打开浏览器访问控制台:在浏览器中输入
http://127.0.0.1:8001
(docker)、http://higress.k8s.local
(k8s)进入 Higress 控制台界面。 -
初始化管理员账号:首次访问时,系统会要求设置初始管理员账户,请按照页面提示完成初始化过程。
-
登录控制台:初始化完成后,使用刚刚设定的用户名和密码登录 Higress 控制台。
-
添加服务来源:点击左侧菜单栏中的“服务来源”,接着点击右上角的“创建服务来源”按钮。这里为示例服务定义一个 DNS 域名服务源,服务类型选择“DNS 域名”,服务名称填入任意喜欢的名字,如
hello-service
,服务端口保持默认 80 即可,域名列表填写httpbin.org
(这是一个公开可用的服务,用于测试目的)。 -
配置路由:再次转到左侧菜单栏,选择“路由配置”。点击“创建路由”来定义一条新的路由规则,路由名称如
hello-route
,匹配规则选择“精确匹配”,并在路径字段输入/get
,目标服务从下拉列表中选择之前创建的服务名称hello-service.dns
。 -
测试 Higress 是否正常工作:打开一个新的浏览器标签页或者终端窗口,执行以下
curl
命令以检查配置是否生效。
# docker
curl http://localhost:8080/get -H 'host: httpbin.org'
# k8s
curl http://higress.k8s.local/get -H 'host: httpbin.org'
如果一切正常,应该能看到 JSON 格式的响应数据,表示请求已经被成功代理至 httpbin.org
。
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"Req-Start-Time": "1750123021083",
"User-Agent": "curl/8.7.1",
"X-Amzn-Trace-Id": "Root=1-6850c20d-108617d32c4685462b8fa9ee",
"X-Envoy-Attempt-Count": "1",
"X-Envoy-Decorator-Operation": "hello-service.dns:80/get",
"X-Envoy-Internal": "true",
"X-Envoy-Original-Host": "httpbin.org",
"X-Envoy-Route-Identifier": "true"
},
"origin": "x.x.x.x",
"url": "http://httpbin.org/get"
}
2. 使用k8s资源配置服务路由
假设已有服务部署在 default
命名空间下,名为 foo
。
kind: Pod
apiVersion: v1
metadata:
name: foo-app
labels:
app: foo
spec:
containers:
- name: foo-app
image: higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/http-echo:0.2.4-alpine
args:
- "-text=foo"
---
kind: Service
apiVersion: v1
metadata:
name: foo-service
spec:
selector:
app: foo
ports:
# Default port used by the image
- port: 5678
接下来,配置路由让 http://foo.bar.com/foo
指向这个服务。
- 通过 Ingress CRD 配置:创建一个 Ingress 资源,指定 Higress 作为 Ingress Class,并定义路由规则。
# default
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: foo
spec:
ingressClassName: higress
rules:
- host: foo.bar.com
http:
paths:
- backend:
service:
name: foo-service
port:
number: 5678
path: /foo
pathType: Prefix
# tls (The certificate of foo-certs has been created in advance)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: foo
spec:
tls:
- hosts:
- foo.bar.com
secretName: foo-certs
ingressClassName: higress
rules:
- host: foo.bar.com
http:
paths:
- backend:
service:
name: foo-service
port:
number: 5678
path: /foo
pathType: Prefix
使用 kubectl apply -f <filename>.yaml
应用此配置。
- 使用 Higress Console 配置:如果更倾向于图形界面操作,可以使用
hgctl dashboard console
命令启动 Higress 控制台,完成管理员账户的初始化后,手动创建域名和路由规则,根据控制台提示进行操作。 - 请求验证:验证配置是否生效,通过发送一个请求到配置的路由地址:
# way 1
curl http://higress.k8s.local/foo -H 'host: foo.bar.com'
# way 2
# 1. 编写本地hosts映射,保存foo.bar.com和服务器的映射关系
# 2. 访问服务
curl http://foo.bar.com/foo
如果一切配置正确,应该看到”foo”作为响应,表明请求已被正确路由到后端服务。
(二)AI 网关使用
1. 控制台配置
部署完成后,通过浏览器访问控制台界面 http://localhost:8001/
,首次登录需要配置管理员及密码。在 AI 服务提供者管理界面,可以配置已集成供应商的 API - KEY,当前已集成的供应商有阿里云、DeepSeek、Azure OpenAI、OpenAI、豆包等。每个 AI 服务提供商都可以单独配置令牌降级策略,当某一认证令牌返回异常响应的数量超出阈值,Higress 将暂停使用该令牌发起请求,直至后续健康检测请求连续收到一定数量的正常响应。在 AI 路由管理界面,支持配置不同路由的域名、模型匹配方式、降级配置、请求消费者等,也可以通过策略配置不同认证鉴权方式、限流策略等,还支持如 RAG、Prompt 模板、语义缓存等功能。
2. 调试
打开系统自带命令行,通过以下命令进行请求(如 HTTP 服务未部署在 8080 端口上,修改为对应端口即可):
curl 'http://localhost:8080/v1/chat/completions' \
-H 'Content - Type: application/json' \
-d '{ "model": "qwen - max", "messages": [ { "role": "user", "content": "你是谁" } ] }'
(三)高级使用场景
1. 金丝雀发布和 A/B 测试
Higress 通过注解 higress.io/canary
实现蓝绿发布、A/B 测试、金丝雀发布。例如,先保留已配置的路由 A,当请求不携带任何 Header、Cookies 时,默认请求到这个路由。添加一个新的路由 B,使用 higress.io/canary-by-header
来控制,配置 higress.io/canary-by-header=region
和 higress.io/canary-by-header-value=gz|bj
,当客户端在 HTTP 请求头中携带 region
参数值 gz
或 bj
时,将请求路由到路由 B,否则路由到原来的路由 A。使用 curl
命令模拟请求,查看路由的请求情况。实现金丝雀发布场景时,使用 higress.io/canary-weight
权重来控制,添加路由 C,权重慢慢从 20 到 80,分流原来的路由 A。
2. 插件使用
Higress 提供了丰富的插件库,支持使用多种语言编写的 Wasm 插件进行自定义扩展。
1)例如,以 WAF 插件(基于 corazawaf 开源的 Wasm 插件)为例,可以执行以下命令直接生效:
kubectl apply -f https://higress.io/samples/waf.yaml
这里的配置是开启了全部的 OWASP CRS 规则。可以在相关应用中提交模拟 SQL 注入的评论来测试插件的拦截效果,请求被识别为 SQL 注入时,Higress 将返回 403。由于这个 Wasm 插件实现了指标上报,在 Higress 大盘可以看到被拦截的阶段和命中拦截的规则 ID,Higress 的日志中可以看到具体拦截原因。
2)基于key认证
apiVersion: extensions.higress.io/v1alpha1
kind: WasmPlugin
metadata:
annotations:
higress.io/wasm-plugin-description: Authentication based on API Key.
higress.io/wasm-plugin-icon: https://img.alicdn.com/imgextra/i4/O1CN01BPFGlT1pGZ2VDLgaH_!!6000000005333-2-tps-42-42.png
higress.io/wasm-plugin-title: Key Auth
labels:
higress.io/resource-definer: higress
higress.io/wasm-plugin-built-in: "true"
higress.io/wasm-plugin-category: auth
higress.io/wasm-plugin-name: key-auth
higress.io/wasm-plugin-version: 1.0.0
name: key-auth-1.0.0
namespace: higress-system
spec:
defaultConfigDisable: true
failStrategy: FAIL_OPEN
imagePullPolicy: UNSPECIFIED_POLICY
matchRules:
- config:
consumers:
- credential: b
name: a
global_auth: false
in_query: true
keys:
- apikey
configDisable: false
ingress:
- default/foo
phase: AUTHN
priority: 310
url: oci://higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/key-auth:1.0.0
EOF
这里基于Key的认证,在通过foo的ingress访问时,必须携带apikey的参数,值为b,否则将会被拦截
总结
Higress 作为一款强大的云原生 API 网关,凭借其高集成性、热更新能力、丰富的插件生态、安全性和 AI 原生能力等特性,在云原生和微服务架构领域具有广泛的应用前景。
无论是在 AI 网关、微服务网关、安全防护网关还是 Kubernetes Ingress 网关等场景中,Higress 都能发挥重要作用,帮助用户降低网关的部署及运维成本,提高系统的性能和稳定性。通过本文介绍的安装和使用方法,用户可以快速上手 Higress,并根据实际业务需求进行灵活配置和扩展,以满足不同场景下的业务需求。
在未来的云原生或AI应用开发中,Higress 有望成为更多开发者的首选网关解决方案。
