Spring Cloud之Eureka Server启动过程
前面对Eureka的服务端及客户端的使用均已成功实践,对比Zookeeper注册中心的使用区别还是蛮大的:
P:分区容错性(⼀定的要满⾜的)C:数据⼀致性 A:⾼可⽤;CAP不可能同时满⾜三个,要么是AP,要么是CP。
就使用而言最明显就是Zookeeper需要安装3个或3个以上服务端安装启用才能构成集群,而Eureka导入依赖处理配置文件同时开启Eureka Server自动装配即可。Zookeeper具体使用可参考Zookeeper应用之一:数据发布与订阅初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)。
Eureka Server如何启动的呢?回忆一下Spring Boot的热插拔技术Spring Boot 热插拔技术应用 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com),Eureka Server启动也是利用了该技术。
通过源码可知,需要有⼀个marker bean,才能装配Eureka Server,那么这个marker其实是由@EnableEurekaServer注解决定的。所以@EnableEurekaServer开启了Eureka Server的自启动。
下面重点分析自动配置及Server启动部分:
1、EurekaServerAutoConfiguration
2、EurekaServerInitializerConfiguration
对于实现了Lifecycle接口的EurekaServerInitializerConfiuration,start方法如何生效呢?实际上Spring提供了LifecycleProcessor接口,即生命周期处理器处理生命周期相关的内容(参考Spring容器变化之SmartLifecycle,LifecycleProcesso接口详述 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)),具体如下:
3)EurekaServerInitializerConfiuration中start做了哪些工作:
上图中几个点需要注意:
1)事件发布,从命令模式的维度理解Spring 之Application Event - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中详细阐述了Spring关于事件处理的应用和机制。通过图中事件UML图
那么这俩事件的监听者是谁呢?即具体执行他们的是哪个Listener呢?找到泛型为这俩事件类型或父类型的Listener即可,跟踪可发现是通用事件RestartXXXXListener,只要实现了ApplicationEvent的类均会执行。
2)事件发布前,eureka各种环境准备关注int registryCount = this.registry.syncUp();
对于注册到服务器端的服务组件, Eureka 服务器并没有提供后台的存储, 这些注册的服务实例被保存在内存的注册中心, 它们通过心跳来保持其最新状态, 这些操作都可以在内存中完成。 客户端存在着相同的机制, 同样在内存中保存了注册表信息, 这样的机制提升了Eureka 组件的性能, 每次服务的请求都不必经过服务器端的注册中心。