日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

ribbon和nacos獲取服務列表不一致問題

作者:于萬丈深淵 更新時間: 2022-05-17 編程語言

前言:
1.nacos是基于推送事件模式獲取服務列表信息的
2.ribbon是本地每隔一定時間主動去拉取服務信息的

這兩個特性就可能會導致nacos上已經獲取到了服務列表但是ribbon還沒開始拉取最新的服務信息,導致在調用服務的時候會找不到nacos上的服務。

查了一下網上資料并沒有很可靠的解決方案,還是看一看源碼吧

解決辦法:
1.在本地nacos監聽到事件消息的時候,通過ribbon主動拉取一下服務信息,讓ribbon上的服務信息和nacos保持一致,達到同步的目的。

nacos官方文檔:https://nacos.io/zh-cn/docs/sdk.html
代碼如下:
1.本地配置nacosService

@Configuration
@Data
@Slf4j
public class NacosNamingConfig {

    @Value("${spring.cloud.nacos.discovery.server-addr}")
    private String serverAddr;
    @Value("${spring.cloud.nacos.discovery.namespace}")
    private String namespace;


    private static NamingService namingService;


    @Bean(name = "namingService")
    public NamingService get() throws NacosException {
        log.info("NacosNamingConfig namingService 執行");
        Properties properties = System.getProperties();
        properties.setProperty("serverAddr", serverAddr);
        properties.setProperty("namespace", namespace);
        namingService = NamingFactory.createNamingService(properties);
        return namingService;
    }

}

2.配置updater,更新ribbon服務列表有用

@Component("ribbonServerListUpdater")
public class MyPollingServerListUpdater extends PollingServerListUpdater {

    private UpdateAction updateAction;

    @Override
    public synchronized void start(UpdateAction updateAction) {

        this.updateAction = updateAction;

        super.start(updateAction);

    }


    public UpdateAction getUpdateAction(){

        return updateAction;

    }
}

2.開啟nacos訂閱

@Component
@Slf4j
public class ServerStatusRunner implements CommandLineRunner {

    @Autowired
    private NamingService namingService;



    @Override
    public void run(String... args) throws Exception {
        namingService.subscribe("服務名", new NacosListener());

    }
}

3.nacos事件監聽里面主動刷新ribbon里面的服務列表信息


@Slf4j
public class NacosListener implements EventListener {

    private MyPollingServerListUpdater myListUpdater;

    private NacosNamingService namingService;

    private HostReactor hostReactor;

    @Override
    public void onEvent(Event event) {
        log.info("nacos監聽事件消息:"+ JSON.toJSONString(event));

        //通知ribbon更新服務列
        // 1.刷新本地緩存
        log.info("nacos監聽事件,刷新ribbon本地緩存");
        namingService = SpringJobBeanFactory.getBean(NacosNamingService.class);
        Class cls = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
        Field field = cls.getDeclaredField("hostReactor");
        field.setAccessible(true);
        Object hostReactorValue = field.get(namingService);
        this.hostReactor = (HostReactor) hostReactorValue;
        this.hostReactor.updateServiceNow("服務名", "");

        // 2.更新服務列表
        log.info("nacos監聽事件,更新ribbon服務列表");
        myListUpdater = SpringJobBeanFactory.getBean(MyPollingServerListUpdater.class);
        ServerListUpdater.UpdateAction updateAction = myListUpdater.getUpdateAction();
        if (updateAction != null) {
            updateAction.doUpdate();
        }

        // 3.處理業務消息
    
    

    }
}

4.工具類:

@Component
public class SpringJobBeanFactory implements ApplicationContextAware {

    
    private static ApplicationContext applicationContext;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringJobBeanFactory.applicationContext=applicationContext;
        
    }
     public static ApplicationContext getApplicationContext() {
            return applicationContext;
    }
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
            if (applicationContext == null){
                return null;
            }
            return (T)applicationContext.getBean(name);
      }
    
    public static <T> T getBean(Class<T>  name) throws BeansException {
            if (applicationContext == null){
                return null;
            }
            return applicationContext.getBean(name);
      }
}

原文鏈接:https://blog.csdn.net/weixin_42714698/article/details/122950826

欄目分類
最近更新