微服务架构中最核心的部分是服务治理,服务治理最基础的组件是注册中心。
关于注册中心的解决方案,dubbo支持了Zookeeper、Redis、Multicast和Simple,官方推荐Zookeeper。Spring Cloud支持了Zookeeper、Consul和Eureka,官方推荐Eureka。
两者之所以推荐不同的实现方式,原因在于组件的特点以及适用场景不同。简单来说:
- ZK的设计原则是CP,即强一致性和分区容错性。他保证数据的强一致性,但舍弃了可用性,如果出现网络问题可能会影响ZK的选举,导致ZK注册中心的不可用。
- Eureka的设计原则是AP,即可用性和分区容错性。他保证了注册中心的可用性,但舍弃了数据一致性,各节点上的数据有可能是不一致的(会最终一致)。
Eureka采用纯Java实现,除实现了注册中心基本的服务注册和发现之外,极大的满足注册中心的可用性,即使只有一台服务可用,也可以保证注册中心的可用性。
组件调用关系
服务提供者:
- 启动后,向注册中心发起register请求,注册服务
- 在运行过程中,定时向注册中心发送renew心跳,证明“我还活着”。
- 停止服务提供者,向注册中心发起cancel请求,清空当前服务注册信息。
服务消费者
- 启动后,从注册中心拉取服务注册信息
- 在运行过程中,定时更新服务注册信息。
- 服务消费者发起远程调用
注册中心
- 启动后,从其他节点拉取服务注册信息。
- 运行过程中,定时运行evict任务,剔除没有按时renew的服务(包括非正常停止和网络故障的服务)。
- 运行过程中,接收到的register、renew、cancel请求,都会同步至其他注册中心节点。