服务治理
服务治理手段
服务的调用涉及到注册中心,服务调用的发起方和提供方三者,这三者中任意两个的通信都是通过网络,那么不论是网络出现问题,还是说这三者中任意一个出现问题,此次调用都会失败。所以就需要服务治理。
节点管理
该部分可以分为两点。
- 注册中心主动摘除机制。这种机制要求服务提供者定时向注册中心汇报心跳,当两次汇报中间的时间超过规定时间后,就认为服务提供者出现问题,进行摘除,然后把最近的可用服务列表推送给服务消费者。
- 服务消费者摘除机制。上述机制可能因为网络问题导致一个正常的服务被摘除,最坏情况所有服务都正常,但是全被摘除。一个更合理的摘除办法就是让服务的调用者去执行。即服务调用者调用失败时,就从本地缓存的可用服务列表中去移除该服务,而不进行实际的摘除。
负载均衡
这里边有几个算法:
- 随机算法
- 轮询算法
- 最少活跃调用算法
- 一致性Hash算法
服务路由
对于服务消费者而言,在内存中的可用服务节点列表中选择哪个节点不仅由负载均衡算法决定,还由路由规则确定。而指定路由规则的主要原因有以下两点:
- 服务功能做了变更,需要灰度发布,根据这部分人的使用反馈来决定是否全量发布时,就可以做一些路由规则的限制,比如说使用尾号限制,让特定比例的人群才会访问到新发布的服务节点。
- 部分规模比较大的公司,为了业务高可用,会将业务部署在不止一个IDC中,这时候不同IDC之间访问要跨IDC,而距离比较远时延迟就会比较大。所以一次服务调用尽可能选择同一个IDC内部的节点,减少网络开销,提高性能。
路由的配置规则一般有静态配置和动态配置。其中静态配置是防止在每一个服务本地的,服务上线后规则不发生改变。而动态配置一般都是放在注册中心,需要修改时改动注册中心的内容即可。
服务容错
对于服务调用失败的情况,需要有手段自动恢复,来保证调用成功。常用手段有以下几种:
- 失败自动切换。顾名思义,调用失败了后就从最近的可用服务列表中选一个进行重试,可以限制重试次数,但是这种操作要求服务的调用操作是幂等的。
- 失败通知。服务调用失败后,不再进行重试,而是根据失败返回的信息而决定后续的操作。
- 失败缓存。服务调用失败后,并不立即进行重试,而是隔一段时间后再进行重试。
- 快速失败。调用失败后就不管了。
参考
《从0开始学微服务》