从零开始手写 dubbo rpc 框架-10-callType 调用方式

mac2026-04-05  4

callType 调用方式

说明

不同的场景我们会希望有不同的调用方式。

常见的有三种调用方式:

(1)sync 同步调用

(2)async 异步调用

(3)oneWay 单向调用

个人感觉(1)(3)是最常见的需求,所以本次优先实现了这两种。

实现思路

不同的调用方式只是处理的行为不同而已。

可以将这个配置传递,分别在 client/server 的端进行相应的处理。

客户端实现

调用方式策略

我这边为了拓展,client 端定义了一个 CallTypeStrategy 接口,后期只需要拓展实现这个类即可。

oneWay 实现

oneWay 和普通调用的区别就是客户端不关心调用的结果,所以直接返回 null 即可。

当然服务端也可以添加相应的判断,如果为 OneWay,则结果不再写回到客户端。

/** * one way 调用服务实现类 * * @author binbin.hou * @since 0.1.0 */ @ThreadSafe class OneWayCallTypeStrategy implements CallTypeStrategy { private static final Log LOG = LogFactory.getLog(OneWayCallTypeStrategy.class); /** * 实例 * * @since 0.1.0 */ private static final CallTypeStrategy INSTANCE = new OneWayCallTypeStrategy(); /** * 获取实例 * * @since 0.1.0 */ public static CallTypeStrategy getInstance() { return INSTANCE; } @Override public Object result(ProxyContext proxyContext, RpcRequest rpcRequest) { final String seqId = rpcRequest.seqId(); // 结果可以不是简单的 null,而是根据 result 类型处理,避免基本类型NPE。 RpcResponse rpcResponse = RpcResponses.result(null, rpcRequest.returnType()); LOG.info("[Client] call type is one way, seqId: {} set response to {}", seqId, rpcResponse); // 获取结果 return RpcResponses.getResult(rpcResponse); } }

测试代码

注册中心

启动

server

启动

client

测试代码

设置调用方式为 ONE_WAY

config.callType(CallTypeEnum.ONE_WAY); 日志

直接结果输出就是 null,但是服务端会完整执行该调用。

[INFO] [2019-11-01 22:04:12.810] [main] [c.g.h.r.c.p.i.DefaultReferenceProxy.invoke] - [Client] start call channel id: 502b73fffec4485c-000023a4-00000001-4368b4ca18a7e26b-450829db [INFO] [2019-11-01 22:04:12.815] [main] [c.g.h.r.c.p.i.DefaultReferenceProxy.invoke] - [Client] start call remote with request: DefaultRpcRequest{seqId='e9cf6ca177c74ce1bfdc971d1ab5c1af', createTime=1572617052789, serviceId='calc', methodName='sum', paramTypeNames=[com.github.houbb.rpc.server.facade.model.CalculateRequest], paramValues=[CalculateRequest{one=10, two=20}], callType=1, returnType=class com.github.houbb.rpc.server.facade.model.CalculateResponse} [INFO] [2019-11-01 22:04:12.815] [main] [c.g.h.r.c.i.i.DefaultInvokeService.addRequest] - [Client] start add request for seqId: e9cf6ca177c74ce1bfdc971d1ab5c1af, timeoutMills: 60000 [INFO] [2019-11-01 22:04:12.819] [main] [c.g.h.r.c.s.c.i.OneWayCallTypeStrategy.result] - [Client] call type is one way, seqId: e9cf6ca177c74ce1bfdc971d1ab5c1af set response to DefaultRpcResponse{seqId='null', error=null, result=null} null
最新回复(0)