首先,甩上报错信息。
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名称都改成 ‘-’ 就没问题了。