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

发布时间:2026/11/2 17:16:31
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 的官方定位是云原生网关但实际上它做了三件事作为 Ingress 网关兼容 Kubernetes Ingress 和 Gateway API承接南北向流量。作为微服务网关对接 Nacos、Eureka 等服务注册中心实现服务发现和路由转发替代传统微服务架构里的 API 网关。作为安全与治理网关内置 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 端口默认是15010gRPC和15012HTTPS这和 Istio 保持了一致。这种兼容性设计不是巧合而是为了让熟悉 Istio 的人能够无缝迁移到 Higress。4. 核心模块原理拆解4.1 Envoy 配置生成从模型到 xDSHigress 控制面里最核心的模块是配置生成器输入是各种来源的配置模型输出是 Envoy 的 xDS 响应。这个过程可以拆成几步第一步配置监听与事件触发控制面会监听多种资源的变化Kubernetes 的 Ingress、Gateway、Service、Endpoint、ConfigMap、SecretIstio 的 VirtualService、DestinationRule、GatewayHigress 自定义的 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 流推送给 EnvoyEnvoy 热更新配置整个过程对存量连接无损。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 的扩展机制是它区别于传统网关的重要特性。它基于 WebAssemblyWasm技术允许用户用多种语言编写插件然后动态加载到网关里。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 Podhigress-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 扩展这样踩坑面最小。网关这层东西稳定性永远比功能丰富性重要。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询