简易RPC框架 - 前言

1、前言

Rpc框架想必大家都不陌生,常见的开源RPC框架如Dubbo、gRpc、Thrift等,为啥想到要手动实现一个Rpc框架,主要是本人对网络编程很感兴趣,想通过这个来加强自己对Java以及网络编程的理解,也能体验一下钻研的快乐。

2、基础设计

这个Rpc框架的最初设计大概如下图:

image-20230512133521798

最初是尝试通过NIO去实现的,每个服务对应一个Client,即每个服务绑定一个Channel,然后通过Selector轮巡监听服务端的消息。服务端再这里扮演的是一个消息中转站的角色。显而易见的,这个设计存在着一个致命的问题,服务端怎么去分辨Selector上的每个通道对应的是哪个服务,查了很多资料都没有较好的办法,这个方案就不了了之了(最初测试的时候,我试过直接把服务端发布的服务对象序列化到Redis,但存在一些问题,比如当发布的服务中有不可序列化的属性时,就会出现问题)。

这个方案行不通,之后研究了一下Dubbo服务注册的大概思路,结合掘金里DannyIdea(小林)的Java开发者的RPC实战课 里对服务注册、订阅的讲解,对原本的设计进行了改进。

以下是Dubbo的基本架构图:

u=341734470,1171504543&fm=253&fmt=auto&app=138&f=JPEG

以下是现在对于框架的设计思路:

xxx

目前通信方式也由最初的NIO换成了Netty,实现自定义协议进行编码解码,解决了黏包半包等问题,后续可以扩展不同的序列化方式。

项目的地址在本人的gitee和github仓库:https://github.com/Hurried1y/rpc-framework/,https://gitee.com/hurried1y/rpc-framework