多语言微服务
衔接 spring-cloud、grpc。
30 分钟
多语言微服务
Polyglot microservices:每个服务用一种最适合的语言写,通过 网络契约 协作。与 spring-cloud-essentials 的 Java 集群内治理 互补——Eureka/Gateway 仍可作 统一入口,后面挂 Java、Go、Python 实例。关键是 平台能力共享,而不是 各写各的运维。
学习目标
- 设计多语言微服务的平台基线(观测、配置、CI)
- 衔接 Spring Cloud 与 gRPC 在异构栈中的角色
- 识别 polyglot 带来的组织与运维成本
参考架构
┌─────────────────────┐
│ Spring Cloud Gateway │ Java
└──────────┬──────────┘
HTTP/gRPC │ HTTP
┌────────────┬───────────┼───────────┬────────────┐
▼ ▼ ▼ ▼ ▼
Java 用户域 Go 搜索 Python 推荐 Node BFF PHP 遗留 CMS
(Boot) (gRPC) (REST) (聚合) (仅内网)
- 网关:鉴权、限流、路由——sc-gateway
- 注册发现:Java 用 Eureka;Go 可 同样注册 或 K8s Service + DNS
- 配置:Spring Cloud Config + 各语言读环境变量/ sidecar
- RPC:grpc-essentials 统一内部 east-west 流量
必须统一的「平台面」
| 能力 | 说明 |
|---|---|
| 追踪 | OpenTelemetry,trace 跨 Java→Go |
| 日志 | JSON 结构化,同一 trace_id |
| 指标 | Prometheus 命名规范一致 |
| 契约 | Proto 仓库 + breaking change review |
| CI | 单 mono-repo 或多 repo,proto 变更触发多语言 build |
| 安全 | mTLS 或服务 mesh;secrets 不进镜像 |
语言边界原则
- 按 bounded context 切,不按「谁喜欢 Go」切
- 数据所有权:一服务一库;跨语言 禁止共享 DB 表写
- 同步链路过短:BFF → 域服务 → 读模型,避免 A→B→C→D 全 sync
- 失败隔离:sc-circuit-breaker 对 HTTP 客户端同样适用