今天社保中心来了一位钉子户,90多岁的王大爷又兴高采烈的来给自己快120岁的老父亲领社保了!
工作人员这一-想,好像哪里不对啊,这老父亲120岁的年纪都可以上吉尼斯世界纪录了,要不咱帮老爷子去申请一下?王大爷一听可慌了,连连表示使不得使不得,就来领个社保而已。但是本着负责的态度,社保中心还是决定实地走访一下 。
眼看要穿帮,王大爷只好老实交代,原来王大爷的老父亲早就没了十好几年,坟头草都快长成非洲大草原了,但是在社保中心没有销户,这才造成了这么一个BUG。
不光社保中心有这个情况,眼下Eureka的注册中心也有同样的问题 ,昨天就有几台服务器中暑了,没了响应,很多调用请求不停报404, 那Eureka有什么行之有效的手段来解决这个问题呢?
心跳不息,生命不止。大道至简的SpringCloud就借助这生命的本源,也就是“心跳”,来知晓服务的可用性。我们来看一下心跳检测有哪些特点:
心跳检测之于服务注册来说,就像做心电图检查之于办入院手续,入院手续需要做全方位的检查,因此要同步数十个属性到注册中心,而做一个心电图,仅仅需要以下这些信息就够了
http://localh ost:20000/eureka/
apps/${app_name}/${instance_id}
,这里的appname是服务注册时提供的服务名 ,而instance_id
则是当前这个服务节点的唯一编号,比如9527。UP
,DOWN
,STARTING,OUT_OF_SERVICE
,UNKNOWN
lastDirtyTimeStamp
,这是心跳检测环节最复杂的一个知识点,它是当前服务节点最后一次与服务中心失去同步时的时间,InstanceInfo
封装了该属性以及另一个搭档isInstanceInfoDirty
,当isInstanceInfoDirty=true
的时候,表示当前节点自从lastDirtyTimeStamp
以后的时间都处于未同步的状态。## 客户端指标
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.instance.lease-expiration-duration-in-seconds=20
这两个指标都配置在服务节点上,分别表示了以下的含义
通常第一个时间一定是小于第二个时间的,否则还没等到发送第二个心跳,就被注册中心推进太平间了。毕竟两次心跳之间的间隔时间,还得再多加几秒的网络延迟,才是判断服务是否挂掉的最小时间.
大家通过一个案例,思考一下在极端情况下服务剔除的作用。2015年5月份,因市政施工导致杭州支付宝机房的光缆被挖断,随后全国部分用户陆续出现支付宝无法登陆的情况。支付宝随后紧急通过技术手段,将用户请求切换到其他机房,这才在近2个小时后使受影响用户逐渐恢复。
假设我们自己的应用也碰到了类似情况,当一部分服务因为网络问题导致不可用,那么如何在尽可能短的时间内,剔除不可用的节点?
这就要借助Eureka的服务剔除功能,服务剔除是心跳检测的后手,正是为了让无心跳响应的服务节点自动下线,让我们来看一下Eureka的服务剔除流程
eureka.server.eviction-interval-timer-in-ms-30000
做如下参数配置修改触发间隔,这里将间隔设置成了30秒。此处建议不要设置的时间过短。evict
不像服务注册的山路十八弯,服务剔除比较直接了当,通过AbstractInstanceRegistry
的eviction
方法直接运行
本节带大家学习了关于心跳检测和服务剔除的知识
后面将会更新另一个和心跳密切相关的流程-服务续约的文章,关注我,第一时间获取我的最新动态。