服务同步机制
服务同步机制是用来同步 Eureka Server 节点之间服务信息的。
它包括 Eureka Server 启动时的同步,和运行过程中的同步。
启动时同步
Eureka Server 启动后,遍历 eurekaClient.getApplications 获取服务信息,并将服务信息注册到自己的 registry 中。
注意这里是两层循环,第一层循环是为了保证已经拉取到服务信息,第二层循环是遍历拉取到的服务信息。
运行过程中同步
当 Eureka Server 节点有 register、renew、cancel 请求进来时,会将这个请求封装成 TaskHolder 放到 acceptorQueue 队列中,然后经过一系列的处理,放到 batchWorkQueue 中。
TaskExecutor.BatchWorkerRunnable是个线程池,不断的从 batchWorkQueue 队列中 poll 出 TaskHolder,然后向其他 Eureka Server 节点发送同步请求。
这里省略了两个部分:
- 一个是在 acceptorQueue 向 batchWorkQueue 转化时,省略了中间的 processingOrder 和 pendingTasks 过程。
- 另一个是当同步失败时,会将失败的 TaskHolder 保存到 reprocessQueue 中,重试处理。
对微服务解决方案 Dubbo 和 Spring Cloud 的对比非常多,这里对注册中心做个简单对比。
Zookeeper |
Eureka |
|
设计原则 |
CP |
AP |
优点 |
数据强一致 |
服务高可用 |
缺点 |
网络分区会影响 Leader 选举,超过阈值后集群不可用 |
服务节点间的数据可能不一致;Client-Server 间的数据可能不一致; |
适用场景 |
单机房集群,对数据一致性要求较高 |
云机房集群,跨越多机房部署;对注册中心服务可用性要求较高 |
实现
1、pom依赖
2、配置文件
3、启动类
4、访问启动页
参考文章: