微服务拆分实战:以 proto 为契约
微服务拆分实战 📖 前置阅读:本文假设读者已掌握 Protobuf 语法和 SpringBoot gRPC 的基本用法。如果还不熟悉,建议先阅读 Protobuf 语法精讲与 gRPC 概念 和 SpringBoot gRPC 全操作指南。 一、⚡ 微服务拆分后的第一个难题 你把这个巨大的 SpringBoot 单体应用拆成了三个微服务——订单服务、用户服务、商品服务。拆得很干净——各自有自己的数据库、各自独立部署。 然后你发现了一个问题:订单服务在创建订单时需要查用户信息、扣商品库存——这三个服务之间怎么通信? 创建订单的流程: OrderService → 查用户是否存在 → UserService OrderService → 查商品价格 + 库存 → ProductService OrderService → 创建订单 → 自己的数据库 REST 当然能做——但这里有一个更关键的问题:你怎么保证 OrderService 调 UserService 的参数格式不出错? UserService 说它接收 GET /users/{id} 返回 {"userId": 1, "userName": "张三"}。OrderService 的开发者在代码里写了 restTemplate.getForObject("/users/" + userId, UserDTO.class) —— 但 UserDTO 的字段名是 user_name 还是 userName?谁说了算? proto 文件就是"谁说了算"的答案——它就是服务之间的契约。 二、🧬 以 proto 为契约:核心思想 没有契约(REST 口头约定): OrderService 开发者问 UserService 开发者:"你的接口返回什么字段?" UserService 开发者:"userName 和 userId" OrderService 写代码 → 字段名写成了 username → 运行时炸了 有契约(proto): user.proto 里写死了 User 的字段和类型 UserService 实现时 → 必须遵守 OrderService 调用时 → 编译器帮你检查 → 字段名不一致?编译都过不了——根本跑不起来 proto 是微服务之间的"合同"——双方签字画押,编译器当法官。谁不遵守谁编译不过。 ...