本文共 3415 字,大约阅读时间需要 11 分钟。
Spring Cloud Alibaba Discovery模块源码解析
在上一篇文章中,我们初步了解了NacosAutoServiceRegistration类的基本功能。接下来,我们将深入分析其源码,揭示其工作原理。
1. NacosAutoServiceRegistration类的register方法
NacosAutoServiceRegistration类中的register方法主要负责注册服务。代码如下:
protected void register() { if (!this.registration.getNacosDiscoveryProperties().isRegisterEnabled()) { log.debug("Registration disabled."); } else { if (this.registration.getPort() < 0) { this.registration.setPort(this.getPort().get()); } super.register(); }} 这个方法首先检查是否启用注册功能。如果启用且端口号有效,则调用父类的register方法。
2. 调用父类的register方法
父类的register方法位于AbstractAutoServiceRegistration类中,代码如下:
protected void register() { this.serviceRegistry.register(this.getRegistration());} 可以看到,这个方法实际上是调用了serviceRegistry的register方法,并传递了当前的注册信息。
3. 进入ServiceRegistry接口
接下来,我们需要查看ServiceRegistry接口的定义。其代码如下:
package org.springframework.cloud.client.serviceregistry;public interface ServiceRegistry{ void register(R var1); void deregister(R var1); void close(); void setStatus(R var1, String var2); T getStatus(R var1);}
这个接口定义了四个主要方法:register、deregister、close和setStatus。这些方法的作用是管理服务注册和相关操作。
4. NacosServiceRegistry的实现
接下来,我们关注NacosServiceRegistry类,它是Nacos实现ServiceRegistry接口的类。代码如下:
package com.alibaba.cloud.nacos.registry;import com.alibaba.cloud.nacos.common.utils.StringUtils;import com.alibaba.cloud.nacos.registry.registration.Registration;import com.alibaba.cloud.nacos.registry.registration.Instance;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;public class NacosServiceRegistry implements ServiceRegistry{ private static final Logger log = LoggerFactory.getLogger(NacosServiceRegistry.class); private final NacosDiscoveryProperties nacosDiscoveryProperties; private final NamingService namingService; @Autowired public NacosServiceRegistry(NacosDiscoveryProperties nacosDiscoveryProperties) { this.nacosDiscoveryProperties = nacosDiscoveryProperties; this.namingService = nacosDiscoveryProperties.namingServiceInstance(); } @Override public void register(Registration registration) { if (StringUtils.isEmpty(registration.getServiceId())) { log.warn("No service to register for nacos client..."); } else { String serviceId = registration.getServiceId(); Instance instance = this.getNacosInstanceFromRegistration(registration); try { this.namingService.registerInstance(serviceId, instance); log.info("nacos registry, {} {}:{} registered.", serviceId, instance.getHost(), instance.getPort()); } catch (Exception e) { log.error("failed to register nacos service: {}", serviceId, e); } } }}
5. ServiceRegistry的实现细节
在NacosServiceRegistry中,register方法接收了一个Registration对象。首先,检查serviceId是否为空。如果为空,则记录警告信息。如果serviceId有效,则从注册信息中获取实例,并调用NamingService的registerInstance方法进行注册。
6. 依赖注入和初始化
NacosServiceRegistry类中使用了依赖注入来获取NacosDiscoveryProperties和NamingService。这些依赖通常由Spring容器负责注入,以确保服务的自动化配置和管理。
7. 实例注册过程
在注册过程中,NacosServiceRegistry通过namingService.registerInstance方法将服务实例注册到Nacos服务中心。同时,日志记录了注册的详细信息,便于后续的监控和排查。
8. 总结
通过以上分析,我们可以清晰地看到NacosAutoServiceRegistration类在服务注册过程中的关键作用。它通过调用父类的register方法, ultimately调用了ServiceRegistry接口的实现类NacosServiceRegistry的register方法,从而将服务注册信息发送到Nacos服务中心。
发表评论
最新留言
关于作者