几个月前,我开始学习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中具有用于注册服务的内存缓存。

当请求的服务不可用时,将更新缓存,这将不得不再次调用服务器。

我认为您应该调用该服务以更新缓存。

07-24 15:05