【RPC高性能框架总结】7.手写rpc框架-整体设计思路

接上一篇《6.高性能nio框架netty(下)
根据我们之前的对于RPC框架的基础介绍,NIO的理解以及Netty的学习,为下面自定义一个RPC框架的编写打下了基础。后面我们就来根据之前学习的RPC相关知识,使用Netty自己动手编写一个RPC框架。

一、设计思路

本篇我们来了解一下轻量级RPC框架的需求分析以及原理分析。
我们要设计的RPC框架的基本机构如下图:

该图从宏观上来看,下面一层是我们的应用程序层,上面一层是我们将要开发的框架。
在应用层客户端rpc-sample-app(client),需要调用远端(server)的业务实现方法,远端由业务服务rpc-sample-server提供业务的实现方法。
1.客户端
在应用层客户端rpc-sample-app中,首先创建代理类的对象,获取接口对象,然后调用接口方法,就好像是直接调用本地类一样,来调用远端的服务,例如:
UserService userService = rpcProxy.create(UserService.class);
User user = userService.getUserById(1);
而这其中的“Proxy”代理类实现了Netty的client,封装请求至request,然后发送到server,接受server返回的结果,然后将结果返回到client,代理接口直接返回结果。
上面的一系列操作,客户是感觉不到的,只需要一个注解之类的东西,将代理类接口注入,直接使用,像是直接调用了本地编写的UserService一样。

2.中间层
数据在发出以及在接收的时候,需要进行编码和解码,此时就需要一个中间层来对即将要发送方的信息(调用接口的参数)编码,将收到的信息(调用接口的返回值)进行解码。

3.服务端
在服务端的信息处理框架层, 实现了Netty的Server端,接收client的request信息,解析信息,通过反射的方式调用本地实现的接口方法,获取返回值。最后将返回值发送给Netty的client端。
调用上面框架的应用层,只需要实现接口中的方法,处理具体业务即可,无需关心远程调用的过程。对外暴露服务只需要启动Netty的Server即可。

4.注册中心
我们可能同时有许多服务提供端,也有许多服务接口和调用的方法名,这些都需要一个类似房屋中介的机制来进行托管,以便于管理服务获取与暴露,以及合理分配资源,做客户端与服务端连接的桥梁。

二、代码实现思路

下面我们以黄勇老师的轻量级RPC工程作为分析案例,来详细了解如何手写RPC功能。
源码地址:http://git.oschina.net/huangyong/rpc(作者:黄勇)
该样例包含了以下几个工程:
(1)rpc-client
实现了rpc的服务动态代理(RpcProxy)以及基于Netty封装的一个客户端网络层(RpcClient)
(2)rpc-common
封装了RpcRequest和RpcResponse,即rpc请求和响应的数据结构
基于Netty提供了编解码器
提供了序列化反序列化等工具
(3)rpc-registry
提供了服务发现和注册接口
(4)rpc-registry-zookeeper
基于zookeeper的服务发现和注册接口
(5)rpc-server
rpc服务器(RpcServer)的实现,用来监听rpc请求以及向Zookeeper注册服务地址
rpc服务本地调用
(6)rpc-sample-api
rpc测试公共api服务接口
(7)rpc-sample-client
rpc测试客户端
(8)rpc-sample-server
rpc测试服务启动程序和服务实现
其中rpc-client、rpc-common、rpc-registry/rpc-registry-zookeeper、rpc-server为框架的实现部分,剩下的rpc-sample-api、rpc-sample-client、rpc-sample-server为调用框架的业务工程。

这些工程之间的调用关系图如下:

我们可以看到:
在框架层,rpc-client工程实现了Netty的客户端,封装请求至request,然后发送到server。而rpc-server工程实现了Netty的服务端,接收client的request信息,解析信息。然后两者需要连接注册中心,获取和暴露服务,所以需要连接rpc-registry注册中心实现模块。然后rpc-client和rpc-server的编码和解码由rpc-common实现。
在应用层,开发者只需要开发一个rpc-sample-client客户端,调用远程服务方法,然后开发一个rpc-sample-server服务端,实现暴露给其它应用的业务类方法的具体实现。两个工程均依赖rpc-sample-api工程定义的api服务接口规范进行服务的开发。同时rpc-sample-client和rpc-sample-server会接入rpc-client和rpc-server来实现远程服务调用和暴露的具体交互逻辑。

后面的博文,将按照上面的思路,从零开始手写RPC框架,按照服务端和客户端分别逐步讲解。


参考:
http://www.blogjava.net/landon/archive/2017/02/13/432304.html
https://my.oschina.net/huangyong/blog/361751
传智播客《2017零基础大数据》教学视频

转载请注明出处:https://blog.csdn.net/acmman/article/details/88370184

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值