Nacos源码系列之服务发现(二)

一、前言

上篇博客介绍了客户端服务注册的流程,本篇介绍服务端的服务注册,服务发现等核心流程。

二、服务端-服务注册

入口在InstanceController的register(),核心逻辑在ServiceManager类中。

ServiceManager:核心服务管理类,管理服务、实例信息。包含nacos的服务注册表。

//Register an instance to a service in AP mode.
//先创建service,校验service,之后创建instance
public void registerInstance(String namespaceId, String serviceName, Instance instance) throws NacosException {
   
   
    
    createEmptyService(namespaceId, serviceName, instance.isEphemeral());
    
    Service service = getService(namespaceId, serviceName);
    
    checkServiceIsNull(service, namespaceId, serviceName);
    
    addInstance(namespaceId, serviceName, instance.isEphemeral(), instance);
}


public void createEmptyService(String namespaceId, String serviceName, boolean local) throws NacosException {
   
   
    createServiceIfAbsent(namespaceId, serviceName, local, null);
}

public void createServiceIfAbsent(String namespaceId, String serviceName, boolean local, Cluster cluster)
        throws NacosException {
   
   
    Service service = getService(namespaceId, serviceName);
    if (service == null) {
   
   
        
        Loggers.SRV_LOG.info("creating empty service {}:{}", namespaceId, serviceName);
        service = new Service();
        service.setName(serviceName);
        service.setNamespaceId(namespaceId);
        service.setGroupName(NamingUtils.getGroupName(serviceName));
        // now validate the service. if failed, exception will be thrown
        service.setLastModifiedMillis(System.currentTimeMillis());
        service.recalculateChecksum();
        if (cluster != null) {
   
   
            cluster.setService(service);
            service.getClusterMap().put(cluster.getName(), cluster);
        }
        service.validate();
        
        putServiceAndInit(service);
        if (!local) {
   
   
            addOrReplaceService(service);
        }
    }
}


//添加instance,获取service后,使用synchronized锁住service,防止并发操作。
public void addInstance(String namespaceId, String serviceName, boolean ephemeral, Instance... ips)
        throws NacosException {
   
   
    
    String key = KeyBuilder.buildInstanceListKey(namespaceId, serviceName, ephemeral);
    
    Service service = getService(namespaceId, serviceName);
    
    synchronized (service) {
   
   
        List<Instance> instanceList = addIpAddresses(service, ephemeral, ips);
        
        Instances instances = new Instances();
        instances.setInstanceList(instanceList);
        
        consistencyService.put(key, instances);
    }
}

ServiceManager的init()还做了一些初始化工作:


@PostConstruct
public void init() {
   
   
   //service reporter的定时任务执行器
    GlobalExecutor.scheduleServiceReporter(new ServiceReporter(), 60000, TimeUnit.MILLISECONDS);
    
//服务更新管理的定时任务执行器
    GlobalExecutor.submitServiceUpdateManager(new UpdatedServiceProcessor());
    
    if (emptyServiceAutoClean) {
   
   
        
        Loggers.SRV_LOG.info("open empty service auto clean job, initialDelay : {} ms, period : {} ms",
                cleanEmptyServiceDelay, cleanEmptyServicePeriod);
        
        // delay 60s, period 20s;
        
        // This task is not recommended to be performed frequently in order to avoid
        // the possibility that the service cache information may just be deleted
        // and then created due to the heartbeat mechanism
        
       //自动清理空的服务的执行器
        GlobalExecutor
         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值