几个月前,我开始学习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,因为对于变量,服务仍在运行。
如何解决此问题?
我提前为我的英语道歉,这太可怕了。
答案 0 :(得分:0)
我认为Spring Cloud Netflix Hystrix 在Netflix Ribbon 负载均衡器上具有依赖性,Ribblon客户端具有用于注册服务的内存缓存尤里卡服务器。
当请求的服务不可用时,缓存将更新,这将不得不再次调用服务器。
我认为您应该致电服务以更新缓存。