在此期间,我并不总是想使用Netty模仿Dubbo,我自己写一个RPC框架,然后在学习过程中学习很多新事物。我们知道,在网络传输中,数据是在二进制中传输的流,但在Java中,数据以对象的形式存储,因此我们要传输数据,该数据涉及对象的序列化和背面 - 序列化。我们知道不同的序列化协议应用了不同的应用程序场景。JDK的本机序列化方法由于其性能原因不考虑使用它,我们想编写一个高性能的RPC框架,一个适当的序列化协议自然是当务之急,因为我目前所构想的RPC框架只是,因此,我选择Kryo作为序列/衍生方法。
还有许多其他序列化方法,它们具有不同的优势和缺点,以及不同的使用场景。想要在深度理解中理解的学生可能希望参考以下文章:Meituan技术团队:序列化和撤退。
序列化协议是应用程序层的协议
Kryo的用法可以通过以下文章使用:Kryo使用指南
首先,介绍Netty的依赖性,我都是Netty直接导入的模块
然后介绍Kryo的相关依赖性,因为我使用Kryoutil,并且还需要介绍Commons-Codec的依赖性。由于春季的相关依赖性和Kryo的依赖关系之间的冲突,直接导入的Kryo遮蔽,因此可以单独使用特定原因。我不会详细介绍
导入其他一些依赖性
为后续序列反序列化对象编写Kryo工具类
请注意,当数据编码时,由于TCP粘性软件包/拆卸软件包,我们需要在此处自定义传输协议,然后我在这里是:在字节数组的前四个字节中编写传输数据的长度,服务器终端,读取数据时的服务器终端,首先从前四个字节中获取传输数据的长度,然后在数据上写下操作
此外,我们需要将对象序列组织到编解码器或字节数组的派生词中的字节数组中
解码数据时,您需要注意此时间收到的数据是否完成
此时,整个项目已成功运营
在这一点上,Netty使用数据演示从Kryo序列化对象传输数据。实际上,中间有很多细节。我说的不多。例如,Kryo线程不安全,并且需要使用线程插座来确保线程的安全性,然后导致另一个问题。什么是ThreadLocal?为什么可以保证线程安全性?我将在本文中更新详细的说明。
此外,我没有解释聆听者的相关知识点,Netty传输的异步机制以及Attrbutekey,AttributeKeyMap等。这些知识点目前了解作者。我不敢在掌握这些知识点之前仔细说出,误认为孩子。稍后我详细研究后,了解透明度,然后更新相关的解释文章。
最后,附加我的log4j2的配置文件