什么是服务治理
在传统的RPC远程调用框架中,管理每个服务与服务之间的依赖关系比较复杂,所以需要服务治理,管理服务之间的依赖关系。通过服务治理可以实现服务注册与发现、服务调用、负载均衡、容错等
SpringCloud封装了Netflix公司开发的Eureka模块来实现服务治理
什么是服务注册与发现
Eureka采用了CS的设计架构,Eureka Server作为i服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka Client作为客户端链接到Eureka Server并维持心跳链接。这样就可以通过Eureka Server来监控各个微服务是否正常运行。
当一个微服务启动的时候,会把自己的通信地址(比如IP、端口号等)以别名的方式注册到服务注册中心,对于那些需要调用该服务的其他微服务会通过别名去服务注册中心获取实际的通信地址,以实现微服务间的服务调用。
在任何RPC远程调用框架中,都会有一个注册中心用来存放服务地址相关的信息、管理服务之间的依赖关系,实现服务的治理。
Eureka的2个组件
Eureka Server
Eureka Server提供服务注册服务,各个微服务节点通过配置启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,这些信息可以在界面中直观看到。
Eureka Client
Eureka Client是个Java客户端,用于简化和Eureka Server的交互,客户端内置了一个使用轮询算法的负载均衡器。应用集成了Eureka Client启动后,将会向Eureka Server发送心跳(默认周期30秒)。如果Eureka Server 在多个心跳周期没有接收到某个节点的心跳,Eureka Server将会从服务注册表中移除该节点(默认90秒)。作为消费者角色的Eureka Client获取到了服务地址后会缓存在本地JVM内存中,默认每30秒更新一次服务地址
Eureka自我保护模式
网络分区故障:一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,
使得有些节点之间不连通了,整个网络就分成了几块区域。节点、数据就散布在了这些不连通的区域中。
这就叫网络分区故障。
默认情况下,如果Eureka Server在一定时间内没有收到某个微服务实例的心跳,将会立刻注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与Eureka Server之间无法正常通信,这种情况下微服务实例本身大概率是健康的,此时不应该注册此微服务实例。Eureka Server通过“自我保护模式”来解决这个问题-当Eureka Server在短时间丢失过多客户端(可能发生了网络故障),那么Eureka Server就会进入自我保护模式。
保护模式主要用于一组客户端和Eureka Server之间存在网络分区故障场景下的保护。一旦进入保护模式,在自我保护期间Eureka Server将会尝试保护服务注册表中的信息,不会删除服务注册表中的数据,也就是不会立即注销任何微服务实例。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销可能健康的服务实例。保护模式是Eureka高可用的一个提现,属于**CAP(Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性))**理论的AP分支。