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