new URI(zk_servers_1) 路径包含下划线无法获取host的问题

new URI(zk_servers_1) 路径包含下划线无法获取host的问题

spring cloud gateway使用zookeeper作为注册中心调用其它服务的时候报了下面这个错误:

ava.lang.NullPointerException: null
    at io.netty.util.NetUtil.isValidIpV4Address(NetUtil.java:648) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
    at io.netty.util.NetUtil.createByteArrayFromIpAddressString(NetUtil.java:368) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
    at reactor.ipc.netty.options.InetSocketAddressUtil.attemptParsingIpString(InetSocketAddressUtil.java:132) ~[reactor-netty-0.7.10.RELEASE.jar:0.7.10.RELEASE]
    at reactor.ipc.netty.options.InetSocketAddressUtil.createForIpString(InetSocketAddressUtil.java:80) ~[reactor-netty-0.7.10.RELEASE.jar:0.7.10.RELEASE]
    at reactor.ipc.netty.options.InetSocketAddressUtil.createInetSocketAddress(InetSocketAddressUtil.java:69) ~[reactor-netty-0.7.10.RELEASE.jar:0.7.10.RELEASE]
    at reactor.ipc.netty.options.ClientOptions.createInetSocketAddress(ClientOptions.java:253) ~[reactor-netty-0.7.10.RELEASE.jar:0.7.10.RELEASE]
    at reactor.ipc.netty.http.client.HttpClientOptions.getRemoteAddress(HttpClientOptions.java:87) ~[reactor-netty-0.7.10.RELEASE.jar:0.7.10.RELEASE]
    at reactor.ipc.netty.http.client.MonoHttpClientResponse.lambda$subscribe$0(MonoHttpClientResponse.java:76) ~[reactor-netty-0.7.10.RELEASE.jar:0.7.10.RELEASE]

调用的地址是http://zks_servers_1:18001,zks_servers_1是服务的hosts配置的名称,空指针异常跟踪发现是下面这个问题导致的:

//类HttpClientOptions
 public final InetSocketAddress getRemoteAddress(URI uri) {
        Objects.requireNonNull(uri, "uri");
        boolean secure = isSecure(uri);
        int port = uri.getPort() != -1 ? uri.getPort() : (secure ? 443 : 80);
        boolean shouldResolveAddress = !this.useProxy(uri.getHost());
        return this.createInetSocketAddress(uri.getHost(), port, shouldResolveAddress);
    }

uri.getHost()返回值是null,也就是说根据上面的调用地址,没有获取到对应的host。
uri的创建方式是:

//类MonoHttpClientResponse
MonoHttpClientResponse(HttpClient parent, String url, HttpMethod method, Function<? super HttpClientRequest, ? extends Publisher<Void>> handler) {
        this.parent = parent;
        boolean isWs = Objects.equals(method, HttpClient.WS);

        try {
            this.startURI = new URI(parent.options.formatSchemeAndHost(url, isWs));
        } catch (URISyntaxException var7) {
            throw Exceptions.bubble(var7);
        }

        this.method = isWs ? HttpMethod.GET : method;
        this.handler = handler;
    }

创建方式是调用URI的new URI(String)方法,知道原因之后在本地测试:

try {
            URI uri = new URI("http://zks_servers_1:18001/test.html");
            String host = uri.getHost();
            System.out.println(host);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

确实获取不到host,查看源码发现:

 /**
     * Returns the host component of this URI.
   
     *
     *   <li><p> A domain name consisting of one or more <i>labels</i>
     *   separated by period characters ({@code '.'}), optionally followed by
     *   a period character.  Each label consists of <i>alphanum</i> characters
     *   as well as hyphen characters ({@code '-'}), though hyphens never
     *   occur as the first or last characters in a label. The rightmost
     *   label of a domain name consisting of two or more labels, begins
     *   with an <i>alpha</i> character. </li>
     
     * </ul>
     *
     * The host component of a URI cannot contain escaped octets, hence this
     * method does not perform any decoding.
     *
     * @return  The host component of this URI,
     *          or {@code null} if the host is undefined
     */
    public String getHost() {
        return host;
    }

谷歌翻译:

由一个或多个标签组成的域名
   由句点字符代码'.'分隔,可选地后跟
   一个英文句号角色。 每个标签由alphanum字符组成
   以及连字符字符代码' - ',虽然连字符永远不会
   作为标签中的第一个或最后一个字符出现。 最右边包含最少长度最少两个并且以英文字符开始的标签

举例如下:
www.baidu.com,这个域名包含三个标签www、baidu、com;
www.baidu-zhidao.com,这个域名包含三个标签www、baidu-zhidao、com;
这个例子就是说明每个标签都可以使用-连接;

然后看一下,我的报错的服务名称zks_servers_1,这个名称没有以【.】分割,包含了非法字符【_】最后以单个数字结尾也不符合要求。
实际上测试发现zks-servers-1这样也是不正确的,不知道是不是翻译的有问题,这个结果和翻译不太匹配。

总而言之,修改服务器的hosts配置就行了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101074.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 光棍节程序员闯关秀——闲来无事玩玩儿游戏~

    光棍节程序员闯关秀——闲来无事玩玩儿游戏~告诉我没女朋友的人不学习干嘛???第一次写题解,有点激动哈咳咳~话说为什么“光棍”老得和程序员挂上钩?人家好多程序员有车子有房子有票子有漂亮老婆有可爱的孩子人生早就已经圆满了好吗?!!【正经脸】第一关:(上图后发现右下角神奇的多了一个水印原谅没见过世面的我(ಡωಡ)hiahiahia)话不多说直接查看源码。发现有个颜色被隐藏在背景色中的超链接(忽悠小孩儿呢

    2022年7月16日
    16
  • PHP二维数组排序 array_multisort

    PHP二维数组排序 array_multisort1 根据二维数组中的某一列按升序或者降序排列不需要遍历数组就可以对二维数组排序 1 构造数组 data a gt 23 b gt hhhh c gt 2013 12 23 a gt 26 b gt hkkk c gt 2013 12 26 a gt 20 b gt 565 c gt 2

    2025年7月11日
    3
  • vue可以和jquery一起用吗_项目中vue和jquery一起如何使用

    vue可以和jquery一起用吗_项目中vue和jquery一起如何使用拿起html的时候,在数据处理上,疯狂怀念数据双向绑定,vue又成了我的必选项,但是有些业务场景其实并不适用vue,所以最终技术选型为vue+jquery混合使用,结合两边的优点,大大提高开发效率。vue和jquery同时引入的时候,jquery操作一定要放在vue后面,要等DOM渲染完成,jquery才能进行DOM事件操作。那么vue+jquery应该如何使用呢?一、首先引入vue文件(cdn或者下载到本地都行),参考vue官方连接https://cn.vuejs.org/v2/guide/ins

    2022年10月15日
    2
  • Code Coverage 小结

    Code Coverage 小结在软件测试中 CodeCoverage 常常作为公司衡量软件测试是否充分的一个指标 这其中包括 UTCoverage TestAutomati 下面我列举出常用编程语言所用的 coveragetool 编程语言 工具 评论 LinuxC gcov lcov nbsp Window

    2025年8月25日
    0
  • imfill简介_im ill

    imfill简介_im illBW2=imfill(BW)这种格式将一张二值图像显示在屏幕上,允许用户使用鼠标在图像上点几个点,这几个点围成的区域即要填充的区域。要以这种交互方式操作,BW必须是一个二维的图像。用户可以通过按Backspace键或者Delete键来取消之前选择的区域;通过shift+鼠标左键单击或者鼠标右键单击或双击可以确定选择区域。[BW2,locations]=imfill(BW)

    2022年9月13日
    5
  • @TableLogic注解表示逻辑删除「建议收藏」

    @TableLogic注解表示逻辑删除「建议收藏」@TableLogic注解表示逻辑删除效果:在字段上加上这个注解再执行BaseMapper的删除方法时,删除方法会变成修改场景:1.实体类中属性加上@TableLogic,@TableLogicprivateIntegerdataStatus;2.调用BaseMapper的deleteById(id)或者调用IService的removeBy…

    2022年6月2日
    115

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号