Nacos源码学习笔记

1.源码入口

在spring.factories文件中,首先进入EnableAutoConfiguration=\下面的NacosDiscoveryAutoCOnfiguration类
在这里插入图片描述

2.开始分析

在NacosDiscoveryAutoConfiguration中有三个Bean,首先进入NacosAutoServiceRegistration
----》进入该类只会,会发现它继承一个AbstractAutoServiceRegistration父类
----》在父类中,它实现了一个ApplicationListener类,spring容器启动时会调用处理事件方法
----》ApplicationListenter接口有一个onApplicationEvent方法.

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    void onApplicationEvent(E var1);
}

看源码主要看里面的主要代码就可以了,有些无关紧要的代码,就像if else等一些异常判断,分支判断的代码就不要看了,本来看源码就很头疼的事了,再看这些的话,脑子估计会炸

----》onApplicationEvent实现了一个bind方法

@Override
@SuppressWarnings("deprecation")
public void onApplicationEvent(WebServerInitializedEvent event) {
   bind(event);
}

下面看一下bind(event)方法的源码:

@Deprecated
public void bind(WebServerInitializedEvent event) {
   ApplicationContext context = event.getApplicationContext();
   if (context instanceof ConfigurableWebServerApplicationContext) {
      if ("management".equals(((ConfigurableWebServerApplicationContext) context)
            .getServerNamespace())) {
         return;
      }
   }
   this.port.compareAndSet(0, event.getWebServer().getPort());
   this.start();
}

----》看一下start()方法的源码:

public void start() {
   if (!this.running.get()) {
      register();
   }
}

----》看一下register()放法的源码:

public void register(Registration registration) {
        String serviceId = registration.getServiceId();
        Instance instance = this.getNacosInstanceFromRegistration(registration); 
        this.namingService.registerInstance(serviceId, instance);
}

Instance:就是获取注册的服务实例。
看一下getNacosInstanceFromRegistration的源码:

private Instance getNacosInstanceFromRegistration(Registration registration) {
    Instance instance = new Instance();
    instance.setIp(registration.getHost());
    instance.setPort(registration.getPort());
    instance.setWeight((double)this.nacosDiscoveryProperties.getWeight());
    instance.setClusterName(this.nacosDiscoveryProperties.getClusterName());
    instance.setMetadata(registration.getMetadata());
    return instance;
}

上面有服务的ip和端口,集群名字等,就是在我们服务启动时,会把我们在yml配置文件的内容放到Registration里面去,最终将这些数据组装成一个Instance,然后根据获取的serviceId与Instance进行真正的注册。

看一下registerInstance(serviceId,istance)源码:

public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
    if (instance.isEphemeral()) {
        BeatInfo beatInfo = new BeatInfo();
        beatInfo.setServiceName(NamingUtils.getGroupedName(serviceName, groupName));
        beatInfo.setIp(instance.getIp());
        beatInfo.setPort(instance.getPort());
        beatInfo.setCluster(instance.getClusterName());
        beatInfo.setWeight(instance.getWeight());
        beatInfo.setMetadata(instance.getMetadata());
        beatInfo.setScheduled(false);
        long instanceInterval = instance.getInstanceHeartBeatInterval();
        beatInfo.setPeriod(instanceInterval == 0L ? DEFAULT_HEART_BEAT_INTERVAL : instanceInterval);
        this.beatReactor.addBeatInfo(NamingUtils.getGroupedName(serviceName, groupName), beatInfo);
    }

    this.serverProxy.registerService(NamingUtils.getGroupedName(serviceName, groupName), groupName, instance);
}

instance.isEphemeral()是判断该实例是不是临时实例,默认是临时实例。

还没看完,太头疼了,后续再看。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值