eureka 服务名不能带下划线_ 否则gateway路由转发会找不到服务从而报nullpointer

首先,甩上报错信息。

    java.lang.NullPointerException: null
    	at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936) ~[na:1.8.0_171]
    	at java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:964) ~[na:1.8.0_171]
    	at org.springframework.cloud.context.named.NamedContextFactory.getContext(NamedContextFactory.java:82) ~[spring-cloud-context-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.netflix.ribbon.SpringClientFactory.getContext(SpringClientFactory.java:118) ~[spring-cloud-netflix-ribbon-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.context.named.NamedContextFactory.getInstance(NamedContextFactory.java:126) ~[spring-cloud-context-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.netflix.ribbon.SpringClientFactory.getInstance(SpringClientFactory.java:108) ~[spring-cloud-netflix-ribbon-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.netflix.ribbon.SpringClientFactory.getLoadBalancer(SpringClientFactory.java:57) ~[spring-cloud-netflix-ribbon-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.getLoadBalancer(RibbonLoadBalancerClient.java:155) ~[spring-cloud-netflix-ribbon-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.getServer(RibbonLoadBalancerClient.java:144) ~[spring-cloud-netflix-ribbon-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(RibbonLoadBalancerClient.java:76) ~[spring-cloud-netflix-ribbon-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.gateway.filter.LoadBalancerClientFilter.choose(LoadBalancerClientFilter.java:92) ~[spring-cloud-gateway-core-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.gateway.filter.LoadBalancerClientFilter.filter(LoadBalancerClientFilter.java:69) ~[spring-cloud-gateway-core-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.gateway.handler.FilteringWebHandler$GatewayFilterAdapter.filter(FilteringWebHandler.java:135) ~[spring-cloud-gateway-core-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.gateway.filter.OrderedGatewayFilter.filter(OrderedGatewayFilter.java:44) ~[spring-cloud-gateway-core-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    	at org.springframework.cloud.gateway.handler.FilteringWebHandler$DefaultGatewayFilterChain.lambda$filter$0(FilteringWebHandler.java:117) ~[spring-cloud-gateway-core-2.0.2.RELEASE.jar:2.0.2.RELEASE]

在这里插入图片描述
原因:org.springframework.cloud.gateway.filter.LoadBalancerClientFilter中的方法 choose 调用了URI.getHost()的方法
在这里插入图片描述

测试一下是否带下划线就会产生null:

import java.net.URI;

public class Test {
	public static void main(String[] args) {
	    String r = "http://user:password@foo_bar:8761/eureka/apps";
		URI uri = URI.create(r);
		System.out.println(uri.getHost());
		// prints null
	}
}

结果print出来的确是null。
stack overflow上找到了产生这个问题的源头:
URL 类中的方法private int parseHostname(int start, int n)
在转换URL的时候在经过
if ((p < n) && !at(p, n, ':')) fail("Illegal character in hostname", p);
时会报错
这是因为扫描块不包含 ‘_’ 符号即下划线
他只允许
“it allows only alphas, digits and -symbol (L_ALPHANUM, H_ALPHANUM, L_DASH and H_DASH).”

究极原因:java.net.URI不理解域名下划线
这是已知错误,详见java bug
并且在java8仍然没有得到解决

所以把url以及eureka中的application名称都改成 ‘-’ 就没问题了。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值