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

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值