¿Почему вызов службы работает нормально только один раз, и тогда я получаю HttpClientErrorException $ NotFound: 404? - PullRequest
0 голосов
/ 12 апреля 2020

Я работаю с микросервисами, использую eureka и zuul; и иметь 3 службы отдыха, где одна из них (называемая процессором) вызывает другие (служба A и служба B). Моя проблема в том, что когда я в первый раз звоню в службу обработки данных из почтальона, она прекрасно работает Но любая другая попытка не удалась. Я просмотрел журналы и обнаружил, что со второй попытки процессор не может связаться с одной из служб, иногда происходит сбой службы A, а другой - службы B, вызывая исключение HttpClientErrorException$NotFound: 404

Я искал решение в течение нескольких дней :( Обновление zuul timeout, eureka и изменение метода отображения для службы A и службы B. Но ничего не работает.

И я уверен, что URI в порядке, потому что он отлично работает с первой попытки.

Это услуга A, которую я пытаюсь вызвать (она похожа на услугу B):

@GetMapping("/serviceA")
    public FavoriteIds getUsersFavorites(@RequestParam String userId, @RequestParam String country, @RequestParam String city, HttpServletResponse response) {
        FavoriteIds ids = null;
        try {
            //all work here
            setResponse(response);
        }catch(Exception e){
            setResponse(response, e);
        }
        return ids;
    }

И так я вызываю службу A от процессора:

@Component
public class ProcessorRestCaller {

    @Autowired
    private RestTemplate restTemplate;

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.setReadTimeout(Duration.ofSeconds(20)).setConnectTimeout(Duration.ofSeconds(10)).build();
    }

public Future<FavoriteIds> getFavoriteIds(String userId, String country, String city) throws IllegalStateException {
        Map<String, String> params = new HashMap<>();
        params.put("userId",userId);
        params.put("country",country);
        params.put("city",city);
        return executor.submit(() -> {
            FavoriteIds favs = restTemplate.getForObject("http://service.favorites/serviceA?userId="+userId+"&country="+country+"&city="+city, FavoriteIds.class);
            return favs;
        });
}
    }

Я использую service.favorites в качестве имени хоста, поскольку оно определено в сервере zuul и сервере eureka. Поэтому они превращают это имя хоста в значение IP и порта.

Это Исключение, которое я получаю:

12/abr/2020 00:51:31 [ERROR] - ProcessorController: Excepción encontrada : org.springframework.web.client.HttpClientErrorException$NotFound: 404 : [{"timestamp":"2020-04-12T05:51:31.380+0000","status":404,"error":"Not Found","message":"No message available","path":"/serviceA"}]
java.util.concurrent.ExecutionException: org.springframework.web.client.HttpClientErrorException$NotFound: 404 : [{"timestamp":"2020-04-12T05:51:31.380+0000","status":404,"error":"Not Found","message":"No message available","path":"/serviceA"}]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.8.0_241]
    at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[?:1.8.0_241]
    at com.enterprise.processor.service.ProcessorService.getBenefitsByFilter(ProcessorService.java:71) ~[classes/:?]
    at com.enterprise.processor.controller.ProcessorController.getBenefitsForList(ProcessorController.java:51) [classes/:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_241]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_241]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_241]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_241]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) [spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) [spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) [spring-webmvc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888) [spring-webmvc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) [spring-webmvc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) [spring-webmvc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) [spring-webmvc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) [spring-webmvc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) [spring-webmvc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) [tomcat-embed-core-9.0.30.jar:9.0.30]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [tomcat-embed-core-9.0.30.jar:9.0.30]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-9.0.30.jar:9.0.30]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.30.jar:9.0.30]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.30.jar:9.0.30]
    ... 30 more
Caused by: org.springframework.web.client.HttpClientErrorException$NotFound: 404 : [{"timestamp":"2020-04-12T05:51:31.380+0000","status":404,"error":"Not Found","message":"No message available","path":"/serviceA"}]
    at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:113) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:785) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:743) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:717) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:361) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    at com.enterprise.processor.utils.rest.ProcessorRestCaller.lambda$0(ProcessorRestCaller.java:62) ~[classes/:?]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_241]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_241]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_241]
    ... 1 more

Пожалуйста, надеюсь, вы поможете мне найти то, что мне не хватает: (

...