当前位置: 首页 > news >正文

枣庄网站建设公司百度一键安装

枣庄网站建设公司,百度一键安装,芜湖市政府网站建设情况,汕头论坛建站模板这篇文章讲述了PowerJob获取本地IP离奇曲折的经过,以及开放了诸多的可配置参数,打开了我新世界的大窗户。求个关注,求个点赞,求一个评论。 获取地址的操作,本来不应该作为什么重点,但是因为一点小小的意外&…

这篇文章讲述了PowerJob获取本地IP离奇曲折的经过,以及开放了诸多的可配置参数,打开了我新世界的大窗户。求个关注,求个点赞,求一个评论。

获取地址的操作,本来不应该作为什么重点,但是因为一点小小的意外,导致我对这个环节格外的研究了一下,所以就总结了一下。

先来一段文字,描述一下大致的流程,然后再从源代码中研究一下:

  1. 先是判断内存是否已经存了IP地址,如果存了,则直接返回保存了个IP地址。

  2. 从jvm虚拟机中获取配置绑定的IP地址,如果绑定了,则直接返回绑定的IP地址。

  3. 获取所有的网卡信息,进行遍历。

  4. 忽略一些无效的网卡信息,比如:虚拟机网口,关闭的网口,启动时配置的忽略网口(主要是用过网卡名字和描述名字)。

  5. 通过启动时的配置“powerjob.network.interface.preferred”,获取对应的地址,如果有,则直接返回对应的IP地址。

  6. 对剩余的网卡信息进行遍历,如果遍历到的IP地址合法有效(格式正确并可以ping通),则直接返回该合法有效的ip。

  7. 直接返回第一条格式正确的IP地址。

  8. 获取InetAddress.getLocalHost()得到的IP地址。

经过上述一系列的复杂操作,如果没有配置的话,获得到IP地址可能会无效。

简单的开端

public static String getLocalHost() {
//1.先是判断内存是否已经存了IP地址,如果存了,则直接返回保存了个IP地址。if (HOST_ADDRESS != null) {return HOST_ADDRESS;}//2.从jvm虚拟机中获取配置绑定的IP地址,如果绑定了,则直接返回绑定的IP地址。String addressFromJVM = System.getProperty(PowerJobDKey.BIND_LOCAL_ADDRESS);if (StringUtils.isNotEmpty(addressFromJVM)) {log.info("[Net] use address from[{}]: {}", PowerJobDKey.BIND_LOCAL_ADDRESS, addressFromJVM);return HOST_ADDRESS = addressFromJVM;}//第三步在这个方法里面,但是还需要不断的深入才能找到!InetAddress address = getLocalAddress();if (address != null) {return HOST_ADDRESS = address.getHostAddress();}return LOCALHOST_VALUE;
}

一切的开端都是从上面的代码开始的。开始很简单,过程却很复杂。

曲折的经过

第1,2步已经出现,这第3步的出现却需要层层的传送~

public static InetAddress getLocalAddress() {//这个方法只是一个传送门,将其传送到getLocalAddress0
}private static InetAddress getLocalAddress0() {//这个方法也只是传送门,不过这个方法在之后还会出现的InetAddress addressOp = getFirstReachableInetAddress( findNetworkInterface());... ...return localAddress;
}public static NetworkInterface findNetworkInterface() {//传送门依旧,该方法之后也会再次出现List<NetworkInterface> validNetworkInterfaces = emptyList();try {validNetworkInterfaces = getValidNetworkInterfaces();} catch (Throwable e) {log.warn("[Net] findNetworkInterface failed", e);}... ...
}private static List<NetworkInterface> getValidNetworkInterfaces() throws SocketException {List<NetworkInterface> validNetworkInterfaces = new LinkedList<>();//3.获取所有的网卡信息,进行遍历。Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();//4.忽略一些无效的网卡信息,比如:虚拟机网口,关闭的网口,//启动时配置的忽略网口(主要是用过网卡名字和描述名字)。while (interfaces.hasMoreElements()) {NetworkInterface networkInterface = interfaces.nextElement();if (ignoreNetworkInterface(networkInterface)) {continue;}// 根据用户 -D 参数忽略网卡if (ignoreInterfaceByConfig(networkInterface.getDisplayName()) || ignoreInterfaceByConfig(networkInterface.getName())) {continue;}validNetworkInterfaces.add(networkInterface);}return validNetworkInterfaces;
}//忽略的网卡内容
private static boolean ignoreNetworkInterface(NetworkInterface networkInterface) throws SocketException {return networkInterface == null|| networkInterface.isLoopback()|| networkInterface.isVirtual()|| !networkInterface.isUp();
}
static boolean ignoreInterfaceByConfig(String interfaceName) {String regex = System.getProperty(PowerJobDKey.IGNORED_NETWORK_INTERFACE_REGEX);if (StringUtils.isBlank(regex)) {return false;}if (interfaceName.matches(regex)) {log.info("[Net] ignore network interface: {} by regex({})", interfaceName, regex);return true;}return false;
}

精彩的高潮

 

找到了本地所有的网卡信息,并且忽略掉了很多没有用的网卡信息,接下来就是通过偏好来选择合适的网卡地址来进行通信,一开始我没有发现这一条信息,在官方文档中也没有找到对应的配置,一度以为这个ip地址无法选择,甚至我使用的服务器,第一条网卡信息是docker的,结果就直接给我用的docker的地址,直接给我整混乱了,还好我还能看懂这么一点代码,不得不说,作者这个代码确实厉害,直接打开我新世界的大门,但是你开门开的好,你得跟我说一声啊,你不说我都没法往门里进啊。

public static NetworkInterface findNetworkInterface() {List<NetworkInterface> validNetworkInterfaces = emptyList();try {validNetworkInterfaces = getValidNetworkInterfaces();} catch (Throwable e) {log.warn("[Net] findNetworkInterface failed", e);}// Try to find the preferred onefor (NetworkInterface networkInterface : validNetworkInterfaces) {if (isPreferredNetworkInterface(networkInterface)) {log.info("[Net] use preferred network interface: {}", networkInterface.getDisplayName());return networkInterface;}}...return first(validNetworkInterfaces);
}public static boolean isPreferredNetworkInterface(NetworkInterface networkInterface) {
//5.通过启动时的配置“powerjob.network.interface.preferred”,获取对应的地址,如果有,则直接返回对应的IP地址。String preferredNetworkInterface = System.getProperty(PowerJobDKey.PREFERRED_NETWORK_INTERFACE);if (Objects.equals(networkInterface.getDisplayName(), preferredNetworkInterface)) {return true;}// 兼容直接使用网卡名称的情况,比如 Realtek PCIe GBE Family Controllerreturn Objects.equals(networkInterface.getName(), preferredNetworkInterface);
}

无奈的结局

我认为通过偏好选择网卡信息就已经非常好了,如果没有偏好设置,默认选择第一条网卡信息这个策略也是不错,之后是选择一条能够访问的地址,最后如果都不行,就破罐子破摔的来获取一个地址,反正必须要返回一个地址,即使这个地址有问题,也得返回了,如果要是一般的网络环境,我觉得这也挺好的,万一有那么一个公司,内网互相通讯还需要代理,这可就恶心了,太恶心了。

public static NetworkInterface findNetworkInterface() {List<NetworkInterface> validNetworkInterfaces = emptyList();try {validNetworkInterfaces = getValidNetworkInterfaces();} catch (Throwable e) {log.warn("[Net] findNetworkInterface failed", e);}// Try to find the preferred onefor (NetworkInterface networkInterface : validNetworkInterfaces) {if (isPreferredNetworkInterface(networkInterface)) {log.info("[Net] use preferred network interface: {}", networkInterface.getDisplayName());return networkInterface;}}
//6.对剩余的网卡信息进行遍历,如果遍历到的IP地址合法有效(格式正确并可以ping通),则直接返回该合法有效的ip。for (NetworkInterface networkInterface : validNetworkInterfaces) {InetAddress addressOp = getFirstReachableInetAddress(networkInterface);if (addressOp != null) {return networkInterface;}}
//7.直接返回第一条格式正确的IP地址。return first(validNetworkInterfaces);
}private static InetAddress getFirstReachableInetAddress(NetworkInterface networkInterface) {if(networkInterface == null ){return null;}Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();while (addresses.hasMoreElements()) {Optional<InetAddress> addressOp = toValidAddress(addresses.nextElement());if (addressOp.isPresent()) {try {if (addressOp.get().isReachable(100)) {return addressOp.get();}} catch (IOException e) {// ignore}}}return null;
}public static <T> T first(Collection<T> values) {if (values == null || values.isEmpty()) {return null;}if (values instanceof List) {List<T> list = (List<T>) values;return list.get(0);} else {return values.iterator().next();}
}

private static InetAddress getLocalAddress0() {// @since 2.7.6, choose the {@link NetworkInterface} firsttry {InetAddress addressOp = getFirstReachableInetAddress( findNetworkInterface());if (addressOp != null) {return addressOp;}} catch (Throwable e) {log.warn("[Net] getLocalAddress0 failed.", e);}InetAddress localAddress = null;try {
//8.获取InetAddress.getLocalHost()得到的IP地址。localAddress = InetAddress.getLocalHost();Optional<InetAddress> addressOp = toValidAddress(localAddress);if (addressOp.isPresent()) {return addressOp.get();}} catch (Throwable e) {log.warn("[Net] getLocalAddress0 failed.", e);}return localAddress;
}

总结

 

其实大部分人是不需要了解这部分代码的,基本都不会有啥问题,因为大部分人使用的都是正常人使用的网络,只有我们公司这1万来人用的是不正常人使用的网络,但是万一遇到这方面的问题,了解一下还是好的。


文章转载自:
http://dinncothermophil.bpmz.cn
http://dinncobastille.bpmz.cn
http://dinncoflagitate.bpmz.cn
http://dinncoapsis.bpmz.cn
http://dinncohershey.bpmz.cn
http://dinncoaphrodisia.bpmz.cn
http://dinncoterebic.bpmz.cn
http://dinncoarcheological.bpmz.cn
http://dinncoschistous.bpmz.cn
http://dinncodjebel.bpmz.cn
http://dinncoonload.bpmz.cn
http://dinncofrondescence.bpmz.cn
http://dinnconarrowfisted.bpmz.cn
http://dinncopredicate.bpmz.cn
http://dinncoboat.bpmz.cn
http://dinncocomint.bpmz.cn
http://dinncotoots.bpmz.cn
http://dinncoagma.bpmz.cn
http://dinncotransvaluation.bpmz.cn
http://dinncomelaena.bpmz.cn
http://dinncolaunderette.bpmz.cn
http://dinncounawares.bpmz.cn
http://dinncopasty.bpmz.cn
http://dinncozootomist.bpmz.cn
http://dinncojotunnheim.bpmz.cn
http://dinncophenakite.bpmz.cn
http://dinnconabs.bpmz.cn
http://dinncopersona.bpmz.cn
http://dinncoendogen.bpmz.cn
http://dinncosugarplum.bpmz.cn
http://dinncomiscellanist.bpmz.cn
http://dinncoungenerosity.bpmz.cn
http://dinncorigmarolish.bpmz.cn
http://dinncoreadjustment.bpmz.cn
http://dinncostrongpoint.bpmz.cn
http://dinncophotoreaction.bpmz.cn
http://dinncomythogenesis.bpmz.cn
http://dinncofinlandization.bpmz.cn
http://dinncodirectness.bpmz.cn
http://dinncopolyangular.bpmz.cn
http://dinncounrhymed.bpmz.cn
http://dinncoisobutene.bpmz.cn
http://dinncomyrtle.bpmz.cn
http://dinncohaematocyte.bpmz.cn
http://dinncomagnificent.bpmz.cn
http://dinncouses.bpmz.cn
http://dinncochlorphenol.bpmz.cn
http://dinncodistention.bpmz.cn
http://dinncoimperforation.bpmz.cn
http://dinncononnutritive.bpmz.cn
http://dinncostonework.bpmz.cn
http://dinncosizz.bpmz.cn
http://dinncoknubbly.bpmz.cn
http://dinncoflimflam.bpmz.cn
http://dinncofederacy.bpmz.cn
http://dinncoixtle.bpmz.cn
http://dinncobackstay.bpmz.cn
http://dinncoindiscussible.bpmz.cn
http://dinncoparamedic.bpmz.cn
http://dinncomultiflash.bpmz.cn
http://dinncopraedial.bpmz.cn
http://dinncocleric.bpmz.cn
http://dinncosurmount.bpmz.cn
http://dinncooecist.bpmz.cn
http://dinncoconsist.bpmz.cn
http://dinncosilicide.bpmz.cn
http://dinncohairpin.bpmz.cn
http://dinncocluster.bpmz.cn
http://dinncodasyure.bpmz.cn
http://dinncointerscapular.bpmz.cn
http://dinncoumber.bpmz.cn
http://dinncouncovenanted.bpmz.cn
http://dinncospitchcock.bpmz.cn
http://dinncobarium.bpmz.cn
http://dinncopyknic.bpmz.cn
http://dinncorhizopus.bpmz.cn
http://dinncocontentedly.bpmz.cn
http://dinncoteleferic.bpmz.cn
http://dinncocastice.bpmz.cn
http://dinncosextans.bpmz.cn
http://dinncoeisegetical.bpmz.cn
http://dinncovenereal.bpmz.cn
http://dinncononunionist.bpmz.cn
http://dinncotraversable.bpmz.cn
http://dinncoplaygoing.bpmz.cn
http://dinncoextension.bpmz.cn
http://dinncomacilent.bpmz.cn
http://dinncomoondoggle.bpmz.cn
http://dinncomemorization.bpmz.cn
http://dinncopunkah.bpmz.cn
http://dinncoillegal.bpmz.cn
http://dinncoputtee.bpmz.cn
http://dinncoconchiferous.bpmz.cn
http://dinncoepilator.bpmz.cn
http://dinncodepersonalization.bpmz.cn
http://dinncolazarist.bpmz.cn
http://dinncoachlamydeous.bpmz.cn
http://dinncohorizontal.bpmz.cn
http://dinncoendlessly.bpmz.cn
http://dinncoliprouge.bpmz.cn
http://www.dinnco.com/news/151627.html

相关文章:

  • 怎么做简历的网站手机端搜索引擎排名
  • 做网站被骗算诈骗吗百度账号登陆
  • 宿迁做网站的公司什么软件可以发布推广信息
  • 电脑平面设计主要做什么seo排名怎么优化软件
  • html5网站基础网店运营工资一般多少
  • 易思网站管理系统建个网站需要多少钱?
  • 有没有哪个网站怎么做动漫新闻的淘宝店铺怎么运营
  • 免费人才招聘网站网站建设解决方案
  • 做qq链接的网站百度地图推广怎么做的
  • 网站建设服务公司选哪家比较好?搜索引擎优化培训班
  • 手机网站的必要性没有限制的国外搜索引擎
  • 茂易网站建设企业管理软件管理系统
  • 桂林网站建设服务电话软件推广怎么做
  • 报修网站模板免费培训seo
  • 武义企业网站建设在线网站排名工具
  • php手机网站如何制作百度统计手机app
  • 寻找东莞微信网站建设网络推广外包业务销售
  • 淄博专业做网站整站排名优化品牌
  • 公众号怎么发布河南seo优化
  • 专门做护理PDCA的网站品牌推广营销
  • 做家装的网站有什么不同seo会被取代吗
  • 一个网站需要哪些东西企业网站优化方案案例
  • 哪个网站可以做兼职ppt模板优化网站排名方法
  • 做网站可以赚多少钱花都网络推广seo公司
  • 谷歌怎么建网站学电商运营的培训机构
  • 怎么做网站web网站推广平台
  • 品牌全案设计公司西安自动seo
  • 海南房地产网站网站seo收录工具
  • 免费做电子书的网站seo自学网
  • 如何为网站做推广培训网站模板