服务运行一定时间后,关于服务间通信的HttpClientErrorException

时间:2018-12-31 09:25:56

标签: spring-boot docker microservices resttemplate

我和我的团队陷入了一个非常愚蠢的HttpClientErrorException案例,让我首先概述一下我的工作场景。

我有一个微服务堆栈,其中包含以下内容:

  • Mysql-数据库
  • keycloak-用户管理
  • 尤里卡-发现
  • Zuul-反向代理
  • Zipkin和侦探追踪器
  • 微服务酒店-与酒店实体相关的所有信息(酒店记录,酒店的CRUD以及与之相关的用户帐户)。
  • 微服务室-有关房间的所有信息
  • 微服务价格-有关价格的所有信息
  • 微服务调度程序-一种微服务,可跟踪数据更新并将其与另一个系统(第三方)同步。

在调度程序中,我使用带有cron的spring调度程序

@Scheduled(cron = "0 0/5 * * * ?")
public void prepareDataForSync() {...

prepareDataForSync中代码的目的是获取有关每个酒店的数据并检查当前状态,如果扣除了任何更改,则将其传递给第三方。现在是真正的问题了:

我打了个电话,从日程安排者那里获取酒店列表:

    @Scheduled(cron = "0 0/5 * * * ?")
public void prepareDataForSync() {

    Set<Long> unChangeableAllc = new HashSet<Long>();

    List<MessageCenter> messages = new ArrayList<MessageCenter>();
    String hotelURL = "http://hoteldata/hotel/allActive";

    try {//loop over hotel data and process further...

所有这些服务都在docker环境中运行,每个服务都有自己的容器并通过docker网络进行通信。

现在,当我启动包括Hotel和Scheduler的服务时,一切正常工作了几个小时,但随后我的日志中出现以下异常,并且该服务不再与第三方同步。

org.springframework.web.client.HttpClientErrorException: 400 null
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:312)
at com.channelmanager.allocationservices.controllers.RoomAllocationsController.prepareDataForSync(RoomAllocationsController.java:1159)
at sun.reflect.GeneratedMethodAccessor257.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

在1159行,我只有一个服务电话:

ResponseEntity<String> hotelResponse = restTemplate.getForEntity(hotelURL, String.class);

我检查了相应酒店服务中的日志,在该日志中显示了已接收到服务请求,并且已收集数据并将其写入响应流,但异常显示我从未收到任何响应并得到此异常。

酒店服务记录:

2018-12-31 06:06:00 [http-nio-9501-exec-5] DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'dispatcherServlet' processing GET request for [/public/hotel]
2018-12-31 06:06:00 [http-nio-9501-exec-5] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /public/hotel
2018-12-31 06:06:00 [http-nio-9501-exec-5] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Returning handler method [public org.springframework.http.ResponseEntity<java.util.List<com.channelmanager.hoteldata.models.Hotel>> com.channelmanager.hoteldata.controllers.HotelUserPublicController.getAllHotel()]
2018-12-31 06:06:00 [http-nio-9501-exec-5] DEBUG o.s.web.servlet.DispatcherServlet - Last-Modified value for [/public/hotel] is: -1
2018-12-31 06:06:00 [http-nio-9501-exec-5] DEBUG o.s.w.s.m.m.a.HttpEntityMethodProcessor - Written [[Hotel [id=1, name=testhotel, createdBy=cmadmin, modifiedOn=2018-04-27T13:54:43, createdOn=2018-04-27T13:54:43, enabled=true, ...]]] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@a50d709]
2018-12-31 06:06:00 [http-nio-9501-exec-5] DEBUG o.s.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2018-12-31 06:06:00 [http-nio-9501-exec-5] DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request

如果我重新启动Scheduler服务,它将再次开始工作,但是又在几个小时后出现相同的问题。目前,作为一种解决方法,我在服务器上设置了cron以每2小时重新启动一次服务,但这确实是一个糟糕的解决方法,我不能在生产中依靠它,而需要找到问题的根源。

我已经用谷歌搜索并尝试解决任何基于HttpClientErrorException的问题,但对我而言没有任何意义。

如果我需要更多信息,请告诉我。

编辑:

Docker Stats输出:

0b7d20c5a566时间表0.12%1.365GiB / 31.41GiB 4.34%0B / 0B 3.27MB / 0B 64

容器内部的顶部输出 TOP Command inside container

1 个答案:

答案 0 :(得分:-1)

错误代码表示另一端出现错误-您的一端未找到400个错误。您是否尝试过转储响应(包括标题)?另外,您是否尝试过重新认证,也许重置烹饪等?您有联系另一端吗?他们对此有何反应?