路由 · 服务 · 服务来源
今天理清三个容易混的概念:路由(怎么转发)、服务(转发到哪,只读)、服务来源(从哪发现服务)。重点在服务来源——8 种注册中心如何全部塞进一个名为 default 的 McpBridge CR。
三个概念的关系
nacos 服务来源(指向公司 Nacos)→ Higress 自动发现 order-service、user-service 等服务(只读)→ 你建路由 /order 时,从这些服务里挑 order-service 当后端。- 服务来源(ServiceSource):告诉 Higress"去哪个注册中心发现服务"(Nacos/K8s/…)。
- 服务(Service):从服务来源发现到的服务,只读。
- 路由(Route):把匹配的请求转发到某个(些)服务。
路由回顾
路由第 2 周已深入(Day 10)。快速回顾:RoutesController(/v1/routes)→ RouteServiceImpl(依赖 K8sClient/ModelConverter/WasmPluginInstanceService/ConsumerService)→ route2Ingress 转成 Ingress + 注解。
use-regex 注解。服务只读
👨🏫:不是。服务不是你在 Console 里造出来的,而是网关从注册中心实时发现的——实例上线下线由各服务自己决定,Console 只是"看客"。
👶:那我想让列表里出现新服务怎么办?
👨🏫:去动服务来源(换注册中心 / 加过滤),而不是改服务本身。所以"服务只读"完全符合服务发现的语义。
ServicesController.java(/v1/services,:36)仅 GET list(:44)。ServiceServiceImpl.list(:61)的数据来自 Istio 的 registryz/endpoint。Service.java:name/namespace/port/version/endpoints/protocol。
服务来源 Controller
ServiceSourceController.java(/v1/service-sources,:46):list(:53,stripSensitiveInfo 抹掉认证信息)、add(:65)、addOrUpdate(:81)、delete(:99)、query(:112)。
stripSensitiveInfo 把认证密码/token 抹掉再返回前端——敏感信息只写不读回,避免密码在界面泄露。这是安全设计的常见做法。8 种注册中心
ServiceSource.java:ALLOWABLE_TYPES(:52-55)= nacos / nacos2 / nacos3 / zookeeper / consul / eureka / static / dns;validate(:121-196)按类型分派专用校验器(Nacos/Consul/Static/Dns)。
nacos3 支持 MCP Server(V1McpBridge.MCP_SUPPORTED_REGISTRY_TYPES,Day 15 用到)。全部存进一个 McpBridge CR
关键设计:所有服务来源存进一个名为 default 的 McpBridge CR 的 spec.registries[] 数组。ServiceSourceServiceImpl:
list :61 // 读 default McpBridge 的 registries
add :169 // readMcpBridge(default) → addV1McpBridgeRegistry → replace
// 转换:KubernetesModelConverter.addV1McpBridgeRegistry :1728
// removeV1McpBridgeRegistry :1752 / fillV1RegistryConfig :1860
CRD 常量 crd/mcp/V1McpBridge.java:27-35:group networking.higress.io、kind McpBridge、plural mcpbridges、DEFAULT_NAME=default。
认证单独存 Secret
ServiceSourceServiceImpl.syncAuthSecret(:207)把注册中心的认证信息(用户名/密码/token)单独存进 K8s Secret,McpBridge 的 registry 项里只存 authSecretName(引用)。
今日小结 + 动手
🧠 今天你应该能回答
- 服务来源、服务、路由三者的上下游关系?
- 为什么服务只读?想改变服务列表该动什么?
- 8 种注册中心有哪些?哪个支持 MCP?
- 服务来源为什么全存进一个 default McpBridge?认证信息存哪?
✋ 动手
cd /Users/bitmart/work/codes/github/higress-group/higress-console/backend/sdk/src/main/java/com/alibaba/higress/sdk
sed -n '52,55p' model/ServiceSource.java
sed -n '61,210p' service/ServiceSourceServiceImpl.java
sed -n '27,81p' service/kubernetes/crd/mcp/V1McpBridge.java