当前位置: 首页 > article >正文

Json-Rpc框架(项目设计 —— 客户端模块功能详细介绍)

阅读导航

  • 引言
  • 一、Network模块
  • 二、Protocol模块
  • 三、Dispatcher模块
  • 四、Requestor模块
  • 五、RpcCaller模块
  • 六、Publish-Subscribe模块
  • 七、Registry-Discovery模块、
  • 八、总结Client模块

引言

在深入探索了Json-Rpc框架项目中服务端模块的精细设计与强大功能之后,我们自然而然地将目光投向了框架的另一核心组成部分——客户端模块。作为实现远程过程调用(RPC)不可或缺的一环,客户端模块承担着发起请求、处理响应以及优化用户体验的重要职责。

一、Network模块

Network模块:作为网络通信的基础模块,负责客户端的网络连接管理,包括建立连接、发送请求、接收响应等操作,确保客户端能够稳定地与服务端进行通信,这个跟服务端的设计相同。

二、Protocol模块

Protocol模块:负责定义和实现应用层的通信协议,确保客户端与服务端之间能够正确解析和封装传输的数据,保证通信的准确性和高效性,这个跟服务端的设计相同。

三、Dispatcher模块

Dispatcher模块:负责接收来自网络模块的数据,并根据协议解析结果,将消息分发到相应的处理模块。该模块是客户端内部消息流转的关键,确保消息能够被正确处理和响应,这个跟服务端的设计相同。

四、Requestor模块

Requestor模块:专门用于管理客户端的请求,包括请求的创建、发送、状态跟踪和结果回收。它提供了统一的接口供上层调用,简化了请求流程的管理。

在深入探讨Json-Rpc框架的客户端模块设计时,我们不得不面对几个核心挑战。首先,作为请求发起方,客户端在多线程网络通信环境中面临着请求与响应时序错乱的风险。这意味着,一个线程发送的请求可能无法直接对应到随后接收到的响应,这种情况对系统的稳定性和可靠性构成了严重威胁。

其次,类似于Muduo这样的异步IO网络通信库,其操作模式进一步加剧了这一复杂性。在这些库中,IO操作是异步进行的,即数据发送仅仅是将其放入发送缓冲区,而实际发送时机由底层网络库控制。同时,接收数据也依赖于连接触发的可读事件,并通过回调函数处理,这使得在发送请求后直接等待对应响应变得不可行。

为了有效解决上述问题,我们设计了请求管理模块。该模块的核心思想是为每个请求分配一个唯一的请求ID,并在服务端响应时包含此ID以标识响应对应的请求。在客户端,我们利用哈希表(如hash_map)来存储这些响应,以请求ID作为键。此外,我们提供了阻塞接口,允许客户端根据请求ID获取对应的响应,从而确保每个请求都能准确无误地找到其对应的响应,避免了时序错乱带来的问题。

进一步地,为了提升灵活性和用户体验,我们将每个请求封装得更加完善,引入了异步future控制或回调函数机制。这样,客户端不仅可以阻塞等待响应,还能以异步方式获取响应或通过回调函数自动处理响应,极大地增强了系统的响应能力和可扩展性。

在这里插入图片描述

五、RpcCaller模块

RpcCaller模块:专注于实现远程过程调用的功能,封装了RPC调用的细节,客户端可以采用三种方式调用分别是:同步调⽤、异步调⽤、回调调⽤。

  1. 同步调用:在这种模式下,当发起一个调用时,程序会暂停执行当前线程,直到收到响应结果后才继续执行并返回结果。这种方式简单直观,但可能会阻塞线程,影响程序的并发性能。

  2. 异步调用:与同步调用不同,异步调用在发起后立即返回,不会阻塞当前线程的执行。调用者可以在之后的某个时间点,通过某种机制(如轮询、事件通知等)来主动获取调用结果。这种方式提高了程序的响应性和并发能力。

  3. 回调调用:回调调用结合了异步调用的非阻塞特性,并在发起调用时同时指定一个回调函数。当调用结果准备好后,系统会自动调用这个回调函数来处理结果。这种方式使得代码更加模块化,易于管理和维护,同时也提高了程序的灵活性和响应速度。

六、Publish-Subscribe模块

Publish-Subscribe模块:实现消息的发布订阅机制,允许客户端订阅感兴趣的主题,并在收到对应消息时进行处理。该模块增强了客户端与服务端及其他客户端之间的实时通信能力。

在发布订阅模型中,存在两个关键角色:发布者和订阅者。发布者负责将消息发送到特定的主题上,而订阅者则通过订阅这些主题来接收并处理相应的消息。这种机制允许信息的生产者(发布者)与消费者(订阅者)之间实 现松耦合,提高了系统的可扩展性和可维护性。

为了支持这一模型,发布订阅模块通常包含一系列与主题相关的操作,如主题的创建、删除以及消息的发布等。同时,为了处理订阅者可能订阅多个主题且每个主题消息需要不同处理方式的场景,模块还需要管理订阅者的主题订阅列表及相应的回调函数,确保消息能够准确无误地送达并被正确处理。

综上所述,发布订阅模块通过提供一套完整的接口和内部管理机制,为用户构建了一个高效、灵活且可扩展的消息传递与处理平台。

在这里插入图片描述

七、Registry-Discovery模块、

Registry-Discovery模块:负责服务的注册、发现、上线和下线信息的查询。客户端通过该模块可以获取到所需服务的位置信息,实现服务的动态发现和调用。

  1. 注册者

    • 角色描述:作为RPC服务的提供者,负责将其服务信息注册到注册中心。
    • 功能实现:需要实现向注册中心(服务器)发送服务注册请求的功能,包括服务的名称、版本、接口描述、网络地址(如IP和端口)等关键信息,以便其他服务能够发现并调用。
  2. 发现者

    • 角色描述:作为RPC服务的调用者,负责发现所需的服务并管理服务的地址信息。
    • 功能实现:
      • 服务发现:需要实现向注册中心发送查询请求的功能,以获取能够提供指定服务的主机地址列表。
      • 地址管理:获取到服务地址后,需进行有效管理,如缓存、更新等,以便后续的服务调用。
      • 监听服务变更:作为发现者,还需关注注册中心发送的服务状态变更通知(如服务上线、下线等),并据此更新本地管理的服务地址列表,确保服务调用的实时性和准确性。同时,还需对已经下线的服务和主机进行相应的管理操作,如从地址列表中移除等。

八、总结Client模块

Client模块:作为客户端的整合模块,它基于以上各个模块构建而成,提供了统一的客户端接口和启动逻辑。Client模块负责初始化各个子模块,并协调它们之间的协作,确保客户端能够正常运行并满足业务需求。


http://www.kler.cn/news/355761.html

相关文章:

  • 400行程序写一个实时操作系统(十):用面向对象思想构建抢占式内核
  • Redis 高可用:从主从到集群的全面解析
  • C++实现本地资源文件编译时加载
  • Leetcode 921 Shortest Path in Binary Matrix
  • Cursor:你的AI编程助手 - 核心功能全解析
  • 特斯拉Robotaxi发布会2024:自动驾驶未来的开端
  • 华为OD机试2024年真题( 最远足迹)
  • OBOO鸥柏丨 21.5 寸自助服务终端机智能科技查询一体新势力
  • python异常检测-局部异常因子(LOF)算法
  • Linux下使用c语言获取一个挂载文件夹可用存储空间以及使用率
  • 【已解决】docx4j 结合Thymeleaf 的各种依赖问题(坑)
  • 【Spring声明式事务失效的12种场景测试】
  • Redis 数据类型Bitmaps(位图)
  • ES-入门-javaApi-文档-新增-删除
  • 【芙丽芳丝净润洗面霜和雅漾舒护活泉喷雾
  • AnaTraf | TCP重传的工作原理与优化方法
  • 【数据分享】1901-2023年我国省市县三级逐月最低气温(免费获取/Shp/Excel格式)
  • 详解tcpdump
  • (4) cuda cudnn TensorRT安装及配置
  • Qt(信号槽)