# 《RPC手撸专栏》第67章:服务消费者连接服务提供者的重试机制
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客1:https://binghe001.github.io (opens new window)
博客2:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
大家好,我是冰河~~
在重试机制篇章,实现了服务消费者从注册中心订阅服务的重试机制。当服务消费者无法正常从注册中心获取服务提供者元数据信息时,会启动重试机器,尝试多次从注册中心获取服务提供者元数据信息,直到获取到服务提供者元数据信息或者达到最大重试次数。
# 一、前言
服务消费者连接服务提供者能实现重试机制吗?
在前面的文章中,已经实现了服务消费者从注册中心订阅服务的重试机制,一旦服务消费者无法正常从注册中心获取到服务提供者的元数据信息,就会启动重试机制,尝试多次从注册中心获取服务提供者元数据信息,直到获取到服务提供者元数据信息或者达到最大重试次数,最大程度保证了服务消费者从注册中心订阅服务的可靠性。
在RPC框架中,服务消费者连接服务提供者也有可能出现连接不成功的情况。
# 二、目标
目标很明确:服务消费者连接服务提供者要实现重试机制!
当服务消费者从注册中心获取到服务提供者的元数据信息,向服务提供者发起连接请求时,此时服务提供者恰好宕机或者网络出现波动时,就会造成服务消费者无法正常连接服务提供者的问题。此时,就需要实现服务消费者连接服务提供者的重试机制。一旦服务消费者连接服务提供者失败,就要启动重试机制,使服务消费者能够尝试多次连接服务提供者,直到连接上服务提供者或者达到最大重试次数为止。
本章,我们就一起实现服务消费者连接服务提供者的重试机制。
# 三、设计
如果让你设计服务消费者连接服务提供者的重试机制的流程,你会怎么设计呢?
服务消费者连接服务提供者的重试机制的流程如图67-1所示。
由图67-1可以看出如下信息:
(1)服务提供者会通过自定义类扫描器整合注册中心,将服务注册到注册中心。
(2)服务注册到注册中心的元数据,例如服务的名称、服务的版本号、服务地址、服务端口和服务分组等信息,元数据会贯穿整个服务的注册与发现流程。
(3)服务注册与发现SPI接口对外提供服务注册与发现的方法,服务提供者通过自定义扫描器会调用服务注册与发现SPI接口的方法实现服务注册功能。
(4)基于服务注册与发现的SPI接口,服务提供者会基于SPI接口实现多个服务注册与发现的实现类,每个实现类对应着一种注册中心服务。
(5)服务消费者会通过服务注册与发现的SPI接口订阅注册中心的服务,会从注册中心获取到服务提供者发布的服务信息,实现服务发现的功能。
(6)服务消费者从注册中心获取到服务提供者发布的服务信息后,会基于SPI机制动态加载普通算法(我们将第42章~第50章实现的负载均衡算法统称为普通算法)、基于增强型加权随机算法、基于增强型加权轮询算法、基于增强型加权Hash算法、基于增强型加权源IP地址Hash算法、基于增强型Zookeeper一致性Hash算法和最少连接数算法的负载均衡策略,从多个服务中选择一个进行远程网络连接。
(7)服务消费者会直接与根据基于SPI机制动态加载的负载均衡策略选择出的服务提供者建立连接,实现数据交互。也就是说,后续服务消费者会与服务提供者直接实现数据交互。
(8)服务消费者向服务提供者发送心跳ping消息,服务提供者响应服务消费者pong消息。服务提供者向服务消费者发送心跳ping消息,服务消费者向服务提供者响应pong消息。
(9)服务消费者发送心跳和服务提供者发送心跳,定时任务的时间间隔都是配置化的。
(10)服务提供者与服务消费者除了手动实现定时任务来实现心跳检测外,还基于Netty的IdleStateHandler实现了心跳检测机制。
(11)服务消费者支持服务订阅的重试机制。
(12)服务消费者连接服务提供者支持重试机制。
# 四、实现
说了这么多,具体要怎么实现呢?
# 核心类实现关系
服务消费者连接服务提供者的重试机制的核心类关系如图67-2所示。
# 查看完整文章
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码