Как обновить @Autowired EurekaClient

#java #spring #spring-boot #netflix-eureka #netflix-zuul

#java #spring #весенняя загрузка #netflix-эврика #netflix-zuul

Вопрос:

Пару месяцев назад я начал изучать Spring для работы, и я создаю архитектуру с Netflix Zuul и Netflix Eureka.

Мне не удалось реализовать резервный вариант Hystrix при развертывании приложений на Tomcat, поэтому я решил использовать компоненты EurekaClient и RouteLocator.

Они работают очень хорошо, но когда приложение падает и больше не регистрируется на сервере Eureka, очевидно, что компонент EurekaClient не обновляется с этим падением, поэтому, если я ищу приложение с помощью метода getApplications (), оно все еще там.

Как я могу обновить компонент EurekaClient? Возможно ли это?

Это первый раз, когда я задаю вопрос о переполнении стека, и я все еще не знаю, как опубликовать код, поэтому я надеюсь, что моего вопроса достаточно, в противном случае я попытаюсь опубликовать его как-нибудь.

 public class Prefilter extends ZuulFilter

   @Autowired
   EurekaClient eurekaClient;

   @Autowired
   RouteLocator routeLocator;

   // some methods of zuul filter


   @Override
   public Object run() {
      RequestContext context = RequestContext.getCurrentContext();
      HttpServletRequest request = context.getRequest();

      String requestURI = request.getRequestURI();

      for(Route route : routeLocator.getRoutes()) {
          if(requestURI.contains(route.getFullPath.substring(0, route.getFullPath().lenght() - 2))) {
              if(eurekaClient.getApplication(route.getId() == null)) {
                  return "Service offline, retry later";
              }
          }
      }

      return null;
   }
  

Я добавил только основную часть своего кода. Как вы можете видеть, когда предварительный фильтр вызывается в первый раз, он инициализирует компонент EurekaClient определенным количеством служб, зарегистрированных на сервере eureka.

Если по истечении определенного промежутка времени служба падает, переменная eurekaClient не обновляется, и цикл for, когда выполняется проверка, является ли eurekaClient.getApplication(etc …) == null, возвращает false, потому что для переменной служба все еще запущена.

Что я могу сделать, чтобы решить эту проблему?

Заранее прошу прощения за мой английский, он довольно ужасный.

Комментарии:

1. Вы можете включить фрагменты кода, что очень ценится, включив их в отдельные обратные ссылки, такие как var a = 3; или с отступом в четыре пробела, или использовать кнопку code sample в редакторе, также доступную через CTRL-K . Вы также всегда можете обратиться к вопросительному знаку в правом верхнем углу текстового редактора при задании или редактировании вопросов.

Ответ №1:

Я думаю, что Spring Cloud Netflix Hystrix зависит от балансировщика нагрузки на ленту Netflix, а клиент Ribblon имеет кэш в памяти для зарегистрированных сервисов на сервере Eureka.

Кэш обновляется, когда запрошенная служба недоступна, для чего придется снова вызывать сервер.

Я думаю, вам следует вызвать службу для обновления кэша.