Dubbo暴力停机,消费者如何感知服务下线?
2024-02-26 08:24:44
网络应用中,服务调用是再常见不过的事情了,尤其是分布式架构中,微服务之间的互相调用是核心基础,但服务调用异常是不可避免的,例如程序BUG、机器重启、网络故障等,这个时候就需要服务治理框架来平滑化服务的故障,Dubbo作为一款优秀的微服务治理框架,在服务治理方面做得非常出色,本文将从一个独特的角度为你解析Dubbo在暴力停机情况下的服务下线感知机制。
在介绍感知机制之前,我们先了解一下Dubbo的服务注册与发现机制,这将有助于我们更好的理解感知机制。Dubbo采用注册中心+服务提供者+服务消费者的三层架构,服务提供者将自己的服务信息(IP、端口、权重等)注册到注册中心,服务消费者从注册中心获取服务提供者的信息列表,并根据一定的策略选择一个服务提供者进行调用,这个过程就是服务发现。
服务发现的本质就是服务提供者信息在注册中心和服务消费者之间的同步,而服务下线的感知本质上就是服务消费者感知到服务提供者信息从注册中心中消失的过程,因此,Dubbo的感知机制的关键就在于服务提供者下线时如何让注册中心及时感知到,并同步给服务消费者。
那么,服务提供者在暴力停机的情况下,是如何让注册中心感知到自己已经下线了呢?
服务提供者下线感知机制
Dubbo服务提供者下线感知机制分为两部分:
- 服务提供者主动感知: 服务提供者在启动时向注册中心注册自己的服务信息,同时开启一个定时任务,定时向注册中心发送心跳包,如果注册中心在一定时间内(缺省是30秒)没有收到服务提供者的心跳包,则认为服务提供者已经下线,并从注册中心中剔除服务提供者的信息。
- 服务消费者主动感知: 服务消费者在获取服务提供者信息列表时,会将获取到的信息列表缓存到本地,在服务调用时,服务消费者会优先从本地缓存中选择一个服务提供者进行调用,如果本地缓存中没有服务提供者信息,或者服务提供者信息已失效(即服务提供者已从注册中心中剔除),服务消费者会重新从注册中心获取服务提供者信息列表,并更新本地缓存。
消费者感知服务下线过程
当服务提供者暴力停机时,服务提供者无法再向注册中心发送心跳包,注册中心在一定时间后会将服务提供者的信息从注册中心中剔除。此时,服务消费者在发起服务调用时,会发现本地缓存中没有可用的服务提供者,因此会重新从注册中心获取服务提供者信息列表,并更新本地缓存。
如果注册中心中已经没有该服务提供者的信息,则服务消费者会感知到该服务提供者已经下线,并会根据一定的重试策略进行重试,直到成功调用服务或达到重试上限。
总结
Dubbo的暴力停机服务下线感知机制主要依靠服务提供者主动发送心跳包和服务消费者主动感知两种方式,这种机制可以保证服务消费者在服务提供者暴力停机的情况下,能够及时感知到服务下线,并进行重试或其他容错处理,从而保证服务的可用性。