[apache/dubbo]dubbo版本2.5.3 dubbo服务启动的主机 与 zk集群环境 同处于一个网络中,服务端日志频现如下日志

2024-05-30 123 views
2

日志如下:此 ip port 124.89.187.133:10354 并不是机房内ip 很是奇怪,日志了很大 高频率刷日志。

INFO|[DubboProtocol]-[130] - [DUBBO] disconected from /124.89.187.133:10354 ,url: dubbo://XX.XX.XX.XX:port/com.ifre.facade.XXXXX.AccountService?actives=10& anyhost=true&application=XXX-service-XXXX&channel.readonly.sent=true& codec=dubbo&default.accepts=1000&default.executes=20&d efault.threadpool=fixed&default.threads=200&default.timeout=30000& dubbo=2.5.3&group=cftool&heartbeat=60000& interface=com.ifre.facade.XXXX.AccountService& methods=register,checkLogin,accountActive,updateUser,sendMail& monitor=dubbo%3A%2F%2FXX.XX.XX.XX%3A2183%2Fcom. alibaba.dubbo.registry.RegistryService%3Fapplication%3DXXXX-service-XXXX%26backup%3DXX.XX.XX.XX%3Aport%2CXX.XX.XX.XX%3Aport% 26dubbo%3D2.5.3%26file%3D%2Fhome%2Fifre%2F.dubbo%2Fdubbo-registry-XXXX.cache %26pid%3D17028%26protocol%3Dregistry%26refer%3Ddubbo%253D2.5.3%2526interface%2 53Dcom.alibaba.dubbo.monitor.MonitorService%2526pid%253D17028%2526timestamp%253D1 472177030946%26registry%3Dzookeeper%26timestamp%3D1472177030829&pid=17028&retries=0& revision=1.1-SNAPSHOT&side=provider&timestamp=1472177030836&version=1.0, dubbo version: 2.5.3, current host: XX.XX.XX.XX

回答

6

问题补充 , 其他dubbo服务 在zk的集群环境主机启动就没有类似的这样日志出现。

7

这个是你开启了监控,把监控关闭即可

9

dubbo内部获取IP记得是获取默认的网卡的IP,也包括你的虚拟网卡,可以在服务配置的时候指定hostname为你的IP即可。

2

dubbo-provider.xml 配置文件。 服务端部署在${dubbo.registry.address}集群环境中就无问题。很奇怪。

    <!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="XXXx-service-XXXx" />

<!-- 用dubbo协议在24880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="24880" />

<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" />

<!-- 监控中心配置  -->
    <dubbo:monitor protocol="registry"/>

<dubbo:provider timeout="30000" threads="200" threadpool="fixed"  executes="20" accepts="1000" />
<!-- 1 账户服务类 接口 -->
<dubbo:service interface="com.ifre.facade.account.AccountService" ref="accountService"  group="xxx" version="1.0" retries="0" actives="10"/>
5
private <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url) {
        RegistryDirectory<T> directory = new RegistryDirectory<T>(type, url);
        directory.setRegistry(registry);
        directory.setProtocol(protocol);
     //这里获取本地网卡地址NetUtils.getLocalHost()
        URL subscribeUrl = new URL(Constants.CONSUMER_PROTOCOL, NetUtils.getLocalHost(), 0, type.getName(), directory.getUrl().getParameters());
        if (! Constants.ANY_VALUE.equals(url.getServiceInterface())
                && url.getParameter(Constants.REGISTER_KEY, true)) {
            registry.register(subscribeUrl.addParameters(Constants.CATEGORY_KEY, Constants.CONSUMERS_CATEGORY,
                    Constants.CHECK_KEY, String.valueOf(false)));
        }
        directory.subscribe(subscribeUrl.addParameter(Constants.CATEGORY_KEY, 
                Constants.PROVIDERS_CATEGORY 
                + "," + Constants.CONFIGURATORS_CATEGORY 
                + "," + Constants.ROUTERS_CATEGORY));
        return cluster.join(directory);
    }

  //NetUtils.getLocalHost()方法内部调用了如下方法
 /**
     * 遍历本地网卡,返回第一个合理的IP。
     * 
     * @return 本地网卡IP
     */
    public static InetAddress getLocalAddress() {
        if (LOCAL_ADDRESS != null)
            return LOCAL_ADDRESS;
        InetAddress localAddress = getLocalAddress0();
        LOCAL_ADDRESS = localAddress;
        return localAddress;
    }
3

在 provider所在的机器,ping下 hostname,看返回的IP是不是124.89.187.133。 如果是的话,请确认hosts文件正确

8

坑爹的InetAddress getLocalHost函数 http://www.cnblogs.com/jizhao/p/4081675.html

坑爹的就是InetAddress.getLocalHost返回了一个错误的IP地址。为什么这个函数会返回一个错误的地址,因为这个函数的原理是通过 获取本机的hostname,然后对此hostname做解析,从而获取IP地址的。那么问题来了,如果在本机的/etc/hosts文件里对这个主机名指向了一个错误的IP地址,那么InetAddress.getLocalHost就会返回这个错误的IP地址。当然如果你的hostname是到DNS 去解析的,碰巧DNS上的信息也是错的,也同样是悲惨结局。

遇到同样问题的人,可以先检查下hosts文件的设置里面A地址指向哪里了,然后看一下DNS解析出的地址。当然如果dubbo的代码检查一下,这个返回 的地址,是不是真的是本机的IP地址,也不会出现这个问题了,归根结底还是dubbo的开发人员太相信InetAddress.getLocalHost 了,这货自己应该确保不会出现这样的乌龙事件的。你返回一个不是本机的IP地址作为本机的IP地址,这个在语义上就错误了。不管你用了多么愚蠢的算法,结果就是不应该返回一个不是本地的IP地址作为本地的地址,不是吗?否则还叫什么狗屁get local host!!!