@[toc]

服务注册(AP协议)

Nacos供应了NamingService的registerInstance方法来供应服务注册的功能。 因此只需我们能获取到这个NamingService即可结束服务的注册。

【源码剖析】Nacos主动注册源码剖析

我们可以经过NacosFactory的方法来获取到NamingService以及配备中心ConfigService。

【源码剖析】Nacos主动注册源码剖析

而这个注册中心的底层获取方法其实就是经过反射的方法来重建一个注册中心类。

【源码剖析】Nacos主动注册源码剖析

所以我们可以依照如下方法注册并且获得注册中心的全部实例,并且监听注册中心对应实例的改动,代码如下:

public class RegisterMain {
    public static void main(String[] args) throws NacosException {
        NamingService namingService = NacosFactory.createNamingService("123.249.97.220:8848");
        namingService.registerInstance("config-center","localhost",8808);
        namingService.registerInstance("config-center","localhost",8809);
        List<Instance> allInstances = namingService.getAllInstances("config-center");
        System.out.println(allInstances);
        System.out.println("---------------");
        namingService.subscribe("config-center", new EventListener() {
            @Override
            public void onEvent(Event event) {
                NamingEvent namingEvent = (NamingEvent) event;
                System.out.println("监听器监听到服务改动,服务称号为:"+namingEvent.getServiceName());
                System.out.println("监听器监听到服务改动,其时实例列表为:"+namingEvent.getInstances());
            }
        });
        while(true){
        }
    }
}

详细注册实例的方法如下,此刻Nacos会依据创立的是否是短实例来挑选运用grpcproxy或者httpproxy署理来注册实例。

【源码剖析】Nacos主动注册源码剖析
【源码剖析】Nacos主动注册源码剖析
【源码剖析】Nacos主动注册源码剖析
其实大概可以看出服务注册就是向服务端发送了一个POST央求并且进行服务的注册。

服务发现(CP协议)

我们从注册中心获取服务的时分,肯定是要确保服务的一致性的,否则有些服务挂机了,你还能获取到他的实例,成果发个央求都是报错,所以服务发现挑选的是CP协议,也就是Raft。 服务发现的getAllInstances其实底层也可以想到一定是和上面一套相同的流程。

【源码剖析】Nacos主动注册源码剖析

我们挑选httpclientproxy来检查,可以发现底层就是一个get央求

【源码剖析】Nacos主动注册源码剖析

Nacos是怎么整合到SpringCloudAlibaba的?

我们知道,SpringBoot根据Spring供应了一个扩展点,直接运用Spring来整合第三方是非常复杂的。 而有了SpringBoot之后,根据SpringBoot的约好优于配备的思想,我们只需求将我们需求主动加载的类编写在spring.factories文件中即可。在SpringBoot2.7之后更是改动了主动注入的方法,变得更为简略。

【源码剖析】Nacos主动注册源码剖析

此刻就可以看到Nacos的注册服务现已被加载了

【源码剖析】Nacos主动注册源码剖析
【源码剖析】Nacos主动注册源码剖析

所以上面的一套流程可以理解为:我们引进了Nacos作为注册中心之后。 SpringBoot会主动加载我们的配备类,然后这个配备类包含我们的注册中心的配备,也就是现已为我们供应好了注册方法。那么此刻我们的问题就变为了,怎么在其时服务发动后,主动的调用NacosServiceRegistry的register方法来将其时服务注册到注册中心去。 在上面那个bean中用于结束配备特色的封装,而在下面那个bean中则结束我们的服务的主动注册,从称号中也可以看出,Nacos主动注册服务。

【源码剖析】Nacos主动注册源码剖析

我们现在关键看NacosAutoServiceRegistration这个类。 我们点开这个类中发现其继承联系如下:

【源码剖析】Nacos主动注册源码剖析

关键就在于这个ApplicationListener了,我们知道,Spring在结束容器创立之后,会调用AbstractApplicationContext的refresh方法,而这个方法会注册监听器并且发布一个工作。

【源码剖析】Nacos主动注册源码剖析
而这个工作就是容器改写工作。
【源码剖析】Nacos主动注册源码剖析
而这个工作最终就会触发Web容器初始化工作,从而触发对应的监听器
【源码剖析】Nacos主动注册源码剖析
而这个工作发布之后,就会被我们的监听器所监听到并且实行对应的逻辑,如下:
【源码剖析】Nacos主动注册源码剖析
【源码剖析】Nacos主动注册源码剖析
可以发现这儿的工作处理包含了一个由Nacos供应的主动注册类来结束。原因就是因为上面的Nacos的主动注册类完成了ApplicationListener
【源码剖析】Nacos主动注册源码剖析
【源码剖析】Nacos主动注册源码剖析
之后start方法将会进行注册
【源码剖析】Nacos主动注册源码剖析
而这个register方法,就会调用其完成的详细的注册方法
【源码剖析】Nacos主动注册源码剖析
此方法即NacosServiceRegistry供应的register方法,而他现已在我们引进Nacos-discovery这个依赖的时分就现已结束了主动注入。
【源码剖析】Nacos主动注册源码剖析
我们知道SpringCloud其实是一种SPI思想,他只是担任供应一群接口,而其他的厂家根据这个接口来完成详细的方法,Alibaba就是其中的一种,所以可以看到NacosServiceRegistry其实就是完成了SpringCloud供应的接口算了。
【源码剖析】Nacos主动注册源码剖析

【源码剖析】Nacos主动注册源码剖析