【C++从零实现Json-Rpc框架】第七弹——客户端模块划分

目录

一、前言

二、正文

1. 客户端模块划分

2. Network模块

3. Protocol模块

4. Dispatcher模块

5. Requestor模块

6. RpcCaller模块

7. Publish-Subscribe

8. Registry-Discovery模块

9. Client

三、结语


一、前言

在第六弹中我们对服务端的模块划分进行了讲解,接下来我们就客户端的角度,来设计对应模块,帮助客户端实现项目的三个功能:

●  rpc调用

● 服务的注册与发现以及服务的下线/上线通知

● 消息的发布订阅

二、正文

1. 客户端模块划分

在客户端的模块划分中,与服务端功能相对,可以划分出下面几个模块

1. Protocol:应⽤层通信协议模块

2. Network:⽹络通信模块

3. Dispatcher:消息分发处理模块

4. Requestor:请求管理模块

5. RpcCaller:远端调⽤功能模块

6. Publish-Subscribe:发布订阅功能模块

7. Registry-Discovery:服务注册/发现/上线/下线功能模块

8. Client:基于以上模块整合⽽出的客⼾端模块

2. Network模块

在客户端的Network模块,我们的网络通信与服务端一样,是基于Muduo库来实现网络通信客户端

3. Protocol模块

应用层通信协议处理,与服务端保持一致

4. Dispatcher模块

IO数据分发处理,逻辑与服务端一致,由使用者来决定哪条消息用哪个业务函数来进行处理,当收到消息后,在该模块找到对应的处理回调函数进行调用即可

5. Requestor模块

Requestor模块存在的意义针对客户端的每一条请求进行管理,以便与对请求对应的响应做出合适的操作

首先,对于客户端来说,不同的地方在于,更多时候客户端是请求方,是主动方发起请求服务的一方,而在多线程的网络通信中,多线程下,针对多个请求进行的响应可能会存在时序的问题,这种情况下,我们无法保证一个线程发送一个请求后,接下来收到的响应就是针对自己这条请求的响应,这种情况是非常危险的一种情况

其次,既然这样的话可能有的小伙伴就想既然这样子,那我们的客户端在发送一个请求后,等待不就好了。如果这样的话,一方面是效率比较低,另一方便是由于我们在网络通信模块时采用的Muduo库这种异步IO网络通信库,通常IO操作都是异步操作,即发送数据就是把数据放入发送缓冲区,但是什么时候回发送由底层的网络库来进行协调,并且也并不会提供recv接口,而是在连接触发可读事件后,IO读取数据完成后调用处理回调进行数据处理,因此也无法直接在发送请求后去等待该条请求的响应

针对以上问题,我们则创建出了Requestor这个请求管理模块来解决。它的思想也非常简单,就是给每一个请求都设定一个请求ID,服务端进行响应的时候标识响应针对的是哪个请求(也就是响应消息中会包含请求ID),因此客户端这边我们不管收到哪条请求的响应,将数据存储入一则hash_map,以请求ID为映射,并向外提供获取指定请求ID响应的阻塞接口,这样只要在发送请求的时候知道自己的请求ID,那么就能获取到自己想要的响应,而不会出现异常

针对这个思想,我们再进一步,可以将每个请求进行进一步封装描述,添加入异步的future控制,或者设置回调函数的方式,在不仅可以阻塞获取响应,也可以实现异步获取响应以及回调处理响应

6. RpcCaller模块

RpcCaller模块存在的意义:向用户提供进行Rpc调用的模块

Rpc服务调用模块,这个模块相对简单,只需要向外提供几个rpc调用接口,内部像服务端发送请求,等待获取结果即可,稍微麻烦的一些是Rpc调用我们需要提供多种不同方式的调用来给到Requestor模块:

同步调用:发起调用后,等收到响应结果后返回

异步调用:发起调用后立即返回,在想回去结果的时候进行获取

回调调用:发起调用的同时设置结果的处理回调,收到响应后自动对结果进行回调处理

7. Publish-Subscribe

Publish-Subscribe模块存在意义:向用户提供发布订阅所需的接口,针对推送过来的消息进行处理

发布订阅相比于Rpc调用模块,会稍微复杂一些,因为在发布订阅中会有两种角色,一个客户端可能是消息的发布者,也可能是消息的订阅者

而且不管是哪个角色都是对主题进行操作,因此其中也包含了主题的相关操作,比如,要发布一条消息需要先创建主题,而且一个订阅者可能会订阅多个主题,每个主题的消息都可能会有不同的额处理方式,因此需要有订阅者主题回调的管理

8. Registry-Discovery模块

服务注册和发现模块需要的实现会稍微复杂一些,因为需要分为两个角色来完成其功能

1. 注册者:作为Rpc服务的提供者,需要向注册中心注册服务,因此需要实现向服务器注册服务的功能

2. 发现者:作为Rpc服务的调用者,需要先进行服务发现,也就是向服务器发送请求获取能够提供指定服务的主机地址,获取地址后需要管理起来留用,且作为发现者,需要关注注册中心发送过来的服务上线/下线消息,以及时对已经下线的服务和主机进行管理

服务注册

服务发现

9. Client

将以上模块进行整合就可以实现各个功能的客户端了

RegistryClient:服务注册功能模块与网络通信客户端结合

DiscoverClient:服务发现功能模块与网络通信客户端结合

RpcClient:DiscoverClient & Rpc功能模块与网路通信客户端结合

TopicClient:发布订阅功能模块与网络通信客户端结合

RegistryClient

DiscoverClient

RpcClient

TopicClient

三、结语

        到此为止,本文关于从零实现Json-RPC框架第七弹的内容到此结束了,如有不足之处,欢迎小伙伴们指出呀!

         关注我 _麦麦_分享更多干货:_麦麦_-CSDN博客

         大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下期见!!

评论 85
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_麦麦_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值