# 《RPC手撸专栏》第7章:自定义网络编解码的实现

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~

RPC框架实现了自定义协议就能自动传输数据了吗?答案肯定是不行,除了自定义协议,还要实现另一种技能。

# 一、前言

自定义网络编解码是个什么鬼?

数据都会按照某种协议在网络中进行传输,比如可以按照HTTP协议进行传输、可以按照HTTPS协议进行传输、可以按照TCP协议进行传输、可以按照UDP协议进行传输等等。但是,只是有了协议是远远不够的。例如,我们需要将一个客户端的Java对象通过网络传输到服务端,只是有了协议的话,是不行的,我们还要思考:如何将Java对象转化成我们定义好的协议格式在网络中进行传输。其实,这就涉及到网络的编解码了。

RPC框架作为分布式系统底层通信的基础设施框架,本身就是为分布式远程过程调用而设计的,它的出现就是为解决高效的远程通信问题。和一些通用的网络协议一样,尽管RPC框架会自定义网络传输协议,但是只有网络传输协议是远远不够的,也同样需要数据的编解码功能。

# 二、目标

如何在设计好自定义的网络传输协议的基础上,实现数据的编解码功能呢?

在前面的章节中,为bhrpc框架实现了自定义的网络传输协议, 但是对于数据的编解码操作,还是使用的Netty自带的StringEncoder和StringDecoder。对于自定义的网络传输协议来说,使用Netty自带的数据编解码类已经不满足需求。此时,就需要我们自定义数据的编解码功能。

当数据由服务消费者通过网络发送到服务提供者之前,就需要对数据进行编码,将数据序列化成符合对应协议的二进制字节流。当数据的二进制字节流传输到服务提供者时,就需要对二进制字节流进行解码,将二进制字节流按照对应的协议反序列化成相应的数据。数据由服务提供者传输到服务消费者也是一样的流程。

说干就干,接下来,我们就一起设计和实现自定义的数据编解码功能。

# 三、设计

如果让你为bhrpc框架设计自定义的数据编解码功能,你会怎么做呢?

服务消费者与服务提供者之间的数据交互过程如图7-1所示。

图7-1 服务消费者与服务提供者之间的数据交互

由图7-1可以看出,服务消费者向服务提供者发送数据前,先通过编码器根据自定义的网络传输协议将数据编码成二进制字节流,二进制字节流通过网络由服务消费者传输到服务提供者,在服务提供者处理数据前,先由解码器根据自定义的网络传输协议对二进制流进行解码,解码出对应的数据后,再对数据进行进一步处理。

当服务提供者处理完数据时,向服务消费者响应数据之前,先通过编码器根据自定义的网络传输协议对数据进行编码,将数据编码成二进制字节流,二进制字节流通过网络由服务提供者传输到服务消费者,服务消费者接收到二进制流数据时,先通过解码器根据自定义的网络传输协议对二进制流数据进行解码,解码出对应的数据后做进一步的处理。

整个过程就需要实现数据的编解码器。

细心的读者可以发现,服务消费者端用一个虚线矩形锁包裹起来,这是因为在本章我们还是侧重实现服务提供者端,后续会使用单独一章来测试服务消费者和服务提供者之间的通信过程。

# 四、实现

说了这么多,自定义的网络编解码到底该如何实现呢?

# 1.工程结构

  • bhrpc-annotation:实现bhrpc框架的核心注解工程。
  • bhrpc-codec:实现bhrpc框架的自定义编解码功能。
  • bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。
  • bhrpc-constants:存放实现bhrpc框架通用的常量类。
  • bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。
  • bhrpc-provider:服务提供者父工程。
    • bhrpc-provider-common:服务提供者通用工程。
    • bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。
  • bhrpc-serialization:实现bhrpc框架序列化与反序列化功能的父工程。
    • bhrpc-serialization-api:实现bhrpc框架序列化与反序列化功能的通用接口工程。
    • bhrpc-serialization-jdk:以JDK的方式实现序列化与反序列化功能。
  • bhrpc-test:测试bhrpc框架的父工程。
    • bhrpc-test-provider:测试服务提供者的工程。
    • bhrpc-test-scanner:测试扫描器的工程。

工程源码: 关注冰 冰河技术 微信公众号,回复 bhrpc, 获取代码链接地址。

# 2.核心实现类关系

核心实现类关系如图7-2所示。

图7-2  核心实现类关系

其中,最主要的接口和类就是RpcCodec、RpcEncoder、RpcDecoder、SerializerException、SerializationUtils、Serialization和JdkSerialization。其中,每个类的具体功能如下所示。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码