阅读导航
- 引言
- 一、理解项目功能
- ⭕分布式RPC服务发现/注册/订阅/创建 结构图
- ⭕项目三大核心功能
- 二、服务端模块划分简介
- 三、客户端模块划分简介
引言
在上一篇文章中,我们深入探讨了Json-Rpc框架中不可或缺的序列化与反序列化利器——JsonCpp库。
在本篇文章中,我们将深入剖析Json-Rpc框架中服务端与客户端的模块划分策略,我们将从服务端的功能定位,到客户端的请求发送、响应处理,揭示每个模块背后的设计思路与技术实现。通过这一系列的探讨,我期望能为读者呈现一个清晰、完整且高效的Json-Rpc框架设计蓝图,为实际项目中的RPC应用提供有力参考。
一、理解项目功能
从本质上来说,RPC(远程过程调用)的概念相当直接且简洁。其核心思想在于,当客户端需要执行某个任务处理时,并不直接在本地完成这些处理过程,而是将请求发送给远程的服务器。服务器随后会负责完成这些处理任务,并将结果返回给客户端。客户端接收到结果后,便可以继续其后续操作。
尽管上图中的RPC模型通常表现为多对一或一对一的关系,这种架构在面对服务端故障时会导致客户端无法进行远程调用,同时服务端的负载也可能迅速攀升。为了克服这些局限性,RPC实现需要进一步演进,引入分布式架构以提升系统的可靠性和性能。
📦分布式架构:是一个由多个节点(通常是服务器)协同工作的系统。通过将不同的业务逻辑或同一业务的不同部分分布在不同的节点上,系统能够有效应对高并发访问,显著提高扩展性和可用性。
🎯分布式RPC的实现:分布式RPC的关键在于在原有模型基础上增加注册中心这一核心组件。在这一架构中,各个服务提供服务器会向注册中心进行服务注册,明确告知其可提供的服务类型。而客户端在发起远程调用之前,会先通过注册中心进行服务发现,查找并连接到能够提供所需服务的服务器,从而确保请求的正确路由和高效处理。
⭕分布式RPC服务发现/注册/订阅/创建 结构图
在优化后的分布式RPC架构中,我们设计每个Server节点兼任备用注册中心的角色,以增强系统的健壮性。这样,即便某个注册中心出现故障下线,其他备用中心仍能继续处理服务的注册与请求,确保系统不间断运行。此外,由于客户端在请求RPC服务时拥有多个RPC提供者(rpc-provider)作为选择,因此可以轻松地实现负载均衡策略,优化资源利用和响应速度。同时,基于这一注册中心架构,我们可以更加便捷地实现服务的发布/订阅功能,为系统增加实时通信和事件驱动的能力。
⭕项目三大核心功能
该项目的三大核心功能包括:
- 基本RPC远程调用服务:实现远程过程调用的基本功能,支持客户端与服务器之间的高效通信。
- 服务的注册、发现与状态变更(服务下线/上线)通知服务:管理服务的注册与发现流程,及时通知服务的上线、下线状态变更,确保系统资源的动态调整和服务的可用性。
- 消息的发布订阅服务:构建基于注册中心的发布/订阅系统,支持事件驱动的通信模式,增强系统间的解耦与协作能力。
二、服务端模块划分简介
服务端的功能需求明确且多样化,涵盖了网络通信、RPC服务提供、服务注册与发现、以及消息的发布订阅等多个方面。基于这些功能需求,服务端可以合理地划分为以下几个核心模块:
-
Network模块:负责网络通信的底层实现,包括监听客户端的连接请求、数据的接收与发送等,确保服务端与客户端之间的稳定通信。
-
Protocol模块:定义并实现应用层的通信协议,该模块负责解析和封装网络传输中的数据,确保数据的正确性和完整性,同时提供统一的接口供上层模块调用。
-
Dispatcher模块:作为消息分发处理中心,该模块接收来自
Network
模块的数据,并根据协议解析结果,将请求分发到相应的处理模块。它负责请求的路由和分发逻辑,确保每个请求都能被正确处理。 -
RpcRouter模块:专注于RPC(远程过程调用)的路由功能,该模块接收 Dispatcher`模块分发的RPC请求,根据服务名、方法名等信息,找到对应的RPC服务提供者,并转发请求。同时,它还负责处理RPC调用的结果返回给客户端。
-
Publish-Subscribe模块:实现消息的发布订阅功能,包括主题的创建、删除、订阅和取消订阅操作,以及消息的发布和分发。该模块允许客户端订阅感兴趣的主题,并在有消息发布时,将消息推送给所有订阅了该主题的客户端。
-
Registry-Discovery模块:负责服务的注册、发现、上线和下线管理。该模块维护一个服务注册表,记录所有在线服务的信息。客户端可以通过该模块查询所需服务的信息,实现服务的动态发现和调用。同时,服务提供者也可以在该模块中注册和注销自己的服务。
-
Server模块:作为服务端的整合模块,它基于以上各个模块构建而成,提供统一的服务端接口和启动逻辑。Server模块负责初始化各个子模块,并协调它们之间的协作,确保服务端能够正常运行并提供所需的服务。
三、客户端模块划分简介
在客户端的模块划分中,为了高效实现与服务端的交互及满足各种功能需求,我们可以将客户端系统划分为以下几个核心模块:
-
Network模块:作为网络通信的基础模块,负责客户端的网络连接管理,包括建立连接、发送请求、接收响应等操作,确保客户端能够稳定地与服务端进行通信。
-
Protocol模块:负责定义和实现应用层的通信协议,确保客户端与服务端之间能够正确解析和封装传输的数据,保证通信的准确性和高效性。
-
Dispatcher模块:负责接收来自网络模块的数据,并根据协议解析结果,将消息分发到相应的处理模块。该模块是客户端内部消息流转的关键,确保消息能够被正确处理和响应。
-
Requestor模块:专门用于管理客户端的请求,包括请求的创建、发送、状态跟踪和结果回收。它提供了统一的接口供上层调用,简化了请求流程的管理。
-
RpcCaller模块:专注于实现远程过程调用的功能,封装了RPC调用的细节,客户端可以采用三种方式调用分别是:同步调⽤、异步调⽤、回调调⽤。
-
Publish-Subscribe模块:实现消息的发布订阅机制,允许客户端订阅感兴趣的主题,并在收到对应消息时进行处理。该模块增强了客户端与服务端及其他客户端之间的实时通信能力。
-
Registry-Discovery模块:负责服务的注册、发现、上线和下线信息的查询。客户端通过该模块可以获取到所需服务的位置信息,实现服务的动态发现和调用。
-
Client模块:作为客户端的整合模块,它基于以上各个模块构建而成,提供了统一的客户端接口和启动逻辑。Client模块负责初始化各个子模块,并协调它们之间的协作,确保客户端能够正常运行并满足业务需求。