打造自己的通信框架四——NettyServer搭建

打造自己的通信框架四——NettyServer搭建,第1张

从客户端发出一条消息到服务端接收并处理这条消息,大概可以分成下面的流程

**部分为客户端逻辑,蓝色为网络传输,红色为服务端逻辑,本文关注的是服务端逻辑。

将二进制解码为特定格式,将protobuf封装为自定义格式都是这个处理链的一个单元。
在Netty中,ChannelHandler充当了单元,ChannelPipeline充当处理链。处理链的构造如下

标号1,2,3为我们需要关注的逻辑: 1将二进制数据解码为protobuf -> 2将protobuf编码为Request -> 3Request分发执行
在具体实现上对应下面三点

下面我们详解这三个过程

在这一步我们将二进制数据转换成之前定义的BaseRequest
这里使用的两个ChannelHandler都是Netty提供的,不过多叙述

在这一步, MessageFactorycreateRequest() 根据moduleId和commandId找出具体的Request,并用proto对象去填充数据。再将创建的AbstractMessage传递给下一层
( MessageRegistry稍后解释 )。

这一步将Channel转换为User,将转发的职责交给RequestDispatchService
channel2SessionMap 记录了Channel和User的对应关系。User是客户端的唯一标识,里面记录了客户端的信息,并承载了异步串行无锁化的功能,具体实现后文会详述。

RequestDispatchService也很简单,找到AbstractRequest对应的方法,再通过反射调用去执行。
userexecute() 将这条消息放到用户的消息队列去执行

至此,服务端逻辑结束,下面来看一下这个过程中最核心的MessageRegistry

MessageRegistry有两个功能

举个例子
所有AbstractMessage的具体实现,都会带有 @MessageWrapper 注解,以此将具体的Message和moduleId+commandId关联起来,例如

MessageRegistry会扫描类信息,将其关系记录下来。

一个消息必定有一个对应的方法, @MessageHandler 注解标识某个接口中的某些方法是和消息相关联的

MessageRegistry再将这个方法封装一下,和消息关联起来

通过这套机制,打通了从消息接收到执行的一整套逻辑,开发者不需要关注消息是如何处理的,只要定义好必备的东西就好。

以上就是关于打造自己的通信框架四——NettyServer搭建全部的内容,包括:打造自己的通信框架四——NettyServer搭建、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9742240.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存