RPC接口设计的一些想法
RPC 项目结构
RPC项目一般会包含两个模块(module),xx-rpc
和xx-server
(可能命名上有所不同),以demo
项目为例:
1 | <groupId>com.example</groupId> |
其中demo-rpc
定义了对外暴露的接口和对象,最终会被打成jar
提供给外部使用;而demo-server
即为一个独立的服务,依赖demo-rpc
并实现对应的接口。
RPC 接口设计的一些想法
单参数接口
接口使用单参数,会解决一部分RPC接口重载的问题。单参数扩展性强,如需要添加查询属性,只需修改查询请求对象,而无需新增请求接口。
如我们会经常看到这种接口:
1 | public interface ExampleService{ |
如果我们换成单参数接口:
1 | public interface ExampleService{ |
单参数可以统一继承AbstractQueryRequest
对象,我们可以在AbstractQueryRequest
中定义一些公共属性,如clientIp
,requestId
等,同时更方便的做统一日志记录等操作。
接口异常设计
接口异常设计在于如何通过区分出系统异常与业务异常,系统异常通过对客户端抛出Exception
,由客户端处理;业务异常可以封装一个Response
对象,一般其中定义了是否成功以及错误信息等:
1 | public interface ExampleService { |
异常与熔断
RPC接口调用失败是常态,所以一般不会直接让客户端直接调用RPC接口,而会在RPC接口上封装一层,用来熔断,降级等(如使用Hystrix
):
1 | public class ExampleServiceProxy { |