几个月前,我开始学习Spring,并与Netflix Zuul和Netflix Eureka建立了一个架构。
当将应用程序部署在Tomcat上时,我无法实现Hystrix Fallback,因此我决定使用EurekaClient和RouteLocator Bean。
它们工作得很好,但是当某个应用程序崩溃并且不再在Eureka服务器上注册时,显然EurekaClient bean不会因为该崩溃而更新,因此,如果我使用getApplications()方法搜索该应用程序,它仍然存在。
如何刷新/更新EurekaClient bean?可能吗?
这是我第一次对堆栈溢出提出问题,但我仍然不知道如何发布代码,因此我希望我的问题足够,否则我将尝试以某种方式发布。
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;
}
我只添加了代码的主要部分。如您所见,当首次调用pre过滤器时,它将使用在eureka服务器上注册的一定数量的服务来初始化EurekaClient bean。
如果在一定时间后服务崩溃,则不会更新eurekaClient变量,并且for周期将在到达时检查eurekaClient.getApplication(etc ...)== null是否返回false,因为对于变量服务仍在。
如何解决此问题?
我提前为我的英语道歉,这太可怕了。
最佳答案
我认为Spring Cloud Netflix Hystrix在Netflix Ribbon负载平衡器上具有依赖性,而Ribblon客户端在Eureka Server中具有用于注册服务的内存缓存。
当请求的服务不可用时,将更新缓存,这将不得不再次调用服务器。
我认为您应该调用该服务以更新缓存。