Spring Cloud O
penFeign默认会将从注册中心Consul获取的服务实例信息在Caffine缓存中缓存35秒,这会出现服务下线后,下线服务仍然被调用的问题,导致上游服务在缓存有效期内不可用。本文讲解如何通过Consul Watch机制来实时监听相关服务的更新,以实现服务的平滑上下线。
RoundRobinLoadBalancer使用CachingServiceInstanceListSupplierle加载服务实例信息
public CachingServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, CacheManager cacheManager) {
super(delegate);
this.serviceInstances = CacheFlux.lookup(key -> {
// TODO: configurable cache name
//首先从缓存中获取
Cache cache = cacheManager.getCache(SERVICE_INSTANCE_CACHE_NAME);
if (cache == null) {
if (log.isErrorEnabled()) {
log.error("Unable to find cache: " + SERVICE_INSTANCE_CACHE_NAME);
}
return Mono.empty();
}
List<ServiceInstance> list = cache.get(key, List.class);
if (list == null || list.isEmpty()) {
return Mono.empty();
}
return Flux.just(list).materialize