nacos发送beat逻辑
服务注册 registerInstance
服务注册的时候,如果实例是临时的(ephemeral=true),则会构造发送心跳包
NacosNamingService.registerInstance
public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {String groupedServiceName = NamingUtils.getGroupedName(serviceName, groupName);if (instance.isEphemeral()) { // 临时的BeatInfo beatInfo = beatReactor.buildBeatInfo(groupedServiceName, instance);beatReactor.addBeatInfo(groupedServiceName, beatInfo); // /nacos/v1/ns/instance/beat发送心跳} // addBeatInfo: /nacos/v1/ns/instance/beat?app=unknown&serviceName=DEFAULT_GROUP%40%40nacos-discovery&namespaceId=public&port=8082&clusterName=DEFAULT&ip=169.254.104.253serverProxy.registerService(groupedServiceName, groupName, instance);}
BeatReactor
用于向Nacos服务端发送已注册服务心跳
默认5s执行一次心跳
public void addBeatInfo(String serviceName, BeatInfo beatInfo) {NAMING_LOGGER.info("[BEAT] adding beat: {} to beat map.", beatInfo);String key = buildKey(serviceName, beatInfo.getIp(), beatInfo.getPort());BeatInfo existBeat = null;//fix #1733if ((existBeat = dom2Beat.remove(key)) != null) {existBeat.setStopped(true);}dom2Beat.put(key, beatInfo);executorService.schedule(new BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS); // period毫秒后执行1次 默认5sMetricsMonitor.getDom2BeatSizeMonitor().set(dom2Beat.size());}
BeatTask
如果服务器返回404,则会向服务器重新注册实例
默认5s执行一次心跳
class BeatTask implements Runnable {BeatInfo beatInfo;public BeatTask(BeatInfo beatInfo) {this.beatInfo = beatInfo;}@Overridepublic void run() {if (beatInfo.isStopped()) {return;}long nextTime = beatInfo.getPeriod(); //periodtry {JsonNode result = serverProxy.sendBeat(beatInfo, BeatReactor.this.lightBeatEnabled); // 发送心跳包 PUT /nacos/v1/ns/instance/beatlong interval = result.get("clientBeatInterval").asLong();boolean lightBeatEnabled = false;if (result.has(CommonParams.LIGHT_BEAT_ENABLED)) {lightBeatEnabled = result.get(CommonParams.LIGHT_BEAT_ENABLED).asBoolean();}BeatReactor.this.lightBeatEnabled = lightBeatEnabled;if (interval > 0) {nextTime = interval;}int code = NamingResponseCode.OK;if (result.has(CommonParams.CODE)) {code = result.get(CommonParams.CODE).asInt();}if (code == NamingResponseCode.RESOURCE_NOT_FOUND) { // 没找到资源Instance instance = new Instance();instance.setPort(beatInfo.getPort());instance.setIp(beatInfo.getIp());instance.setWeight(beatInfo.getWeight());instance.setMetadata(beatInfo.getMetadata());instance.setClusterName(beatInfo.getCluster());instance.setServiceName(beatInfo.getServiceName());instance.setInstanceId(instance.getInstanceId());instance.setEphemeral(true);try {serverProxy.registerService(beatInfo.getServiceName(),NamingUtils.getGroupName(beatInfo.getServiceName()), instance); // 重新向服务器注册实例} catch (Exception ignore) {}}} catch (NacosException ex) {NAMING_LOGGER.error("[CLIENT-BEAT] failed to send beat: {}, code: {}, msg: {}",JacksonUtils.toJson(beatInfo), ex.getErrCode(), ex.getErrMsg());}executorService.schedule(new BeatTask(beatInfo), nextTime, TimeUnit.MILLISECONDS); // 设置下一次执行 nextTime(period)毫秒后执行1次 默认5s}
}
nacos发送beat逻辑相关推荐
- 高德地图实现仿qq,微信发送位置功能实现逻辑
定位获取当前位置 地图中间放置大头针 周边展示位置信息 周边信息点击后的逻辑操作 地图截屏功能实现 发送图片到其他页面或者服务器 获取到信息进行展示 写的不好,勿喷,有疑问可以联系我qq 130888 ...
- Nacos心跳检测原理
工程版本 <spring-boot.version>2.2.6.RELEASE</spring-boot.version> <spring-cloud-alibaba.v ...
- nacos的心跳机制
了解nacos的心跳机制,需要先了解nacos的服务注册原理:可先阅读https://blog.csdn.net/LiaoHongHB/article/details/103993074 当nacos ...
- Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | kiritomoe 来源 | 公众号「Kiri ...
- nacos 本地测试_Nacos注册中心落地实践
前言 公司在19年开始推进同城双活架构,未来规划是在南汇机房出现故障时能把所有读流量切到宝山机房,这样至少保证读请求是没问题的;我们的微服务使用的zookeeper来做服务发现, zk由于它的强一致性 ...
- 【手把手】教你玩转SpringCloud Alibaba之Nacos
1.什么是Nacos Nacos(Naming Configuration Service) 是一个易于使用的动态服务发现.配置和服务管理平台,用于构建云原生应用程序.而服务发现是微服务架构中的关键组 ...
- 【微服务】Day03(Nacos心跳机制、cart,stock项目业务、Dubbo概述)
Nacos心跳机制 常见面试题 心跳:周期性的操作,来表示自己是健康可用的机制 注册到Nacos的微服务项目(模块)都是会遵循这个心跳机制的 心跳机制的目的,是每个服务和Nacos保持沟通和交换信息的 ...
- 服务注册中心Nacos
文章目录 一.服务注册中心Nacos最佳实践 1.Nacos注册中心简介 背景分析 Nacos概述 构建Nacos服务 初始化配置 服务启动与访问 2.服务注册与调用入门(重点) 业务描述 生产者服务 ...
- Nacos服务注册中心(微服务)
为什么要用服务注册中心? 在微服务中,首先需要面对的问题就是如何查找服务(软件即服务), 其次就是如何在不同的服务之间进行通信? 如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带 ...
最新文章
- 百度大脑发布企业服务解决方案,将 AI 技术落实到细分领域
- laravel的redis配置,一直报错Class 'Predis\Client' not found
- 物理光学1 波动方程与基础波函数
- JavaScript设计模式(一)
- Python_列表常用操作
- elasticsearch Insert 插入数据和delete 删除数据(Java)
- 【图论】【最短路】【SPFA】香甜的黄油 Sweet Butter (luogu 1828)
- 计算机辅助与设计专业,计算机辅助设计与制造专业怎么样?
- 程序员的数学系列(一)
- PMP22年免费补考来袭 | 送上180道历年PMP考试试题及答案解析
- 2022-2028全球与中国OCR扫描软件市场现状及未来发展趋势
- python股市回测程序
- 第九届全国大学生GIS应用技能大赛下午(试题及参考答案含数据)
- Java file.encoding
- [交流] 新手常见(五国)(-v图)错误解决(原版,破解kernel,补丁kext下载)
- 苹果手机上网很慢_手机4G信号满格,上网速度却很慢?原来都是它们在“搞鬼”...
- InterValue正式启动主网映射
- 低代码助力生产管理:车间管理系统
- 【开源】港中文多媒体实验室开源目标跟踪工具箱MMTracking
- Electron(基于Vue)中使用IPC