SpringBoot完成服务的自动注册的时机,以ZooKeeper为注册中心为例
前言
在启动springboot应用时,配置好注册中心信息,就可以完成服务的自动注册,那么服务注册的时机在spingboot中是在哪一步实现?通过此篇文章记录一下个人阅读源码后的理解。
一、springBoot 工程配置
spring:
application:
name: xx #服务别名----注册zookeeper到注册中心名称
devtools:
restart:
enabled: false #关闭自启动
cloud:
zookeeper:
connect-string: 127.0.0.1:2181 #注册中心地址,多注册中心用逗号分隔
discovery:
register: true #是否启动服务注册
enabled: true #开启服务发现
# instance-id: ${spring.application.name}_${server.port} #用于向zookeeper注册的ID,默认为随机 UUID。
root: /yyyL #实例注册的根节点,默认为/services
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
二、Zk服务注册相关的配置类
ZookeeperAutoServiceRegistrationAutoConfiguration
这个类就是spring-cloud-starter-zookeeper-discovery自动装配导入的配置类,在jar包 spring.factories中查看。
ZookeeperAutoServiceRegistration
ZookeeperAutoServiceRegistration实例化的时候又有三个参数,分别是:ZookeeperServiceRegistry、ZookeeperRegistration、ZookeeperDiscoveryProperties
AbstractAutoServiceRegistration
ZookeeperAutoServiceRegistration是继承于AbstractAutoServiceRegistration
AbstractAutoServiceRegistration又是一个监听器,他监听了WebServerInitializedEvent事件,当事件触发时,会调用start()方法,start()方法中真正完成注册 动作是 register(), register()方法的真正实现其实是之前 通过构造方法传入进来的 ZookeeperServiceRegistry
监听事件
所以通过前面的代码发现,服务自动注册是依赖spring的监听机制实现的,那么WebServerInitializedEvent事件是在哪里产生的呢?
我们可以看到WebServerInitializedEvent有两个子类,其中springBoot中默认的实现其实是ServletWebServerInitializedEvent
事件的产生
Spring中 refresh()中的最后一步finishRefresh()
SpringBoot中ApplicationContext的默认实现是AnnotationConfigServletWebServerApplicationContext
可以看到是在 webServer被创建启动完成以后,产生事件ServletWebServerInitializedEvent 并被监听器触发。至此,就大概能知道 SpringBoot 应用启动到服务注册的流程了。
补充说明
下面再补充一下,ZookeeperAutoServiceRegistration实例化的时候,传入的三个参数。
ZookeeperRegistration – 服务的实例详情
服务的注册实例详情,包含 name、host 都是从配置文件中读取
ZookeeperServiceRegistry – 服务注册的真正实现类
这个类也是spring-cloud-starter-zookeeper-discovery自动装配导入的配置类,在此处被实例化并注入容器。
这个类主要用于 服务的注册,与zk的通讯。
ZookeeperServiceRegistry.register()方法就是注册服务
总结
以上就是今天要讲的内容,本文仅仅简单介绍了springBoot中zk作为注册中心的使用,主要原理就是通过SpringBoot的监听机制,完成服务的自动注册。初次写作,如有错误的地方欢迎大家指正。