Spring Cloud服务治理

Spring Cloud目前使用最多的服务治理框架为Consul、Zookeeper、Eureka,通过这些框架一览Spring Cloud服务发现和治理的概况。

这些服务治理的框架都需要解决一致性算法问题,而Consul无疑是这方面的佼佼者,Consul使用Raft协议复制状态,提供了强烈一致性。而Eureka要达到强一致性需求就需要借助ZooKeeper了。

注:Raft和Paxos不具备可比性。虽然两者都为解决连机器网络中的共识问题,但Paxos关注共识的机制,而Raft则围绕复制的实现。

Consul

Consul是由google开源的采用go语言实现的服务治理框架。

Consul特点

内置服务注册、发现,分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案。每个节点都需要运行agent,两种运行模式server、client。官方推荐每个数据中心3~5个server节点,以保证server-leader的选举正确性和数据安全。

Eureka

纯Java实现的分布式微服务架构服务治理框架,具有服务注册与发现的功能。

Eureka服务端特点

支持高可用配置、强一致性, 集群模式部署。出分片故障时转入自我保护模式。

Eureka客户端

处理服务的注册与发现。向注册中心注册自身提供的服务,周期性地发送心跳请求更新服务租约(续约/Renew),把从服务端获取的服务信息缓存在本地(服务端每隔30秒更新一次服务信息),通过周期性的刷新更新服务状态。其它主流语言也实现了自己的客户端框架:Steeltoe(.NET平台)、eureka-js-client(Node.js)。

Eureka中引入Region和Zone的概念,客户端会优先调用同一个Zone下服务,其次是同一个Region下的其他Zone。Eureka Server会对一定时间内(默认为90秒)没有续约的服务进行剔除。

Spring Cloud Eureka

Spring Cloud为Eureka添加了Spring Boot风格的包装,与Spring Boot为基础的应用无缝集成。Spring Cloud中Eureka分Server与Discovery Client。

Spring Cloud服务注册/销毁过程

Spring Cloud服务注册/销毁过程依托以下三个接口。

org.springframework.context.Lifecycle

生命周期接口,应用启动/停止时会异步调用此接口的实例,多个实例之间依靠phase()方法确定调用顺序,phase越小代表最先启动,最后停止。回调超时时间默认为30秒。

org.springframework.cloud.client.ServiceInstance

Spring Cloud中服务实例的接口。

org.springframework.cloud.client.serviceregistry.ServiceRegistry<R extends Registration>

向服务注册中心注册/注销实例的接口。

利用Lifecycle接口,在应用启动时调用ServiceRegistry接口对ServiceInstance实例进行注册,并在应用销毁时发送服务注销请求。