NettyRPC icon indicating copy to clipboard operation
NettyRPC copied to clipboard

客户端对不同地址的服务器进行RPC调用问题

Open LINhunger opened this issue 7 years ago • 2 comments

在阅读作者源码的时候,发现了这样一个问题:

在单例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服务:

a

在MessageHandler的channelRead方法中设置一个日志:

b

其他代码都不变。

在两台电脑都启动RPC服务器,调用RpcParallelTest测试用例(parallel =1)

c

可以发现,原本要调用本地RPC服务的加法运行,调用了另一台机器上RPC服务的。

究其原因,我觉得应该是RpcServerLoader设计成了单例模式,而MessageSendHandler却不是单例而导致的。

LINhunger avatar Jan 16 '18 08:01 LINhunger

应该使用连接管理器的方式,用ip:port作为key,管理多个服务器的连接

yjy1304 avatar Mar 24 '18 09:03 yjy1304

其实,我看了看作者在其它问题下的回复,这个项目的设计应该只考虑了 一个客户端对一个服务器进行RPC调用的情况

xuweilin2014 avatar Apr 26 '20 18:04 xuweilin2014