news 2026/11/2 17:15:57

Higress云原生网关原理深度拆解:Envoy、Istio与微服务治理整合

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Higress云原生网关原理深度拆解:Envoy、Istio与微服务治理整合

2. 为什么 Higress 值得花时间研究

在聊技术之前,先说个直观感受:API 网关这个赛道,能聊的东西很多,但真正值得逐行看源码、逐条理清设计逻辑的并不多。Higress 属于后者。

我最初接触 Higress 是因为一个很实际的痛点:公司在用 Kubernetes 跑微服务,入口层用的是 Ingress Nginx,但业务侧开始引入越来越多的云原生中间件——比如 Nacos 做注册中心、Sentinel 做限流、OpenSergo 做微服务治理。结果就是网关层要同时承担流量转发、服务发现、限流降级、认证鉴权、可观测性采集等一系列职责,Ingress Nginx 的扩展方式开始捉襟见肘,要么写一堆 Lua 脚本,要么在 Sidecar 里做文章,维护成本直线上升。

当时团队里有人提议引入 API 网关,市面上主流的几个方案都评估过。Higress 引起我注意的原因很朴素:它把 Envoy 的流量能力、Istio 的控制面思路、以及微服务治理生态的集成能力揉在了一起,而且是基于 Kubernetes 和 Istio 这套标准体系来做的。这意味着它不是一个孤立的网关产品,而是云原生基础设施的一部分。

我用了一段时间之后,才逐步意识到这个项目的深度远超表面。Higress 不是简单的“又一个网关”,而是一个把 Envoy、Istio、Nacos、Sentinel 等多套体系的原理打通之后做出来的整合型产品。如果你只把它当 Ingress 用,那恐怕连它一半的能力都没用到。这篇文章我想从原理层面做一次深度拆解,聊聊 Higress 的架构设计、核心模块、以及它解决的真实问题。

这篇文章适合谁?我觉得至少有三类人可以从中受益:

  • 正在做技术选型的开发者:想搞清楚 Higress 和 Ingress Nginx、APISIX、Kong 这些方案的本质差异。
  • 运维和平台工程师:需要理解 Higress 在 Kubernetes 集群里的部署架构、配置下发链路、以及排障思路。
  • 对云原生网关原理感兴趣的人:想通过一个具体项目,把 Envoy、Istio、服务发现、限流降级这些概念串起来。

如果你属于其中任何一类,这篇文章应该能帮你省下不少自己翻源码、查文档的时间。

3. 整体架构与设计哲学

3.1 先理解 Higress 的定位

Higress 的官方定位是"云原生网关",但实际上它做了三件事:

  1. 作为 Ingress 网关:兼容 Kubernetes Ingress 和 Gateway API,承接南北向流量。
  2. 作为微服务网关:对接 Nacos、Eureka 等服务注册中心,实现服务发现和路由转发,替代传统微服务架构里的 API 网关。
  3. 作为安全与治理网关:内置 WAF 能力、限流降级、认证鉴权,和服务网格的治理能力打通。

这个定位决定了它的架构不会是简单的"一个 Envoy 加一层配置转换"。它必须同时处理三类不同来源的配置:Kubernetes 的资源对象、微服务注册中心的服务列表、以及网关自身的管理配置。这三类配置来源不同、语义不同、更新频率也不同,如何把它们统一转换成 Envoy 能理解的配置,是 Higress 最核心的挑战之一。

3.2 控制面与数据面的分离

Higress 的整体架构严格遵循了云原生网关的主流范式:控制面(Control Plane)负责配置管理,数据面(Data Plane)负责流量转发。

数据面是 Envoy,这个没什么悬念。Envoy 在性能、稳定性、扩展性上都经过大规模生产验证,用它做数据面是合理的选择。真正有意思的是控制面,Higress 的控制面基于 Istio 的 Pilot 做了深度改造,核心组件叫pilot。

这里需要解释一下为什么 Higress 选择基于 Istio 改造,而不是从零写一套控制面。

  • Istio 已经解决了 Envoy 配置生成的核心难题。它有一套成熟的模型,能把多种来源的配置转换成 Envoy 的 xDS 协议数据。直接复用这套能力,比自己从零实现 xDS 要靠谱得多。
  • Istio 本身就支持多数据面纳管。虽然默认是接管网格内所有 Envoy,但通过配置可以精确控制纳管范围,Higress 利用了这个特性,让网关 Envoy 和业务 Envoy 共存互不干扰。
  • Kubernetes 生态兼容性好。Istio 的资源模型和 Kubernetes 深度绑定,这对基于 Kubernetes 部署的 Higress 来说,几乎是零成本适配。

用一句话概括 Higress 控制面的设计哲学:站在 Istio 的肩膀上,把微服务治理的扩展点做深做透。

3.3 控制面的核心流程

从整体上看,Higress 控制面的配置流转可以拆成几条链路:

  • Ingress/Gateway API 链路:Kubernetes API Server 将 Ingress 或 Gateway 资源推送给 Higress 控制面,控制面转换成 Envoy 的 Listener、Route、Cluster 配置。
  • 注册中心链路:Higress 对接 Nacos 等注册中心,拉取服务列表和实例信息,动态生成 Envoy Cluster 的 Endpoint。
  • 治理规则链路:通过 Higress 自有的 CRD(比如WasmPlugin、Http2Rpc等)下发治理规则,控制面把它翻译成 Envoy Filter 配置。

这三条链路最终汇聚到同一个配置生成引擎里,统一输出为 Envoy 的 xDS 配置。这个设计有一个很实际的好处:用户不需要关心配置来自哪里,只需要关心最终的 Envoy 配置是什么样的。

有一个细节值得注意:Higress 控制面对外暴露的 xDS 端口默认是15010(gRPC)和15012(HTTPS),这和 Istio 保持了一致。这种兼容性设计不是巧合,而是为了让熟悉 Istio 的人能够无缝迁移到 Higress。

4. 核心模块原理拆解

4.1 Envoy 配置生成:从模型到 xDS

Higress 控制面里最核心的模块是配置生成器,输入是各种来源的配置模型,输出是 Envoy 的 xDS 响应。这个过程可以拆成几步:

第一步:配置监听与事件触发

控制面会监听多种资源的变化:

  • Kubernetes 的 Ingress、Gateway、Service、Endpoint、ConfigMap、Secret
  • Istio 的 VirtualService、DestinationRule、Gateway
  • Higress 自定义的 CRD,比如McpBridge(用于对接注册中心)、WasmPlugin(用于加载扩展)
  • 注册中心的实例变更事件

任何一类资源发生变化,都会触发配置生成流程。这里有一个关键点:事件触发不是简单地全量重新生成,而是基于依赖关系做增量更新。

第二步:构建内部模型

Higress 控制面内部维护了一个统一的数据模型,把所有来源的配置归一化。这个模型类似 Istio 的model包,但做了精简和适配。例如,一个来自 Nacos 的服务会被映射成内部的服务模型,最终生成 Envoy 的 Cluster 和 Endpoints。

第三步:生成 xDS 响应

根据内部模型,生成四类核心 xDS 配置:

  • Listener:决定 Envoy 监听哪些端口、接受哪些流量。Higress 默认会为每个 HTTP 端口生成对应的 Listener。
  • Route:决定请求如何路由到 Cluster。这里会涉及 Header 匹配、Path 匹配、重写规则等。
  • Cluster:决定流量转发到哪个上游服务,包括负载均衡策略、连接池配置、超时设置等。
  • Endpoint:决定上游服务的具体实例地址,来自注册中心或 Kubernetes Service。

这里有一个有意思的设计:Higress 把 Listener 的生成逻辑做得非常精简,大部分能力都通过 Filter 链来实现。比如 WAF 能力是通过 C++ 写的过滤器实现的,限流能力通过 Go 插件实现的,这些都在 Listener 的 Filter Chain 里按顺序执行。

第四步:配置下发

生成好的 xDS 配置通过 gRPC 流推送给 Envoy,Envoy 热更新配置,整个过程对存量连接无损。

4.2 注册中心适配:McpBridge 的原理

Higress 对接注册中心的能力是通过McpBridge这个 CRD 实现的。名字里的 MCP 指的是 Istio 的 Mesh Configuration Protocol,但实际上 Higress 对这个协议做了扩展,让它能对接非 Istio 体系的服务注册中心。

McpBridge的典型配置大概长这样(伪代码,以 Nacos 为例):

apiVersion: extensions.higress.io/v1alpha1 kind: McpBridge metadata: name: default namespace: higress-system spec: registries: - type: nacos name: nacos domain: nacos-server.default.svc.cluster.local port: 8848

这个配置下发到控制面之后,控制面会启动一个针对 Nacos 的同步器,周期性从 Nacos Server 拉取服务列表,监听服务变更事件,然后转换成 Envoy 的 Cluster 和 Endpoint。

有一个细节值得提:Higress 对注册中心的数据做了归一化处理,不同注册中心(Nacos、Eureka、Consul、ZooKeeper)的服务模型被统一成同一个内部模型。这意味着你可以同时对接多个注册中心,路由规则可以指向任何注册中心里的服务,而不需要关心服务到底注册在哪里。

这种设计在微服务迁移场景里非常有用。比如你有一个应用同时注册在 Nacos 和 Kubernetes 里,通过一条路由规则,流量可以同时负载均衡到两边,平滑切换的过程中不会出现流量中断。

4.3 扩展机制:WasmPlugin 与多语言插件生态

Higress 的扩展机制是它区别于传统网关的重要特性。它基于 WebAssembly(Wasm)技术,允许用户用多种语言编写插件,然后动态加载到网关里。

WasmPluginCRD 是扩展的入口。一个典型的配置长这样:

apiVersion: extensions.higress.io/v1alpha1 kind: WasmPlugin metadata: name: my-plugin namespace: higress-system spec: defaultConfig: foo: bar url: http://my-storage/plugin.wasm

控制面收到这个 CRD 之后,会下载 Wasm 文件,通过 Envoy 的 Wasm 扩展机制加载到数据面。这里的关键点在于:插件是热加载的,不需要重启 Envoy,这意味着你可以在业务高峰期动态调整网关行为,而不影响在线流量。

Higress 官方提供了几十个常用插件,涵盖认证鉴权、限流、WAF、灰度发布、可观测性等领域。社区也提供了 Go 和 C++ 两种 Wasm SDK,你甚至可以用 TypeScript 编写插件(通过 AssemblyScript 编译到 Wasm)。

这个设计的深层逻辑是:网关的安全性、稳定性、性能三者之间存在矛盾,Wasm 插件提供了一种相对平衡的解法。相比 Lua(比如 OpenResty 的方案),Wasm 有更好的内存安全和隔离性;相比原生 C++ 扩展,Wasm 可以热更新且不影响稳定性;相比完全用 Envoy 默认配置,Wasm 提供了更大的灵活性。

4.4 网关规则模型:从 Ingress 到 VirtualService 到 Higress 扩展

Higress 同时支持多种配置模型,这一点对用户来说很方便,但实现上相当复杂:

  • Kubernetes Ingress:完全兼容标准 Ingress 语义,这意味着你已经写在 Ingress 里的规则可以直接迁移到 Higress。
  • Istio VirtualService + Gateway:支持 Istio 的流量管理模型,适合已经有 Istio 使用经验的团队。
  • Higress CRD:上面提到的McpBridge、WasmPlugin等,用于扩展能力边界。

这里有一个设计理念值得一提:Higress 把 Kubernetes 生态的标准模型作为基座,把扩展能力放在 CRD 里,而不是修改标准模型的语义。这样做的好处是兼容性优先,升级 Kubernetes 版本或者切换其他网关时,标准模型部分不会成为迁移的阻碍。

比如,同一个域名下的路由,你可以一部分用 Ingress 规则,一部分用 Higress 的 CRD 扩展。最终它们会被合并到同一条 Envoy Route 配置里,由 Higress 控制面处理优先级和冲突。

5. 实战:从部署到配置下发的完整链路

5.1 部署 Higress:两种方式对比

Higress 支持两种部署方式:Helm Charts 和直接应用 YAML。我用的是 Helm 方式,整体体验比较顺。

方式一:Helm 安装(推荐)

helm repo add higress.io https://higress.io/helm-charts helm upgrade --install higress higress.io/higress -n higress-system --create-namespace

安装完成后,检查 Pod 状态:

kubectl get pods -n higress-system

正常情况下,你会看到类似下面的输出:

  • higress-gateway-*:数据面 Envoy Pod
  • higress-controller-*:控制面核心 Pod,负责配置监听与下发
  • higress-console-*:管理控制台(可选组件)

方式二:本地环境快速体验

如果你只想在本机跑起来看看效果,可以用 Docker 直接启动:

docker run -d --name higress-demo \ -p 80:80 -p 443:443 \ higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/higress:latest

这种方式适合快速试玩,但生产环境建议还是用 Helm 方式部署到 Kubernetes 集群里,方便管理配置和扩展。

5.2 配置一条完整路由:Nacos 服务发现 + 路由规则

下面用一个完整示例说明从配置到生效的链路。假设我有一个微服务叫order-service,注册在 Nacos 上,我想通过 Higress 对外暴露/order/**路径。

第一步:创建 McpBridge,对接 Nacos

这是让 Higress 能发现order-service的关键配置:

apiVersion: extensions.higress.io/v1alpha1 kind: McpBridge metadata: name: default namespace: higress-system spec: registries: - type: nacos name: nacos-registry domain: nacos-server.nacos.svc.cluster.local port: 8848

用kubectl apply应用之后,控制面会启动一个 Nacos 同步器,开始监听服务列表变化。这一步完成后,order-service的所有实例都会出现在 Higress 的 Cluster 里。

第二步:创建 Ingress 规则,暴露服务

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: order-ingress namespace: default annotations: higress.io/backend-service: order-service higress.io/backend-protocol: http spec: rules: - host: api.example.com http: paths: - path: /order pathType: Prefix backend: service: name: order-service port: number: 8080

这里有一个关键细节:Higress 对higress.io/backend-service这个注解有特殊处理,它会优先从 Nacos 注册中心解析order-service,而不是从 Kubernetes Service 列表里找。如果你的服务同时存在于 Kubernetes Service 和 Nacos,可以通过注解明确指定路由目标。

第三步:验证配置生效

应用配置后,可以通过查看控制面日志确认同步过程:

kubectl logs -n higress-system deploy/higress-controller -f

日志里会显示类似这样的关键信息:监听到 Nacos 服务实例变化、生成对应的 Envoy Cluster、完成配置分发等。如果你在日志里看不到任何异常,说明配置已经成功下发到数据面。

5.3 动态调试技巧:如何确认流量走的是哪个服务

排障场景里最常遇到的问题是:流量为什么不按预期路由?有几个定位思路供参考:

第一,直接查看 Envoy 的配置视图。

Envoy 暴露了 admin 端口(默认 15000),可以通过 HTTP 接口查看当前加载的配置:

kubectl exec -it higress-gateway-xxx -n higress-system -- \ curl http://127.0.0.1:15000/config_dump | jq

这个命令会输出 Envoy 当前生效的全部配置,包括 Listener、Route、Cluster、Endpoint。你可以重点看dynamicRouteConfigs和dynamicClusterConfigs两个部分,确认路由规则和上游服务是否和预期一致。

第二,开启访问日志。

在 Higress 的WasmPlugin或全局配置里开启访问日志,可以观察到每个请求实际命中的路由和上游实例。这对排查"为什么请求走到了错误的服务"这类问题特别有效。

第三,检查注册中心的数据一致性。

如果 Nacos 里有多个实例,而 Higress 的路由结果不符合预期,可以先确认 Nacos 返回的服务列表是否正常。Higress 控制面日志里会记录实例变化的 key,通过 key 可以反向关联到具体的服务名和集群。

6. 常见问题与排查经验

6.1 配置下发失败:CRD 版本不匹配

现象:应用McpBridge配置时,报错提示 CRD 不存在或者版本不兼容。

原因:通常是因为 Helm 安装的 Higress 版本和 CRD 定义不一致,或者升级时没有同步更新 CRD。

排查步骤:

  • 检查 Higress 版本:helm list -n higress-system
  • 检查 CRD 是否已注册:kubectl get crd | grep higress.io
  • 如果 CRD 缺失,重新安装时加上--include-crds参数:
helm upgrade --install higress higress.io/higress \ -n higress-system --create-namespace --include-crds

避坑心得:升级 Higress 版本之前,务必先备份现有配置,并且确认 CRD 变更没有破坏性。我踩过几次坑,都是因为升级时忽略了 CRD 兼容问题,导致控制面崩溃。

6.2 路由不生效:Nacos 服务发现慢

现象:Nacos 上新注册的服务,Higress 迟迟不能路由到。

原因:这通常是注册中心同步周期的配置问题。Higress 默认的同步间隔是 10 秒,如果你在 Nacos 侧配置了长轮询超时时间,可能导致新实例发现的延迟变大。

解决办法:

  • 调整 Higress 控制面的同步参数,缩短轮询间隔。
  • 确认 Nacos 侧注册中心的事件推送机制是否正常工作。
  • 如果是 Nacos 2.x 版本,确认服务端能正常向客户端推送 UDP 通知。

避坑心得:如果服务已经注册成功,Nacos 控制台能看到实例,但 Higress 一直不更新路由,优先检查控制面日志。日志里如果多次出现连接注册中心超时的报错,多半是网络隔离或安全组规则挡住了连接。

6.3 插件加载失败:Wasm 文件路径错误

现象:WasmPlugin配置应用成功,但插件没有生效,日志里报 Wasm 加载错误。

原因:url字段指向的文件路径不对,或者文件没有以.wasm扩展名结尾,Envoy 拒绝加载。

解决办法:

  • 确认 Wasm 文件可以通过 URL 直接访问。
  • 确认文件扩展名是.wasm而不是.zip(部分工具输出的二进制文件扩展名不标准)。
  • 使用higress.io/wasm-plugin对应的 OCI 镜像仓库方式替代直链 URL,避免存储服务的问题。

避坑心得:如果你在本地编译 Wasm 插件,建议先把文件上传到对象存储或 OCI 镜像仓库,不要直接挂载到 Pod 内部调试,否则热更新能力和可靠性都会打折。

6.4 性能基线怎么评估

这里整理一份 Higress 的常见性能配置参考,给正在做容量规划的人一些思路:

配置项推荐值说明
Envoy 副本数2 起步至少 2 个副本保证可用性
单副本 CPU 预留2 Core高并发场景建议 4 Core
单副本内存预留4 GiB取决于连接数和 Wasm 插件数
连接池最大连接数1000按实际流量调整
Wasm 插件数建议不超过 10 个插件越多,性能开销越大

避坑心得:一定不要追求把 Envoy 的副本数压到 1。网关是流量入口,不是可以随便重启的应用。生产环境至少 2 个副本起步,甚至建议配 Pod 反亲和性,避免同一个节点故障导致全部实例不可用。

7. 从原理层面看 Higress 的取舍

聊完实操,回到原理层面聊一聊 Higress 做出的设计取舍。这能帮你理解它的优势和短板。

取舍一:控制面基于 Istio 改造的利弊

好处是显而易见的:Istio 的控制面能力直接被复用,稳定性经过社区验证,和 Kubernetes 生态的兼容性做得很好。但代价是,Higress 的控制面比一个纯粹的"Ingress Controller"要重。如果你只是需要一个简单的 Ingress 转发,Higress 显得有些大材小用。

取舍二:Wasm 扩展灵活性和性能的权衡

Wasm 插件带来了热更新、多语言开发、安全隔离等优势,但性能上相比原生 C++ 扩展还是有差距。在单机高并发场景下,一个复杂的 Wasm 插件可能会比对应的 C++ 实现多花费 10% 到 20% 的 CPU 消耗。这个性能代价是否值得,取决于你对可扩展性和热更新能力的需要程度。

取舍三:标准模型和扩展模型的统一

Higress 把 Kubernetes 标准模型、Istio 模型、自有 CRD 三者统一到一个配置生成流程里,好处是用户可以根据场景自由组合,坏处是排查问题时你需要同时理解多种配置模型的语义。不过实践下来,大部分故障都可以通过查看最终生成的 Envoy 配置快速定位,所以这个学习成本是值得的。

我个人在实际操作中的体会是:Higress 最适合的场景不是替代 Nginx Ingress,而是作为微服务和 Kubernetes 混合场景下的统一接入层。如果你已经有微服务注册中心(Nacos、Eureka 等),同时业务又在往 Kubernetes 迁移,Higress 能让你少维护一套网关,少写很多胶水代码。

最后再分享一个小经验:不要一上来就想把 Higress 的所有能力都用上。先从 Ingress 兼容的模式开始,确认流量转发正确,再逐步引入注册中心对接、限流插件、Wasm 扩展,这样踩坑面最小。网关这层东西,稳定性永远比功能丰富性重要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 17:15:09

从OBJ到纹理贴图:MFC+OpenGL模型显示实战

简介:面向学习计算机图形学与C Windows应用开发的学生及开发者,围绕在MFC框架中集成OpenGL、读取OBJ三维模型并完成纹理贴图这一典型课程实验场景,提供可参考的完整工程与素材。压缩包共123个文件,约35.13MB,以h与cpp源…

作者头像 李华
网站建设 2026/11/2 17:10:09

出版业数据标注:挑战、方案与工程实践

1. 出版业数据标注的行业背景与核心挑战 出版行业正经历着从传统纸质出版向数字化、智能化转型的关键阶段。在这个转型过程中,数据标注作为人工智能技术落地的基础环节,正在重塑整个行业的内容生产流程。我从业内多家头部出版社的实际项目经验来看&#…

作者头像 李华
网站建设 2026/11/2 17:09:06

VC2008 MFC老项目改造:用CTabSheet实现多标签页窗口切换

简介:这份资源面向使用 VC2008 与 MFC 开发桌面程序的初学者和中级开发者,聚焦多选项卡窗口界面的实现问题。内容围绕 CTabSheet 类展开,演示如何以 CPropertySheet 为容器、派生页面类并调用 AddPage 添加选项卡,从而在单个窗口内…

作者头像 李华
网站建设 2026/11/2 17:08:10

图存储结构优化:邻接表与入度数组的工程实践

1. 图的存储结构演进:从邻接到入度图的存储方式直接决定了算法实现的效率和工程可行性。十年前我刚接触图论时,邻接矩阵是教科书上的标准解法,但当处理百万级节点的社交网络数据时,这种O(n)空间复杂度的结构立即显露出局限性。这促…

作者头像 李华
网站建设 2026/11/2 17:06:07

高压直驱超声波换能器芯片设计:飞行电容升压与接收链路抗余震

简介:面向汽车电子与超声波测距开发者的高压直驱动超声波传感器IC技术文档,聚焦Elmos E524.32/E524.33/E524.34/E524.35系列。文档围绕直接驱动换能器展开,说明如何省去变压器及外部元件以降低系统成本与尺寸,并讲解模拟与数字信号…

作者头像 李华
网站建设 2026/11/2 17:06:07

DHH说手写代码落幕?CLI Agent如何重塑Rails软件工程协作

1. 这场争论到底在吵什么DHH 这个名字在后端圈子里基本不用多介绍,Rails 的作者,Basecamp 的联合创始人,常年以“反潮流”著称。他最近关于“手写代码时代落幕、Agent 正在重塑软件工程”的表态,在开发者社区里炸开了锅。有人觉得…

作者头像 李华