我们注册在consul上的服务,都是通过spring cloud consul discorvery来实现的,可以通过maven依赖导入spring-cloud-consul-discovery包。
对于spring项目,首先查看spring.factories文件:
从源码中可以找到服务注册、自动服务注册、配置、服务发现等功能所对应的类。对于服务自动注册,对应的就是ConsulAutoServiceRegistrationAutoConfiguration,通过@Bean自动注入了ConsulAutoServiceRegistration类
ConsulAutoServiceRegistration又继承了AbstractAutoServiceRegistration抽象类
在AbstractAutoServiceRegistration中,实现了ApplicationContextAware和ApplicationListener接口。下面分别对这两个接口进行分析。
1.ApplicationContextAware
这个接口里面只有一个方法setApplicationContext,如果实现了这个方法,Spring在启动的时候就需要实例化这个class,在实例化这个class的时候,发现它包含这个ApplicationContextAware接口的话,Spring就会调用这个对象的setApplicationContext方法,把applicationContext给塞进去。
而在AbstractAutoServiceRegistration中,重写的方法为:
知道了如何调用,那么又是如何触发的呢?
2.ApplicationListener
AbstractAutoServiceRegistration还实现了ApplicationListener接口,ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理;如果容器中存在ApplicationListener的Bean,当ApplicationContext调用publishEvent方法发送事件时,对应Bean的onApplicationEvent会被触发。
而在AbstractAutoServiceRegistration中,重写的方法为:
start()方法:
当收到web server初始化成功的事件之后,会触发bind方法,更新服务监听端口、发布预注册事件、开始注册、发布注册成功事件、更新服务运行标志。
触发之后,就会调用注册过程:
super.register(),register()的方法在ConsulServiceRegistry类中:
Consul api包中,调用了consul开源的注册API
至此,注册逻辑结束。