一、版本介绍
Nacos: 1.3.1
SpringCloud: 2021.0.2
SpringCloud gateway: 3.1.2
二、背景
- 微服务下线后,网关存在短时间内转发失效服务,导致前端访问异常
- 微服务上线后,网关没有及时刷新本地缓存的服务,导致前端可能找不到服务实例
- nacos的主动推送实例变化比网关自己拉取要及时的多
三、网关增加订阅微服务实例变化的代码
import static org.springframework.cloud.loadbalancer.core.CachingServiceInstanceListSupplier.SERVICE_INSTANCE_CACHE_NAME;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Component;
import com.alibaba.nacos.client.naming.event.InstancesChangeEvent;
import com.alibaba.nacos.common.notify.NotifyCenter;
import com.alibaba.nacos.common.notify.listener.Subscriber;
import com.alibaba.nacos.common.utils.JacksonUtils;
import lombok.extern.slf4j.Slf4j;
/**
* 订阅nacos通知
* 接收nacos推送的微服务上下线实例信息
* @author
*
*/
@Component
@Slf4j
public class NacosInstancesChangeEventListener extends Subscriber<InstancesChangeEvent> {
@Resource
private CacheManager defaultLoadBalancerCacheManager;
@PostConstruct
public void registerToNotifyCenter(){
NotifyCenter.registerSubscriber(this);
}
@Override
public void onEvent(InstancesChangeEvent event) {
log.info("SpringCloud Gateway 接收微服务实例刷新事件:{}, 开始刷新本地存储的微服务实例信息的缓存", JacksonUtils.toJson(event));
Cache cache = defaultLoadBalancerCacheManager.getCache(SERVICE_INSTANCE_CACHE_NAME);
if (cache != null) {
cache.evict(event.getServiceName());
}
log.info("SpringCloud Gateway 实例刷新完成");
}
@Override
public Class<? extends com.alibaba.nacos.common.notify.Event> subscribeType() {
return InstancesChangeEvent.class;
}
}
一级增加配置使订阅事件生效
cloud:
gateway:
discovery:
locator:
enabled: true # 默认false,开启后可以通过ip:port/服务名称/接口地址进行服务转发
interval: 10000 # 设置定时拉取服务信息的时间间隔为10秒
此处配置注意点:文章来源:https://www.toymoban.com/news/detail-716947.html
1、如果cloud.gateway.discovery.locator.enabled 设置为false,那么订阅程序将收不到nacas推送的消息
2、如果不需要定时拉取,可以把interval的设置去掉文章来源地址https://www.toymoban.com/news/detail-716947.html
到了这里,关于springcloud gateway实时监听nacos微服务上下线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!