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()是判断该实例是不是临时实例,默认是临时实例。
还没看完,太头疼了,后续再看。。。。