Spring Cloud Alibaba Nacos注册中心(3) 服务注册原理

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方法,看下面流程图吧
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值