AI原生的API网关Higress

背景

在当今云原生和微服务架构盛行的时代,API 网关作为连接客户端与后端服务的桥梁,其重要性不言而喻。传统的网关产品,如 Nginx、Istio、Kong、Apisix 等,虽然各有特点,但随着微服务架构的演进和云原生技术的普及,业务需求变得更加复杂多样,传统网关在某些场景下已难以满足需求。

在这样的背景下,Higress 应运而生。它源于阿里巴巴内部电商、交易等核心生产场景的实践沉淀,是一款标准化、高集成、易扩展、热更新的云原生网关。Higress 的创建最初是为了解决阿里巴巴内部的“本地生活战役”中的技术难题,即实现阿里巴巴业务域与蚂蚁业务域之间 RPC 直接调用。由于两个业务域网络隔离,需要借助网关来解决这一问题。经过不断的发展和优化,Higress 逐渐成为一款功能强大且适用于多种场景的云原生网关。

介绍

(一)定义与核心特性

Higress 是一款云原生 API 网关,内核基于 Istio 和 Envoy。它将流量网关、微服务网关、安全网关三合一,深度集成了 Dubbo、Nacos、Sentinel 等微服务技术栈,能够帮助用户极大地降低网关的部署及运维成本,同时不损失其功能。以下是 Higress 的一些核心特性:

  1. 高集成性:与 K8s 和微服务生态紧密集成,支持 Nacos 注册和配置、Sentinel 限流降级等能力,可在一个统一的平台上管理流量、安全和微服务。
  2. 热更新能力:支持规则变更毫秒级生效等热更新能力,大大提高了系统的灵活性和响应速度,避免了传统网关配置更新时的流量抖动问题。
  3. 丰富的插件生态:不仅提供了默认的插件,还支持自定义插件的扩展。用户可以根据业务需求定制自己的网关功能,支持使用多种语言编写的 Wasm 插件进行自定义扩展,插件更新使用热插拔机制,确保更新期间零流量损失。
  4. 安全性:集成了多种安全功能,如限流、黑白名单、WAF(Web 应用程序防火墙)等,确保系统的安全性和稳定性。提供“API 内省”功能,可快速开发 API 开放能力,内置支持 JWT 和 OIDC 等身份验证和授权方法,确保强大的 API 安全性。
  5. AI 原生能力:提供了一套全面的 AI 插件和增强的后端模型编排,使开发者可以轻松地将 AI 功能集成到 API 工作流程中,从而创建智能化和自适应的服务。支持多模型统一接入,可对接国内外所有 LLM 模型厂商,提供标准化接口协议,实现 30 秒完成模型迁移。具备智能流量管理能力,包括多模型负载均衡、Token 流控和缓存优化等。
  6. 云原生标准合规:完全遵循 Ingress、Gateway API 和 Istio API 标准,确保了从其他遵循这些标准的网关的无缝迁移,最大限度地减少了过渡时间和工作量。
  7. 可扩展性:提供了一个丰富的官方插件库,用于 AI 集成、流量管理和安全等常见任务。支持使用多种语言编写的 Wasm 插件,以进行自定义扩展。插件更新使用热插拔机制,确保更新期间零流量损失。
  8. 生态系统集成:与流行的阿里云和开源工具(包括 Nacos、Sentinel、ChaosBlade、OpenSergo 等)无缝集成,为微服务提供了一个统一的控制和治理平面。

(二)架构设计

Higress 采用分层架构设计,主要包括控制平面、数据平面和基础设施层:

  1. 控制平面(Higress Controller):监听 Kubernetes API Server 资源变更,管理配置并下发至数据平面,提供扩展 API 定义。支持 Ingress API、Gateway API、Istio VirtualService 等多种流量管理标准,可平滑迁移 Nginx Ingress 配置(兼容 80%+ 注解)。深度集成 Nacos、ZooKeeper、Consul 等注册中心,支持 K8s Service、静态 IP、DNS 等多种服务发现方式,适配混合云架构。
  2. 数据平面(基于 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%+。
  3. 基础设施层(Kubernetes/容器):Higress 部署在 Kubernetes 集群中,利用容器化技术实现资源的隔离和管理。

(三)应用场景

Higress 在多个领域都有广泛的应用场景:

  1. AI 网关:支持 OpenAI、Anthropic、阿里云通义千问等国内外 LLM 模型厂商,提供标准化接口协议,实现多模型统一接入。具备智能流量管理能力,如多模型负载均衡、Token 流控和缓存优化等,可支撑通义千问 APP 日均亿级请求,百炼大模型 API 调用成功率 99.99%。
  2. 微服务网关:作为统一的入口点,通过配置与 Nacos 或 Consul 等服务发现工具集成,实现动态的服务路由,优化服务间通信效率和安全性。解决阿里集团与蚂蚁集团跨业务域 RPC 互通问题,链路 RT 降低 50%,支撑飞猪、手淘等核心业务。与 Istio 深度联动,实现服务间 mTLS 加密、流量镜像、故障注入等高级治理功能。
  3. 安全防护网关:内置阿里云 Web 应用防火墙,拦截 99.9% 的 OWASP Top 10 攻击,支持自定义规则。支持 JWT、OIDC、HMAC 等多种认证方式,可对接 Keycloak、Okta 等第三方身份系统。基于 IP、Cookie 等维度的流量清洗,防御每秒 10 万级的 CC 攻击。
  4. Kubernetes Ingress 网关:可以作为 K8s 集群的 Ingress 入口网关,并且兼容了大量 K8s Nginx Ingress 的注解,可以从 K8s Nginx Ingress 快速平滑迁移到 Higress。支持 Gateway API 标准,支持用户从 Ingress API 平滑迁移到 Gateway API。相比 ingress - nginx,资源开销大幅下降,路由变更生效速度有十倍提升。
  5. 其他场景:还适用于简化的多云网关管理、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(这是一个公开可用的服务,用于测试目的)。 image-20250617091856630

  • 配置路由:再次转到左侧菜单栏,选择“路由配置”。点击“创建路由”来定义一条新的路由规则,路由名称如 hello-route,匹配规则选择“精确匹配”,并在路径字段输入 /get,目标服务从下拉列表中选择之前创建的服务名称 hello-service.dnsimage-20250617092045311

  • 测试 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=regionhigress.io/canary-by-header-value=gz|bj,当客户端在 HTTP 请求头中携带 region 参数值 gzbj 时,将请求路由到路由 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 有望成为更多开发者的首选网关解决方案。

  1. higress 🔗

  2. Higress 或许是目前最好的云原生网关? 🔗

lomtom

标题:AI原生的API网关Higress

作者:lomtom

链接:https://lomtom.cn/dpcz0xapx2zba