今天,又是阳光明媚(摸鱼)的一天。闲来无事试一下spring cloud的熔断机制(hystrix)。然后发现一个问题,服务关闭再启动的时候不能及时生效。一开始以为是熔断配置的问题,后来去掉熔断,还是存在这个问题。然后开启了一步步的探索之路。。。
1.查看当前实例
@GetMapping("/allClients")
public List<ServiceInstance> listAllClients() {
List<ServiceInstance> provider = discoveryClient.getInstances("PROVIDER");
return provider;
}
自己封装了一个接口,查看当前服务的所有实例,发现服务启动后并不能及时获取到实例,那么自然访问不到服务了,然后又发现了一个配置RegistryFetchIntervalSeconds
2.客户端获取服务实例信息定时任务
原来客户端在启动的时候会从注册中心全量获取所有实例信息,然后启动一个定时任务,定时(默认30秒)从注册中心增量获取实例信息。定时任务的执行间隔就导致了服务延迟。
eureka:
client:
registry-fetch-interval-seconds: 1
这个配置就是设置任务执行间隔,然后我就改成每1秒执行一次,这样就应该可以达到实时的效果了。
3.注册中心对实例信息缓存
改成1秒后,我发现还是不能实时生效。然后继续查看资料,发现注册中心也会对实例信息进行缓存,而且采用了二级缓存。这个缓存的过期时间也是30s,这样就导致了服务延迟生效。
参考资料:
https://blog.youkuaiyun.com/yuu1009/article/details/80821403
https://segmentfault.com/a/1190000016909677?utm_source=tag-newest