網站首頁 編程語言 正文
前言:
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
相關推薦
- 2022-10-26 python的django寫頁面上傳文件及遇到的問題小結_python
- 2023-05-08 C語言中棧的結構和函數接口的使用示例_C 語言
- 2022-10-19 react+antd實現動態編輯表格數據_React
- 2022-08-01 MongoDB創建與刪除數據庫_MongoDB
- 2022-09-26 利用C++實現?然連接操作算法_C 語言
- 2022-08-16 一文輕松了解Python中類的繼承_python
- 2022-05-28 C語言數據結構超詳細講解單向鏈表_C 語言
- 2022-03-10 Docker案例分析:搭建Redis服務_docker
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支