Microservices JHipster microservice gateway在一个服务实例终止时临时抛出HTTP 500错误

Microservices JHipster microservice gateway在一个服务实例终止时临时抛出HTTP 500错误,microservices,jhipster,gateway,service-discovery,Microservices,Jhipster,Gateway,Service Discovery,我们有一个标准的JHipster设置,包括一个网关和一个微服务应用程序。JHipster注册表用于服务发现。我们没有对JHipster生成器生成的代码或配置进行任何更改 一切正常。但是,当关闭一个microservice应用程序实例(SIGINT、CLI上的^C、Kubernetes pod termination)时,我们会暂时收到HTTP 500内部服务器错误,这些错误是通过网关(.)向microservice端点发出的请求 请在下面找到网关中HTTP 500错误的堆栈跟踪: Caused

我们有一个标准的JHipster设置,包括一个网关和一个微服务应用程序。JHipster注册表用于服务发现。我们没有对JHipster生成器生成的代码或配置进行任何更改

一切正常。但是,当关闭一个microservice应用程序实例(SIGINT、CLI上的^C、Kubernetes pod termination)时,我们会暂时收到HTTP 500内部服务器错误,这些错误是通过网关(.)向microservice端点发出的请求

请在下面找到网关中HTTP 500错误的堆栈跟踪:

Caused by: org.apache.http.NoHttpResponseException: 172.16.94.61:8085 failed to respond
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:141)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
    at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
    at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:165)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
    at org.springframework.cloud.netflix.ribbon.apache.RetryableRibbonLoadBalancingHttpClient$1.doWithRetry(RetryableRibbonLoadBalancingHttpClient.java:93)
    at org.springframework.cloud.netflix.ribbon.apache.RetryableRibbonLoadBalancingHttpClient$1.doWithRetry(RetryableRibbonLoadBalancingHttpClient.java:71)
    at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:287)
    at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:164)
    at org.springframework.cloud.netflix.ribbon.apache.RetryableRibbonLoadBalancingHttpClient.executeWithRetry(RetryableRibbonLoadBalancingHttpClient.java:113)
    at org.springframework.cloud.netflix.ribbon.apache.RetryableRibbonLoadBalancingHttpClient.execute(RetryableRibbonLoadBalancingHttpClient.java:104)
    at org.springframework.cloud.netflix.ribbon.apache.RetryableRibbonLoadBalancingHttpClient.execute(RetryableRibbonLoadBalancingHttpClient.java:50)
    at com.netflix.client.AbstractLoadBalancerAwareClient$1.call(AbstractLoadBalancerAwareClient.java:109)
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java:303)
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java:287)
    at rx.internal.util.ScalarSynchronousObservable$3.call(ScalarSynchronousObservable.java:231)
    at rx.internal.util.ScalarSynchronousObservable$3.call(ScalarSynchronousObservable.java:228)
    at rx.Observable.unsafeSubscribe(Observable.java:10211)
    at rx.internal.operators.OnSubscribeConcatMap$ConcatMapSubscriber.drain(OnSubscribeConcatMap.java:286)
    at rx.internal.operators.OnSubscribeConcatMap$ConcatMapSubscriber.onNext(OnSubscribeConcatMap.java:144)
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:185)
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180)
    at rx.Observable.unsafeSubscribe(Observable.java:10211)
    at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:94)
    at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
    at rx.Observable.subscribe(Observable.java:10307)
    at rx.Observable.subscribe(Observable.java:10274)
    at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:445)
网关的负载平衡器似乎仍然使用正在终止的microservice实例

我们还尝试了Consor而不是JHipster Registry/Eureka,发现了同样的行为

复制步骤:

  • 启动一个注册表、一个网关和两个microservice实例(使用gradlew)
  • 等待并验证一切都已启动并正在运行(呼叫。)
  • 终止一个微服务实例
  • 关系。。。几次
    • 几秒钟后,将出现HTTP 500错误
    • 再过几秒钟,错误将消失,剩下的微服务将接收所有流量
由于我们使用的是开箱即用的JHipster设置,所以在互联网上找不到任何解决此问题的文章,这让我们感到非常困惑

有没有人经历过同样的问题,知道这里出了什么问题或者如何解决这个问题?我们花了很长时间试图找到原因和解决办法,但我们觉得我们被困在这里了


如果您需要更多信息(日志、配置、跟踪等),我们很乐意在此处发布。

您可以通过在application.yml中设置
zuul.retryable:true
来启用
spring retry
(包含在默认JHipster网关的pom.xml中)。然后将再次尝试任何失败的GET请求。如果还希望多次尝试其他HTTP方法(如POST),请设置
ribbon.OkToRetryOnAllOperations:true


您是否尝试过调整Eureka、Hystrix和Ribbon?超时和重试配置。设置zuul.retryable:true解决了我的问题。我还必须配置Ribbon来调整超时,现在我所有的服务请求都正常工作了。