RMI hostname与hosts源码原理java.net.ConnectException: Connection timed out: connect xdubbo agent解读(2)
原本只想拦截远程java进程,没想到倒是rmi访问远程出了鬼,是个什么鬼呢
java.net.ConnectException: Connection timed out: connect
连接超时
解决思路:
1、我们telnet xxxx 却是通的
2、异常221.179.46.190应该是虚拟的,是根据创建socket connect时找不到目标服务器,存根代理的虚拟生成的
根据jdk rt.jar源码了解到221.179.46.190整个生产流程
Naming[registry.lookup(parsed.name)]-->客户端注册存根RegistryImpl_Stub[Remote lookup(String var1)]...注入invoke.....读对象流等.....RemoteObject[readObject(java.io.ObjectInputStream in)]--> UnicastRef[readExternal(ObjectInput var1)] --> LiveRef[LiveRef read(ObjectInput var0, boolean var1)] -->TCPEndpoint[TCPEndpoint readHostPortFormat(DataInput var0)]
三张比较关键的点
3, 从第2点分析得知,我们的centos hostname设置的有问题或者说hosts有问题
我们现在看看centos的实际情况
hostname
hosts
修改
看到没有,为什么我改成2个呢? 一个是k8s-node-1 一个是k8s,其实有k8s-node-1一个就足够了,这是为了说明hostname与hosts在远程发起tcp请求时的异同,相同点是hostname与hosts同域名,则socket请求鉴权会通过,若hosts其中一个不与hostname同域名,则鉴权失败就会回到连接超时直到失败,从源码socket得知是通过hostname来映射hosts的ip的
发起客户端请求,测试成功!