解析心跳服务器消息失败,Nacos - 服务端处理心跳请求

本文详细解析了Nacos服务端如何处理心跳请求。首先,InstanceController#beat方法接收心跳,判断并处理实例注册。接着,ServiceManager通过ip和端口获取或注册Instance,并处理心跳。心跳处理过程中,更新实例的最后心跳时间和健康状态,并使用ClientBeatProcessor更新实例信息。当心跳变化时,PushService广播消息到客户端,确保服务同步。整个过程涉及到线程池调度、UDP数据发送与重试机制,以及心跳的刷新和健康检查。
摘要由CSDN通过智能技术生成

服务端用InstanceController#beat方法接收心跳请求。

InstanceController#beat

这里会判断是否已经有实例,如果没有就创建实例,然后再开始检查心跳。public ObjectNode beat(HttpServletRequest request) throws Exception {

ObjectNode result = JacksonUtils.createEmptyJsonNode();

// 设置心跳时间,会直接改客户端的心跳时间

result.put(SwitchEntry.CLIENT_BEAT_INTERVAL, switchDomain.getClientBeatInterval());

String beat = WebUtils.optional(request, "beat", StringUtils.EMPTY);

// 其他略

// 通过namespaceId, serviceName, clusterName, ip, port获取Instance

Instance instance = serviceManager.getInstance(namespaceId, serviceName, clusterName, ip, port);

// 如果没有,则注册

if (instance == null) {

// 这个是通过beat判断的,如果是第一次,则beat有信息,就会创建clientBeat

// 如果不是第一次,正常instance不为空的,所以此时为空说明可能被移除了

if (clientBeat == null) {

result.put(CommonParams.CODE, NamingResponseCode.RESOURCE_NOT_FOUND);

return result;

}

// 其他略

// 注册

serviceManager.registerInstance(namespaceId, serviceName, instance);

}

// 从serviceMap缓存获取Service

Service service = serviceManager.getService(namespaceId, serviceName);

if (service == null) {

throw new NacosException(NacosException.SERVER_ERROR,

"service not found: " + serviceName + "@" + namespaceId);

}

// 不是第一次,组装clientBeat

if (clientBeat == null) {

clientBeat = new RsInfo();

clientBeat.setIp(ip);

clientBeat.setPort(port);

clientBeat.setCluster(clusterName);

}

// 处理心跳

service.processClientBeat(clientBeat);

result.put(CommonParams.CODE, NamingResponseCode.OK);

if (instance.containsMetadata(PreservedMetadataKeys.HEART_BEAT_INTERVAL)) {

result.put(SwitchEntry.CLIENT_BEAT_INTERVAL, instance.getInstanceHeartBeatInterval());

}

result.put(SwitchEntry.LIGHT_BEAT_ENABLED, switchDomain.isLightBeatEnabled());

return result;

}

ServiceManager#getInstance

通过ip和端口获取实例public Instance get

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值