资讯动态

Higress McpBridge 多目的地注解 `higress.io/destination` 完全指南:URI 语法、按目的地协议与优先级规则

发布时间:2026/9/16 10:24:22 来源:尧图企业网站定制
Higress McpBridge 多目的地注解higress.io/destination完全指南URI 语法、按目的地协议与优先级规则【免费下载链接】higress AI Gateway | AI Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/hi/higress导读本文聚焦 Higress 网关中 McpBridge多集群/多注册中心服务发现桥接场景下的核心注解higress.io/destination完整讲解其按行解析的目的地格式、http:///https://scheme 语法、与higress.io/backend-protocol注解的优先级关系并配以源码级实现解读destination.go。读完本文你将能够在一张 Ingress 上同时配置多个按权重分配的后端目的地并为每个目的地独立指定 HTTP/HTTPS 协议实现混协议、多权重的精细化流量分发。背景为什么需要 destination 注解Higress 通过 McpBridge 自定义资源CRD接入 Nacos、Consul、Eureka、Zookeeper 等注册中心与 DNS 服务将注册中心的服务视为虚拟服务Virtual Service在网关上统一纳管。相关控制器实现见 mcpbridge/controller.go它监听McpBridge资源并驱动路由生成。在此基础上higress.io/destination注解允许在 Ingress 层面直接声明一组“目的地”每个目的地指向一个注册中心服务实例并可附带权重、端口与子集subset从而在不额外创建复杂路由资源的情况下完成多目的地按比例转发。该能力在 2.2.4 版本发布说明 中被正式引入支持在McpBridge中混用 HTTP/HTTPS 目标地址从注解中解析 scheme 保留按目标协议的元数据并驱动DestinationRule的生成同时对不同协议的后端应用相互独立的UpstreamTLS配置。注解格式总览higress.io/destination支持在一行内配置多个目的地每行一个每一行均独立解析其基本格式如下[weight%] [http://|https://]host[:port] [subset]各字段含义字段是否必填说明weight%可选该目的地的流量权重整数百分比省略时默认值为100。所有行的权重之和应等于100。http:///https://可选该目的地专用的协议 scheme只作用于当前这一行见下文“URI 语法”。host必填后端主机名通常是注册中心中的服务名如 Nacos 中的服务全名。:port可选后端端口省略时使用默认端口。subset可选目的地子集名称用于区分同一服务的不同版本/分组。一个典型的真实形态源码注释示例100% my-svc.DEFAULT-GROUP.xxxx.nacos:8080 v1即 100% 权重指向 Nacos 服务my-svc.DEFAULT-GROUP.xxxx.nacos的 8080 端口、v1子集。URI 语法规则关于 scheme 的语法约束官方文档给出了四点明确规则仅支持http://与https://两种 scheme。其他 scheme 不会被识别为协议标记。scheme 只作用于当前这一条目的地不会影响同一个注解里的其他行。这是“按目的地生效”的核心语义。如果省略 schemeHigress 不会为该条目记录独立的协议信息该条目会回退到higress.io/backend-protocol注解所声明的协议。如果higress.io/backend-protocol也未配置则该条目按默认的 HTTP 行为处理源码中默认协议常量defaultBackendProtocol HTTP见 upstreamtls.go。从源码看scheme 的识别发生在 splitDestinationProtocol 中它先将地址转为小写判断是否以http://或https://开头命中后剥离前缀并分别返回协议标记HTTP或HTTPS否则返回空字符串表示“未记录独立协议”。func splitDestinationProtocol(address string) (string, string) { lowerAddress : strings.ToLower(address) if strings.HasPrefix(lowerAddress, http://) { return address[len(http://):], HTTP } if strings.HasPrefix(lowerAddress, https://) { return address[len(https://):], HTTPS } return address, }与higress.io/backend-protocol的优先级higress.io/backend-protocol是 Ingress 层面的全局后端协议注解其合法取值由正则^(HTTP|HTTP2|HTTPS|GRPC|GRPCS)$约束见 upstreamtls.go。当它与higress.io/destination同时出现时优先级规则如下带 scheme 的目的地条目优先于higress.io/backend-protocol但该覆盖只对当前这一条目的生效不会扩散到其他行。不带 scheme 的条目继续使用higress.io/backend-protocol作为回退协议。同一个higress.io/destination中可以混用 HTTP 和 HTTPS 条目这正是该注解区别于单一全局协议注解的核心价值。完整示例与逐步解读以下配置取自官方文档同时设置了全局协议与三个按权重分配的目的地metadata: annotations: higress.io/backend-protocol: HTTPS higress.io/destination: | 34% http://plain.example.com:80 33% https://secure.example.com:443 33% inherited.example.com:8443逐行解读第一条34% http://plain.example.com:80虽然全局协议是 HTTPS但该行显式携带http://scheme因此强制使用 HTTP权重 34%。第二条33% https://secure.example.com:443显式声明https://使用 HTTPS权重 33%。第三条33% inherited.example.com:8443没有 scheme因此继承higress.io/backend-protocol: HTTPS即按 HTTPS 访问 8443 端口权重 33%。三条权重合计34% 33% 33% 100%满足权重合法性校验。源码级解析流程higress.io/destination的解析逻辑完整实现在 destination.go核心流程如下通过needDestinationConfig检查注解是否存在higress.io/destination存在才继续解析。使用bufio.Scanner按行拆分注解值splitLines保证“一行一个目的地”的语义。对每一行使用strings.Fields按空白切分字段若第一个字段以%结尾则解析为权重strconv.ParseInt否则权重默认100接着解析host[:port]端口通过最后一个冒号切分并校验端口值满足0 port 65536校验失败则视为纯主机名剩余字段作为subset子集。构造istio.io/api/networking/v1alpha3的HTTPRouteDestination含 Host、Subset、Port、Weight。若该行携带 scheme则以host:port为 keydestinationProtocolKey把协议写入Protocols映射供后续按目的地查询。所有行解析完毕后若权重之和weightSum ! 100记录一条 WARN 日志destination has invalid weight sum ...提示权重配置不合法。解析结果被封装为DestinationConfig其中Protocols map[string]string保存“主机:端口 → 协议”的映射并通过BackendProtocolForDestinationdestination.go按具体目的地精确查询协议。协议如何驱动 DestinationRule 与 UpstreamTLS解析出的按目的地协议最终通过 common/controller.go 中的WrapperConfigForMcpDestination生效若该目的地查不到独立协议protocol 直接返回原配置走higress.io/backend-protocol或默认 HTTP 逻辑若协议为HTTP将该目的地的UpstreamTLS置空即明文 HTTP 转发若协议为HTTPS构造UpstreamTLSConfig{BackendProtocol: HTTPS}若全局已有 UpstreamTLS 配置则在其基础上仅覆盖BackendProtocol字段——这正是“同一注解内不同目的地可拥有相互独立的 TLS 行为”的实现基础。随后UpstreamTLSConfig通过ApplyTrafficPolicyupstreamtls.go写入 Istio 的TrafficPolicy/PortTrafficPolicyHTTPS 协议走ClientTLSSettings_SIMPLE模式可选携带 SNIHTTP2/GRPC 协议额外设置 H2 连接池升级策略最终驱动DestinationRule的生成。这意味着你可以在一个注解内让部分目的地走明文 HTTP、部分走 TLS而无需为每个目的地分别创建路由资源。实战注意事项权重之和必须为 100源码会在和不为 100 时输出 WARN 日志destination.go虽不阻断配置但流量比例将不符合预期生产环境应避免。省略权重即默认 100若只写一行https://secure.example.com而不带权重其权重为 100等同于全量转发。scheme 是大小写不敏感的源码先将地址转为小写再判断前缀因此HTTP://、Https://均可被识别但剥离前缀时保留原始大小写实际 host 解析不受影响。端口省略如http://plain.example.com不写端口则该目的地不设置PortSelector回退到默认端口行为。与全局注解协同建议把“大多数目的地共用”的协议放在higress.io/backend-protocol仅对个别例外目的地显式写 scheme既清晰又少写冗余。相关阅读本注解的 FAQ 索引见 docs/faq/README.mdMcpBridge 协议与环境的完整示例见 samples/mcp限流等其他 FAQ 见 rate-limit-plugin-faq.md。总结higress.io/destination以“一行一目的地”的极简语法将多权重、多协议、多子集的复杂后端编排收敛进单个 Ingress 注解[weight%] [http://|https://]host[:port] [subset]。理解其 URI 语法仅 http/https、按行生效、与higress.io/backend-protocol的优先级显式 scheme 全局协议 默认 HTTP即可在生产中安全地混用 HTTP/HTTPS 目的地实现精细化的按目的地流量治理。【免费下载链接】higress AI Gateway | AI Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/hi/higress创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价