专业的编程技术博客社区

网站首页 > 博客文章 正文

Nacos服务注册先注册还是Tomcat先启动 #微服务

baijin 2024-10-01 07:16:09 博客文章 4 ℃ 0 评论

Nacos服务注册先?还是Tomcat启动先?

当一个微服务程序启动的时候,到底是先进行的服务注册还是先启动的Tomcat?我们知道在一个Spring Cloud程序里面,如果想要用Nacos去进行服务注册和发现,需要引入starter的依赖,而它其实对应的就是一个Jar,而这个Jar里面就去定义了很多的自动配置类。

这些自动配置类里面有一个跟服务注册有关系的自动配置类,而这个类里面就定义了一个很核心的服务注册的Bean,而我们来看Bean它其实就是实现的这个类而不是 MOS 的Bean BOX JanuaryP BOX,这个类它并不是Nacos实现的,而是Spring Cloud提供的,相当于也是一种规范。

这个类它实现的ApplicationListener的接口,从这里可以看出其实就是要去监听WebServerlnitializedEvent的事件。在这个类里面它其实就实现了onApplicationEvent的方法,从而可以去处理这个事件,而一旦有了这个事件过来就会调用bind方法,而start方法就会去调用register方法。

这个register的方法本身它是有自己的实现的,但是像刚刚看到的Nacos的类,它其实就重写了register的方法,所以说这里表达的意思是Spring Cloud其实定义了服务注册应该在什么时候去发生,但是具体怎么注册的可以由Nacos或者说Eur珊珊自己来实现具体的注册的流程。

但是时间点是由Spring Cloud定义的。我们再回头来看,从这我们就可以看出只要什么时候发布了这个事件,那么就会触发服务注册的流程。这个事件它到底什么时候发布的?我们不妨在这里打一个断点,然后直接启动一下程序看一下,进到断点的调用链路是在什么时候过来的?

首先这中间有一个比较关键的代码就是这里是dot,所以说这个start,它里面就会去发布刚刚说的这个事件。

starstar其实是属于WebServer StartStop Lifecycle这个类里面的。大家对spring里面的Lifecycle机制比较熟应该就立马能够想到不熟。没关系。

再看star的方法,它又是在什么时候调用的?其实它是在Spring容器的finish refresh方法里面。比如说这个方法里面会来调用代码,而代码就会获取life cycle,然后去调用start的方法。

并且再看这个方法的下面就会去发布一个比较熟悉的事件,是Spring容器启动完成的事件。所以可以这么理解,当我们在四倍容器启动的时候,当执行这行代码的时候就会去调到四大的方法从而去发布事件。可以大概理解为事件发布完了之后才会发布contextRefreshed的事件。

所以这个注意。

·但是我们再看,其实在事件发布之前这里还有一个start,大家对WebServer比较熟就应该能够理解。其实SpringBoot里面的WebServer其实表示的是tomcat或者jetty或者undertow等等。具体就看你当前用的是什么。比如当前用的是Tomcat,那么它其实对应的就是Tomcat。

所以从这里也可以看出,其实它就是在启动完Tomcat之后才会发布事件。而一旦发布事件其实就会触发nacos的服务注册。所以说这行代码就是我们想要的答案。

喜欢就点个关注吧。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表