Higress 源码解析指南:跟一份路由配置,走完控制面到 Envoy 的 3 跳
【免费下载链接】higress🤖 AI Gateway | AI Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/hi/higress
想搞懂 Higress 源码解析,先别急着从 main.go 逐行啃起。Higress 是一个 AI 原生的云原生 API 网关:数据面基于 Envoy,控制面脱胎于 Istio 的二次开发,负责把 K8s 里的 Ingress、Gateway API 资源,以及 Nacos 等多注册中心的服务信息,实时翻译成 Envoy 的 xDS 配置并热下发。本文不逐行注释代码,而是跟着一份路由变更走完全链路,最后附一张源码地图。
为什么改一条网关配置这么难
老一代网关的模型是"配置即进程状态":规则放在内存里,改一条路由就要 reload 甚至重启;服务发现只认 K8s Service,Nacos 里注册的服务想进网关,得在旁边再挂一个适配器;限流、鉴权、AI 转发这些能力没有统一的扩展点。三个老问题:改配置要重启、发现通道单一、能力无法插拔。
Higress 的解法正好对应三条:xDS 热推送让配置变更零重启;McpBridge 把 Nacos、Eureka、Consul、Zookeeper 统一接进来;Wasm 插件提供能力扩展。它的控制面是 Istio Pilot 的直接后裔——只要读过 Istio,读 Higress 就是"找差异"而不是"从零啃"。
3 分钟建立心智模型:三个组件,两个面
整个系统只有三个进程。Console 是配置入口,提供控制台和 Admin SDK;Controller 是控制面,内部含 Discovery(Istio Pilot 原样继承,管服务发现和 xDS 服务)与 Higress Core(Higress 自研部分,把 Ingress、McpBridge、WasmPlugin 翻译成 Istio 资源,外加证书管理);Gateway 是数据面,一个 Pod 里跑 Envoy 和 pilot-agent,agent 负责把 Envoy 的 xDS 请求转发给 Controller。
控制面和数据面的关系一句话:你只写 K8s 资源,Controller 先把"用户语言"翻译成"Istio 语言"(Gateway、VirtualService 等),再翻译成"Envoy 语言"(LDS/RDS/CDS/EDS),通过 gRPC 推给 Envoy。Envoy 进程本身永远不变,变的全是配置推送——这就是热更新的本质。
跟一份路由配置走完全程
控制面的装配集中在一个文件里,初始化顺序就是阅读路线。pkg/bootstrap/server.go 的 NewServer 中,5 行看清组件骨架:
initFuncList := []func() error{ s.initKubeClient, s.initXdsServer, s.initHttpServer, // ...共 7 项,顺序即装配顺序 }📍 第一站:informer 捕获变更,翻译成 Istio 资源
组件职责:Ingress Controller 负责"听懂用户的资源"。输入是 K8s 里的 Ingress、Service、Secret,输出是 Istio 的 Gateway、VirtualService、DestinationRule,写进聚合配置存储。
入口在 pkg/ingress/kube/ingress/controller.go,informer 注册和事件处理都在这;具体翻译规则在 pkg/ingress/config/ingress_config.go,配套的同名 _test.go 里期望产物直接写在断言中,比读实现还快。Gateway API 那条线在 pkg/ingress/kube/gateway/ 下,结构对称。
📡 第二站:配置变了之后,谁来通知数据面?
答案不是轮询,是事件回调。server.go 的 initRegistryEventHandlers 给配置存储注册了一个 handler,任何资源变更都会打出一张 PushRequest:
configHandler := func(prev, curr config.Config, event model.Event) { pushReq := &model.PushRequest{Full: true, ...} s.xdsServer.ConfigUpdate(pushReq) }PushRequest 交给 Istio 的 xds.DiscoveryServer:防抖、计算受影响的代理,然后调用按资源类型注册的 Generator 生成 xDS 资源。Higress 把这套 Generator 整体替换了,入口是 pkg/ingress/mcp/generator.go:VirtualService、ServiceEntry、WasmPlugin 各一个生成器。注册处在 initXdsServer,每种资源一行,十几行代码就能看清全景。
🚀 第三站:gRPC 推给 Envoy,零重启生效
职责:把 xDS 资源交给数据面。输入是 PushRequest,输出是 Envoy 里 Listener、Route、Cluster、Endpoint 的版本更新。gRPC 服务在 Start() 中监听 GrpcAddress 对外提供 xDS,代码就在前面那个 server.go。数据面一侧,Gateway Pod 里的 pilot-agent 通过 ADS 长连接接收推送,Envoy 按版本原子切换配置——路由变更不重启,秘密全在这里。
想看 Envoy 内部怎么消费这些配置,docs/architecture.md 对 Listener/Router/Cluster/Endpoint 有逐段拆解,值得对照着读。
🔀 岔路口:服务不在 K8s,Nacos 怎么接进来
如果后端服务注册在 Nacos,它走的是服务发现这条线:McpBridge Controller(pkg/ingress/kube/mcpbridge/controller.go)根据 McpBridge 资源创建对应注册中心的 watcher;registry/nacos/watcher.go 从 Nacos 同步服务实例,打包成 Istio ServiceEntry 写回配置存储——之后走的还是上面同一条 xDS 链路。Eureka、Consul、Zookeeper 的实现在 registry/ 各自子目录,模式完全一致。
配置缓存看 registry/memory/cache.go,内存存储和原子更新都在这,规模不大,建议通读。如果关心的是 MCP 服务器配置而非普通服务,入口换成 registry/nacos/mcpserver/client.go。
源码地图速查:8 个文件定位全链路
【免费下载链接】higress🤖 AI Gateway | AI Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/hi/higress
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考