Skip to content

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

Description

@LINhunger

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

在单例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却不是单例而导致的。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions