spring-cloud-eureka是spring-cloud-nettfix微服务套件中的一部分, 它基于nettfix-eureka做了二次封装,主要负责微服务架构中的服务治理功能。
需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码一七九一七四三三八零
如果了解dubbo的朋友应该知道,dubbo就是一个服务治理的框架,dubbo是基于zookeeper实现服务治理功能的。至于dubbo和nettfix-eureka的区别这里不多说,网上有不少这类文章。
服务治理一般都会有两个功能:服务注册、服务发现。通常会有一个注册中心,每个服务单元向注册中心登记自己信息,比如提供的服务,ip, 端口以及一些附近加信息等。注册中心会将新的服务实例发送给其它依赖此服务的实例。
服务注册
服务提供者在启动时会将自己的信息注册到Eureka Server, Eureka Server收到信息后, 会将数据信息存储在一个双层结构的Map中,其中第一层的key是服务名,第二层的key是具体服务的实例名。
服务同步
如果有多个Eureka Server,一个服务提供者向其中一个Eureka Server注册了,这个Eureka Server会向集群内的其它Eureka Server转发这个服务提供者的注册信息,从而实现实现Eureka Server之间的服务同步。
服务续约
在注册完成成后,服务提供者会维护一个心中持续发送信息给Eureka Server(注册中心)表示正常运行,以防止Eureka Server将该服务实例从服务列表中剔除。
服务下线
当服务实例正常关闭时,它会发送一个服务下线的消息给注册中心,注册中心收到信息后,会将该服务实例状态置为下线,并把该信息传播出去。
获取服务
当一个服务实例依赖另一个服务时,这时这个服务实例又充当了服务消费者,它会发送一个信息给注册中心, 请求获取注册的服务清单,注册中心会维护一份只读的服务清单来返回给服务消费者。
失效剔除
有时候,服务实例可能无法正常提供服务,而注册中心没有收到服务下线的信息。注册中心会创建一个定时任务,将超过一定时间没有服务续约消息的服务实例从服务清单中剔除。
自我保护
上面讲到失效剔除时,会将超过一定时间没有收到服务续约消息的实例从服务清单中剔除掉,在这中间还有一个逻辑。如果在运行期间,统计心跳成功的比例低于85%(心跳阈值),注册中心会将当前服务清单中的实例注册信息保护起来,让这些实例不会过期。但是在这种情况下,若服务实例出现问题,那么服务消费者可能会拿到实际已经不能正常运行的服务实例,就会出现调用失败的情况,所以客户端需要有容错机制,比如请求重试,或断路器等。
但是有一个定时任务默认每15分钟执行一次,会根据运行状况重新计算心跳阈值;但也可能不重新计算,这时,Eureka Server的自我保护状态会一直存在。
如果要关闭自我保护机制,可以将eureka.server.enable-self-preservation设置为false,以确保注册中心将不可用的服务实例及时剔除。