rpc契约核心是java接口,作为服务提供方与消费方的统一协议约定,要求接口可序列化、方法签名稳定、参数返回值为pojo,通过共享api.jar实现共用,并由dubbo/grpc/feign等框架完成透明远程调用。

Java 中通过接口实现分布式服务 RPC 契约,核心是把接口定义作为服务提供方与消费方之间的**统一协议约定**,不涉及具体实现,只描述“能做什么”。关键在于:接口要可序列化、方法签名稳定、参数返回值类型受限(推荐 POJO),并配合 RPC 框架完成远程调用的透明化。
接口设计:契约即接口本身
RPC 契约的本质就是 Java 接口(interface),它必须满足以下要求:
- 所有方法必须声明抛出 RuntimeException 或其子类(避免检查异常在跨网络时语义丢失)
- 入参和返回值类型尽量使用 JDK 自带或常见序列化友好的类型(如 String、Long、List
、Map ) - 自定义对象需实现 Serializable(适用于 Java 原生序列化),或更推荐使用 Protobuf/JSON 兼容结构(如 Lombok + 无参构造 + getter/setter)
- 接口和方法名、参数顺序不能随意变更,否则破坏契约兼容性
共享接口:服务端与客户端共用同一份 .jar
最常用且可靠的方式是将接口及 DTO 打包为独立模块(如 api.jar),由服务提供方发布到 Maven 仓库,消费方直接依赖:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 服务端实现该接口,并用 RPC 框架(如 Dubbo、gRPC-Java、Spring Cloud Alibaba)暴露为远程服务
- 客户端引入同一份 api.jar,通过框架提供的代理机制(如 Dubbo 的 @Reference)获取接口实例
- 调用时像本地一样写 user = userService.findById(123),底层自动走网络请求
框架适配:不同 RPC 方式对接口的要求略有差异
不同框架对接口的约束不同,需注意:
- Dubbo:支持纯 Java 接口,依赖 ZooKeeper/Nacos 注册中心,接口方法默认支持异步、泛化调用
- gRPC-Java:不直接用 Java 接口,而是用 .proto 文件定义契约,再生成接口和 stub 类;但生成的 xxxGrpc.XxxBlockingStub 仍可视为逻辑上的“服务接口”
- Spring Cloud OpenFeign:用 @FeignClient 注解标记接口,内部基于 HTTP + JSON,要求接口方法用 @GetMapping/@PostMapping 等注解声明路径和参数绑定
版本管理:契约演进必须向后兼容
接口一旦上线,修改需谨慎:
- 新增方法或字段可以,删除或重命名会直接导致调用失败
- 推荐用 语义化版本号(如 v1.0.0 → v1.1.0)管理 api.jar,并配合多版本共存(Dubbo 支持 version 属性)
- 必要时引入 DTO 分层(如 UserDTO 和 UserVO),避免将内部实体直接暴露为契约
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










