Nacos源码InstanceController
生活随笔
收集整理的這篇文章主要介紹了
Nacos源码InstanceController
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
與服務(wù)注冊時一樣,在nacos-naming模塊中的InstanceController類中,定義了一個方法用來處理心跳請求:
@CanDistro @PutMapping("/beat") @Secured(parser = NamingResourceParser.class, action = ActionTypes.WRITE) public ObjectNode beat(HttpServletRequest request) throws Exception {// 解析心跳的請求參數(shù)ObjectNode result = JacksonUtils.createEmptyJsonNode();result.put(SwitchEntry.CLIENT_BEAT_INTERVAL, switchDomain.getClientBeatInterval());String beat = WebUtils.optional(request, "beat", StringUtils.EMPTY);RsInfo clientBeat = null;if (StringUtils.isNotBlank(beat)) {clientBeat = JacksonUtils.toObj(beat, RsInfo.class);}String clusterName = WebUtils.optional(request, CommonParams.CLUSTER_NAME, UtilsAndCommons.DEFAULT_CLUSTER_NAME);String ip = WebUtils.optional(request, "ip", StringUtils.EMPTY);int port = Integer.parseInt(WebUtils.optional(request, "port", "0"));if (clientBeat != null) {if (StringUtils.isNotBlank(clientBeat.getCluster())) {clusterName = clientBeat.getCluster();} else {// fix #2533clientBeat.setCluster(clusterName);}ip = clientBeat.getIp();port = clientBeat.getPort();}String namespaceId = WebUtils.optional(request, CommonParams.NAMESPACE_ID, Constants.DEFAULT_NAMESPACE_ID);String serviceName = WebUtils.required(request, CommonParams.SERVICE_NAME);NamingUtils.checkServiceNameFormat(serviceName);Loggers.SRV_LOG.debug("[CLIENT-BEAT] full arguments: beat: {}, serviceName: {}", clientBeat, serviceName);// 嘗試根據(jù)參數(shù)中的namespaceId、serviceName、clusterName、ip、port等信息// 從Nacos的注冊表中 獲取實例Instance instance = serviceManager.getInstance(namespaceId, serviceName, clusterName, ip, port);// 如果獲取失敗,說明心跳失敗,實例尚未注冊if (instance == null) {if (clientBeat == null) {result.put(CommonParams.CODE, NamingResponseCode.RESOURCE_NOT_FOUND);return result;}Loggers.SRV_LOG.warn("[CLIENT-BEAT] The instance has been removed for health mechanism, "+ "perform data compensation operations, beat: {}, serviceName: {}", clientBeat, serviceName);// 這里重新注冊一個實例instance = new Instance();instance.setPort(clientBeat.getPort());instance.setIp(clientBeat.getIp());instance.setWeight(clientBeat.getWeight());instance.setMetadata(clientBeat.getMetadata());instance.setClusterName(clusterName);instance.setServiceName(serviceName);instance.setInstanceId(instance.getInstanceId());instance.setEphemeral(clientBeat.isEphemeral());serviceManager.registerInstance(namespaceId, serviceName, instance);}// 嘗試基于namespaceId和serviceName從 注冊表中獲取Service服務(wù)Service service = serviceManager.getService(namespaceId, serviceName);// 如果不存在,說明服務(wù)不存在,返回404if (service == null) {throw new NacosException(NacosException.SERVER_ERROR,"service not found: " + serviceName + "@" + namespaceId);}if (clientBeat == null) {clientBeat = new RsInfo();clientBeat.setIp(ip);clientBeat.setPort(port);clientBeat.setCluster(clusterName);}// 如果心跳沒問題,開始處理心跳結(jié)果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; }最終,在確認(rèn)心跳請求對應(yīng)的服務(wù)、實例都在的情況下,開始交給Service類處理這次心跳請求。調(diào)用了Service的processClientBeat方法
總結(jié)
以上是生活随笔為你收集整理的Nacos源码InstanceController的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nacos服务端
- 下一篇: Nacos源码处理心跳请求