订单服务刚拆成独立仓库,客户端调创建接口报 grpc: error unmarshalling response: mismatched message type: got "order.v2.Order" want "order.v1.Order",但两边打印的类名都是 Order。乍看像缓存或者权限的锅,追下去往往不是。
System.out.println(Order.getDescriptor().getFullName()); // 期望输出 order.v1.Order 而不是 order.v2.Order
追下去是这么回事:protobuf 的类型身份是完整包名,不是简单的 message 名。两个仓库各自维护了一份 Order,包名不同,序列化后的字节一样,反序列化时按类型名校验就过不去。
「gRPC 消息类型不匹配」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
具体做法是,把 proto 抽到独立的公共仓库 两边只引同一份生成代码;确认 go_package 和 java_package 完全一致;不能合并时在网关做一次字节转发 不要跨进程传生成对象;回归时打印 message 的 descriptor full name 对比。
验收就看一点,客户端和服务端打印的 descriptor full name 一致 调用不再报 mismatched message type。
