3 步接入 Higress Nacos 服务发现:微服务动态路由与灰度发布实战
【免费下载链接】higress🤖 AI Gateway | AI Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/hi/higress
凌晨扩容后你下线了两个服务副本,网关的 upstream 列表里却依然留着已下线的实例——用户在配置手动刷新前持续随机命中 5xx。Higress Nacos 服务发现正是针对这类痛点:网关把 Nacos 当作注册中心持续拉取实例列表,实例上下线自动反映到路由表里,动态路由、灰度发布都不再需要改任何业务代码。
一、这套组合解决了什么
Higress 自己并不保存服务清单,它把实例列表的获取完全交给注册中心。你只需要在 McpBridge 资源里登记 Nacos 的地址、端口、分组和命名空间,Higress 控制器就会持续与 Nacos 同步;Ingress 里只写目标服务名,具体由哪些 IP 承接流量,由服务发现层在运行时自动填充并刷新。整条链路里,你面对的是"服务名",而不是实例 IP。
落到日常运维上,这套组合的效果很直接:
- 实例扩缩容、宕机替换 → 网关下一次同步即拿到新实例列表,路由跟着自动变化,你不需要重启或改配置
- 灰度发布要放一小部分流量 → 按权重或按请求头分流,第二版本服务可以精确接走指定比例
- 多环境、多业务线共用一个 Nacos → 用分组加命名空间隔离,互不串扰
二、动手前备齐这些
| 组件 | 版本要求 | 部署要点 |
|---|---|---|
| Higress | v1.0+ | 网关与控制器需能访问 Nacos 的 8848 端口 |
| Nacos | 1.4.x 或 2.x | 2.x 时 McpBridge 的type写nacos2,1.x 写nacos |
| Kubernetes | 1.20+(容器化部署时) | 测试环境可用单节点 Nacos,参考 test/e2e/conformance/base/nacos.yaml |
三、三步接入 Nacos
📌 下面三步走完,一条从网关到 Nacos 服务的完整链路就跑通了。
步骤一:创建 McpBridge 注册中心连接
apiVersion: networking.higress.io/v1 kind: McpBridge metadata: name: default namespace: higress-system spec: registries: - name: my-nacos type: nacos2 # Nacos 2.x;1.x 请写 nacos domain: 192.168.3.32 # Nacos 服务地址 port: 8848 nacosGroups: [DEFAULT_GROUP] # 要发现哪些分组的服务这段配置告诉 Higress:"到 192.168.3.32 的 Nacos 上,订阅 DEFAULT_GROUP 分组的服务列表"。如果服务注册在指定命名空间,再加一行nacosNamespaceId: <命名空间ID>。
步骤二:配置 Ingress 基础路由
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: echo annotations: higress.io/destination: service-provider.DEFAULT-GROUP.public.nacos spec: ingressClassName: higress rules: - http: paths: - path: /echo pathType: Prefix backend: resource: {apiGroup: networking.higress.io, kind: McpBridge, name: default}这里做了两件事:higress.io/destination注解指定流量去 Nacos 里的service-provider服务(服务名.分组.命名空间.nacos,未指定命名空间时命名空间位置写public);backend.resource则把请求绑定到步骤一的 McpBridge,表示这个目标服务从注册中心发现,而不是本集群的 Service。
步骤三:验证服务已被发现
先执行kubectl get mcpbridge -n higress-system,确认资源创建成功且字段被 API Server 接受;随后向/echo路径发一个真实请求,返回 200 且响应来自 Nacos 注册的实例,说明发现链路已端到端打通。
四、三种路由进阶玩法
配置权重灰度
把 destination 注解写成多行,每行一个权重% 目标:
annotations: higress.io/destination: | 70% service-provider.DEFAULT-GROUP.public.nacos 30% service-provider-gray.DEFAULT-GROUP.public.nacos效果:70% 流量进存量服务,30% 进灰度服务,调整百分比即可平滑放量。更多语法细节见 destination 注解 FAQ。
按请求头分流多版本
再建一个指向 v2 服务的 Ingress(同路径),加上注解nginx.ingress.kubernetes.io/canary: 'true'、nginx.ingress.kubernetes.io/canary-by-header: x-service-version、nginx.ingress.kubernetes.io/canary-by-header-value: v2。效果:携带x-service-version: v2头的请求命中 v2 服务,其余走默认版本,适合按租户或灰度名单切流。
健康检查联动
Nacos 侧维护实例健康状态,Higress 同步时会自动剔除不健康实例,不需要你为每个 Nacos 服务单独配置健康检查;实例恢复后下一次同步自动回到 upstream 池。
五、生产环境调优清单
- 实例变化希望更快生效 → 调低
nacosRefreshInterval(单位秒),高频变更场景设 15 秒左右即可;低频场景 30-60 秒更省资源 - 开发、测试、生产混在一个 Nacos → 环境之间用
nacosGroups分分组隔离,业务线之间用nacosNamespaceId分命名空间隔离 - 网关资源吃紧 → 给 Higress 组件配置合理的 CPU/内存 requests 和 limits,避免与业务容器争抢
- Nacos 开启了鉴权 → 配置
nacosAccessKey、nacosSecretKey等认证字段,或改用authSecretName引用 Secret
六、踩坑速查
⚠️ 按这张表排查,能覆盖绝大多数接入失败的场景。
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 服务列表为空、无上游 | Nacos 地址或端口配错 | 核对 McpBridge 的domain、port,确认集群内 8848 连通 |
| 路由 404 | destination 注解格式不对 | 检查服务名.分组.命名空间.nacos四段格式,public 命名空间写public |
| 同步失败 | Nacos 鉴权不通过 | 检查认证字段nacosAccessKey/nacosSecretKey或authSecretName配置 |
| 灰度流量不生效 | canary Ingress 缺注解或头部值不匹配 | 核对canary-by-header与canary-by-header-value和请求头是否一致 |
完整可运行的示例见 samples/nacos-discovery/,destination 注解的权重与协议语法细节见 docs/faq/mcpbridge-destination-annotation.md,项目背景与部署方式可继续参考 README_ZH.md 和 CONTRIBUTING_CN.md。
【免费下载链接】higress🤖 AI Gateway | AI Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/hi/higress
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考