NettyRPC
NettyRPC copied to clipboard
客户端对不同地址的服务器进行RPC调用问题
在阅读作者源码的时候,发现了这样一个问题:
在单例RpcServerLoader中封装了messageSendHandler:
public class RpcServerLoader {
...
private MessageSendHandler messageSendHandler = null;
...
}
而messageHandler一个的重要作用就是就是向RPC服务器发送信息:
public class MessageSendProxy<T> extends AbstractInvocationHandler {
@Override
public Object handleInvocation(Object proxy, Method method, Object[] args) throws Throwable {
...
MessageSendHandler handler = RpcServerLoader.getInstance().getMessageSendHandler();
MessageCallBack callBack = handler.sendRequest(request);
return callBack.start();
}
}
这样就会发生一个bug,就是当我们的客户端连接到了多台RPC服务器时,就会产生多个messageHandler对象,所以当我们执行:
RpcServerLoader.getInstance().getMessageSendHandler();
的时候。就可能拿到的是别的PRC服务器的messageHandler,然后往错误的IP地址发送请求。
我们可以看下面的例子:
设置两个service调用不同地址的RPC服务:
在MessageHandler的channelRead方法中设置一个日志:
其他代码都不变。
在两台电脑都启动RPC服务器,调用RpcParallelTest测试用例(parallel =1)
可以发现,原本要调用本地RPC服务的加法运行,调用了另一台机器上RPC服务的。
究其原因,我觉得应该是RpcServerLoader设计成了单例模式,而MessageSendHandler却不是单例而导致的。
应该使用连接管理器的方式,用ip:port作为key,管理多个服务器的连接
其实,我看了看作者在其它问题下的回复,这个项目的设计应该只考虑了 一个客户端对一个服务器进行RPC调用的情况