几个月前,我开始研究工作的Spring,我正在和Netflix祖尔和Netflix尤里卡一起创建一个架构。
当应用程序部署在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;
}
我只添加了代码的主要部分。正如您所看到的,当第一次调用预过滤器时,它使用在eureka服务器上注册的一定数量的服务初始化EurekaClient bean。
如果,在一定的时间后,服务下降,eurekaClient变量不更新,和for循环,当到达检查eurekaClient. getApplication(etc…)==null它返回false,因为变量的服务仍然是。
我该怎么做才能解决这个问题?
我为我的英语提前道歉,这太可怕了。
我认为Spring CloudNetflixHystrix依赖于NetflixRibbon负载均衡器,Ribblon客户端具有用于Eureka Server注册服务的内存缓存。
当请求的服务不可用时,缓存会更新,这将不得不再次调用服务器。
我认为您应该调用服务来更新缓存。