Nacos 服务注册原理
文章目录
1、NacosServiceRegistry
实现ServiceRegistry接口,ServiceRegistry是SpringCloud提供的服务注册规范,提供服务注册功能,它有个nacosServiceManager属性,注册/解绑 等都是通过serviceManager的namingService与服务端进行交互。
2、NacosRegistration
实现Registration, ServiceInstance俩接口,两个接口也都是SpringCloud提供的服务注册与发现的规范接口。可以看作是当前服务的注册信息对象。
3、NacosAutoServiceRegistration
Nacos服务自动注册实现,继承AbstractAutoServiceRegistration,而AbstractAutoServiceRegistration也是SpringCloud提供的服务自动注册规范接口,同时AbstractAutoServiceRegistration接收WebServerInitializedEvent事件。
// web server启动成功后,将执行此方法
public void start() {
// 如果想让当前服务不进行注册,那么可以再 discoveryProperties中进行设置,再这里进行阻断
if (!isEnabled()) {
if (logger.isDebugEnabled()) {
logger.debug("Discovery Lifecycle disabled. Not starting");
}
return;
}
//原子类保证只执行一次
if (!this.running.get()) {
//1、推送InstancePreRegisteredEvent事件
this.context.publishEvent(new InstancePreRegisteredEvent(this, getRegistration()));
//2、将调用NacosAutoServiceRegistration实现的register方法
register();
if (shouldRegisterManagement()) {
registerManagement();
}
//3、推送InstanceRegisteredEvent
this.context.publishEvent(new InstanceRegisteredEvent<>(this, getConfiguration()));
this.running.compareAndSet(false, true);
}
}
-
InstancePreRegisteredEvent
NacosServiceManager注册了此事件,它内部有nacosDiscoveryPropertiesCache属性,监听此事件后,就将获取当前registration实例,获取discoveryproperties配置文件,并赋值给NacosServiceManager属性
-
InstanceRegisteredEvent
这两个事件都是属于SpringCloud服务注册的规范,当注册成功后会发送注册完成事件,而谁监听了它呢?还记得之前看Spring Cloud Gateway时的动态路由么?
@Override public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ContextRefreshedEvent) { ContextRefreshedEvent refreshedEvent = (ContextRefreshedEvent) event; if (!WebServerApplicationContext.hasServerNamespace(refreshedEvent.getApplicationContext(), "management")) { reset(); } } // 监听到 有服务注册成功后,会重新加载路由 else if (event instanceof RefreshScopeRefreshedEvent || event instanceof InstanceRegisteredEvent) { reset(); } else if (event instanceof ParentHeartbeatEvent) { ParentHeartbeatEvent e = (ParentHeartbeatEvent) event; resetIfNeeded(e.getValue()); } else if (event instanceof HeartbeatEvent) { HeartbeatEvent e = (HeartbeatEvent) event; resetIfNeeded(e.getValue()); } }
3.1、客户端注册服务(register)
执行register方法时,将最终调用NacosServiceRegistry#register方法,看下面流程图吧