在随机端口上运行微服务时,Eureka 无法找到端口
Posted
技术标签:
【中文标题】在随机端口上运行微服务时,Eureka 无法找到端口【英文标题】:Eureka not able to find port when running microservices on random port 【发布时间】:2019-04-28 17:44:15 【问题描述】:我在我的 Spring Boot 应用程序中使用 eureka 进行服务发现和用于负载平衡的功能区。当我在修复端口上运行在 eureka 注册的微服务时,它工作正常,但是当我在随机端口上运行它们时,虽然我可以看到在 eureka 仪表板上注册的服务,但它无法找到端口号。尝试访问服务时出现以下错误。
2018-11-27 07:55:15.853 INFO 7240 --- [nio-8079-exec-1] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client MYAPP initialized: DynamicServerListLoadBalancer:NFLoadBalancer:name=MYAPP,current list of Servers=[nawnit:0, nawnit:0],Load balancer stats=Zone stats: defaultzone=[Zone:defaultzone; Instance count:2; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]
,Server stats: [[Server:nawnit:0; Zone:defaultZone; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 05:30:00 IST 1970; First connection made: Thu Jan 01 05:30:00 IST 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0]
]ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@563d5f30
2018-11-27 07:55:15.907 ERROR 7240 --- [nio-8079-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://MYAPP/validation/1": connect: Address is invalid on local machine, or port is not valid on remote machine; nested exception is java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine] with root cause
java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine
at java.net.DualStackPlainSocketImpl.connect0(Native Method) ~[na:1.8.0_181]
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) ~[na:1.8.0_181]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_181]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_181]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_181]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_181]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_181]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_181]
at java.net.Socket.connect(Socket.java:538) ~[na:1.8.0_181]
at sun.net.NetworkClient.doConnect(NetworkClient.java:180) ~[na:1.8.0_181]
at sun.net.www.http.HttpClient.openServer(HttpClient.java:463) ~[na:1.8.0_181]
at sun.net.www.http.HttpClient.openServer(HttpClient.java:558) ~[na:1.8.0_181]
at sun.net.www.http.HttpClient.<init>(HttpClient.java:242) ~[na:1.8.0_181]
at sun.net.www.http.HttpClient.New(HttpClient.java:339) ~[na:1.8.0_181]
at sun.net.www.http.HttpClient.New(HttpClient.java:357) ~[na:1.8.0_181]
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1220) ~[na:1.8.0_181]
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156) ~[na:1.8.0_181]
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050) ~[na:1.8.0_181]
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:984) ~[na:1.8.0_181]
at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:76) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
at org.spr
这是我从中调用另一个服务的控制器类。
public ResponseEntity<BaseResponse> verifyEmail(@RequestBody CustomerIdentity identity,
@PathVariable Integer simID) throws HttpClientErrorException
System.out.println(this.discoveryClient.getInstances("MYAPP").get(0).getUri().toString());
return restTemplate.postForEntity("http://MYAPP"+ "/validation/" + simID, identity, BaseResponse.class);
这是我添加的属性
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
我的服务已在 eureka 注册,名称为 MYAPP。我也尝试过打印 url,如您所见,当在修复端口上运行但在随机端口上运行时,它会给出 http://nawnit:8080
我得到http://nawnit:0
(nawnit 是我的电脑名称)
这是我的 eureka 服务器的配置属性。
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF
eureka客户端的pom.xml:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.M3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
注意:我使用的 restTemplate 被配置为负载平衡。
【问题讨论】:
从功能区启动器中删除版本并将其更改为spring-cloud-starter-netflix-ribbon
并重试。
我会尝试的..但是功能区与尤里卡有什么关系吗?因为如果你会看到打印语句使用 doscoveryclinet 来获取我认为独立于功能区的 url,对吗?
这是一个错误。关注github.com/spring-cloud/spring-cloud-netflix/issues/3294 了解进度。
@spencergibb 谢谢。只是出于好奇,您是如何知道它的错误的?我的意思是你是怎么确定它是一个错误?我不怀疑你我只是想知道。
创建了一个项目,但它像你的一样失败了,改为 Finchley.SR2 工作,所以我知道这是一个回归。现在我们有一个测试来检查它。
【参考方案1】:
这是一个错误,已修复。有关重现问题的测试,请参阅 https://github.com/spring-cloud/spring-cloud-netflix/issues/3294。此处也进行了修复https://github.com/spring-cloud/spring-cloud-commons/issues/451
这应该会在下周(2018 年 12 月 6 日)作为 Greenwich.RC1 的一部分提供。有关更新,请参阅 https://github.com/spring-cloud/spring-cloud-release/milestones。
【讨论】:
所以一旦发布,只有我可以拥有更新的代码?如果我克隆存储库,它会工作吗?我想它有你的更改? 你可以这样做,但我们也会将快照部署到 repo.spring.io @NawnitSen 同时坚持使用 spring-cloud-starter-netflix-eureka-client 2.0.2 @MartinSchröder 除非它不适用于 boot 2.1.x @spencergibb 这就是我回到 Spring Boot 2.0.x 的原因以上是关于在随机端口上运行微服务时,Eureka 无法找到端口的主要内容,如果未能解决你的问题,请参考以下文章
运行 Eureka Server 时无法启动嵌入式 Tomcat