Spring cloud Eureka客户机未反映服务中断的手动状态

Spring cloud Eureka客户机未反映服务中断的手动状态,spring-cloud,netflix-eureka,Spring Cloud,Netflix Eureka,我有一个manager应用程序,它使用Eureka发现工人应用程序。他们都使用SpringCloudNetflix和他们提供的自动配置来进行服务注册和发现 有时,经理会将一个实例标记为OUT\u OF\u SERVICE,稍后(以分钟为单位)将同一实例标记为UP 管理器使用CloudEurekClient查找实例,然后设置其状态: @Autowired private CloudEurekaClient cloudEurekaClient; ... InstanceInfo instance

我有一个manager应用程序,它使用Eureka发现工人应用程序。他们都使用SpringCloudNetflix和他们提供的自动配置来进行服务注册和发现

有时,经理会将一个实例标记为
OUT\u OF\u SERVICE
,稍后(以分钟为单位)将同一实例标记为
UP

管理器使用
CloudEurekClient
查找实例,然后设置其状态:

@Autowired
private CloudEurekaClient cloudEurekaClient;

...

InstanceInfo instance = cloudEurekaClient.getNextServerFromEureka(WORKER_SERVICE_NAME, false);
cloudEurekaClient.setStatus(InstanceInfo.InstanceStatus.OUT_OF_SERVICE, instance);
// do some work
cloudEurekaClient.setStatus(InstanceInfo.InstanceStatus.UP, instance);
这似乎很有效。Eureka服务器状态页面显示我的实例从
向上
退出服务

但是,
CloudEurekaClient
似乎不知道某个实例是
OUT\u-OF\u-SERVICE
。相反,使用调试器,我发现实例的状态为
UP
,重写状态为
UNKNOWN

注意:如果我调用
cloudEurekaClient.getApplication(“worker”).getInstances()
它会显示4个
UP
实例,但没有提到服务失效的实例


这是预期的吗?我假设eureka客户端会知道一个实例是
OUT\u OF\u SERVICE
,但这不是我看到的行为。这会导致我使用的运行状况指示器出现问题,该指示器使用
CloudEurekClient
来显示
UP
OUT\u of\u SERVICE
实例的数量。

经过一些挖掘,问题似乎是设置实例状态会立即调用Eureka服务器,这就是服务器状态UI实时显示正确状态的原因:

public void setStatus(InstanceStatus newStatus, InstanceInfo info) {
    getEurekaHttpClient().statusUpdate(info.getAppName(), info.getId(), newStatus, info);
}
但是,调用
CloudEurekaServer.getNextServerFromEureka()
使用本地缓存,该缓存仅在计时器上定期更新,该计时器由
EurekClientConfig.getRegistryFetchIntervalSeconds()
定义


因此,我处于竞争状态,如果我将实例状态设置为
OUT\u OF\u SERVICE
,并尝试在刷新缓存之前查询发现客户端以查找应用程序,则客户端和服务器对实例有不同的视图。如果我等待registryRefreshInterval秒,然后向客户端请求下一台服务器,它会正确地忽略我手动输入的实例的
OUT\u OF\u SERVICE
状态。

您是否解决了此争用情况?我希望能够强制Eureka客户机上的刷新缓存,仅针对特定的按需实例。否则,我们必须强制所有Eureka客户端进行快速自动缓存刷新:@PetarBivolarski我从未找到解决此问题的方法,我们继续使用不同的服务进行发现。非常感谢您的快速响应!