美文网首页
轻量级RPC框架(0 - 项目概述)

轻量级RPC框架(0 - 项目概述)

作者: _code_x | 来源:发表于2021-07-02 21:03 被阅读0次

本项目地址:一起写个Dubbo 作者:何人听我楚狂声

项目概述

My-RPC-Framework 是一款基于 Nacos 实现的 RPC 框架。网络传输实现了基于 Java 原生 Socket 与 Netty 版本,并且实现了多种序列化与负载均衡算法。

从一个最简单的BIO + Java序列化开始,逐步完善成Netty + 多序列化方式的比较完整的框架,并且配置了Nacos服务发现。

rpc框架的原理理解:客户端和服务端都可以访问到通用的接口,但是只有服务端有这个接口的实现类,客户端调用这个接口的方式:通知服务端我要调用这个接口,服务端收到之后找到这个接口的实现类并执行,将执行的结果返回给客户端,作为客户端调用该接口方法的返回值。

原理很简单,但是实现值得商榷,例如客户端怎么知道服务端的地址?客户端怎么告诉服务端我要调用的接口?客户端怎么传递参数?只有接口客户端怎么生成实现类……等等等等。

1.系统架构

消费者调用提供者的方式取决于消费者的客户端选择,如选用原生 Socket 则该步调用使用 BIO,如选用 Netty 方式则该步调用使用 NIO。如该调用有返回值,则提供者向消费者发送返回值的方式同理。

2.项目特性

  • 网络传输:实现了基于 Java 原生 Socket 传输与 Netty 传输两种网络传输方式
    • 消费端如采用 Netty 方式,会复用 Channel 避免多次连接
    • 如消费端和提供者都采用 Netty 方式,会采用 Netty 的心跳机制,保证连接
  • 序列化算法:实现了四种序列化算法,Json 方式、Kryo 算法、Hessian 算法与 Google Protobuf 方式(默认采用 Kryo方式序列化)
  • 负载均衡算法:实现了两种负载均衡算法:随机算法与轮转算法
  • Nacos注册中心:使用 Nacos 作为注册中心,管理服务提供者信息
    • 服务提供侧自动注册服务
  • 通信协议:实现自定义的通信协议(MRF协议)
  • 接口抽象良好,模块耦合度低,网络传输、序列化器、负载均衡算法可配置

3.项目模块

  • rpc-api —— 服务端与客户端公共调用接口(通用接口)
  • rpc-common —— 实体对象、工具类、枚举类等公共类
  • rpc-core —— 框架的核心实现
  • test-client —— 客户端测试代码
  • test-server —— 服务端测试代码

4.自定义传输协议

调用参数与返回值的传输采用了如下 MRF 协议( My-RPC-Framework 首字母)以防止粘包:

+---------------+---------------+-----------------+-------------+
|  Magic Number |  Package Type | Serializer Type | Data Length |
|    4 bytes    |    4 bytes    |     4 bytes     |   4 bytes   |
+---------------+---------------+-----------------+-------------+
|                          Data Bytes                           |
|                   Length: ${Data Length}                      |
+---------------------------------------------------------------+
字段 解释
Magic Number 魔数,表识一个 MRF 协议包,0xCAFEBABE
Package Type 包类型,标明这是一个调用请求还是调用响应
Serializer Type 序列化器类型,标明这个包的数据的序列化方式
Data Length 数据字节的长度
Data Bytes 传输的对象,通常是一个RpcRequestRpcClient对象,取决于Package Type字段,对象的序列化方式取决于Serializer Type字段。

相关文章

网友评论

      本文标题:轻量级RPC框架(0 - 项目概述)

      本文链接:https://www.haomeiwen.com/subject/acjsultx.html