日志如下:此 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×tamp=1472177030836&version=1.0, dubbo version: 2.5.3, current host: XX.XX.XX.XX
问题补充 , 其他dubbo服务 在zk的集群环境主机启动就没有类似的这样日志出现。
这个是你开启了监控,把监控关闭即可
dubbo内部获取IP记得是获取默认的网卡的IP,也包括你的虚拟网卡,可以在服务配置的时候指定hostname为你的IP即可。
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"/>
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;
}
在 provider所在的机器,ping下 hostname,看返回的IP是不是124.89.187.133。
如果是的话,请确认hosts文件正确
坑爹的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!!!
The solution to the problem of multiple network cards is here: https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker
You can aslo configure them in the server hosts file