#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.
Кэш обновляется, когда запрошенная служба недоступна, для чего придется снова вызывать сервер.
Я думаю, вам следует вызвать службу для обновления кэша.