# netty-rpc **Repository Path**: wyloong/netty-rpc ## Basic Information - **Project Name**: netty-rpc - **Description**: 基于netty实现简陋的rpc框架 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-08-18 - **Last Updated**: 2021-09-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 工程简介 RPC,远程过程调用,可以做到像本地调用一样调用远程服务,是一种进程间的通信方式,概念想必大家都很清楚,在看到58沈剑写的[RPC文章](https://link.segmentfault.com/?url=https%3A%2F%2Fwww.w3cschool.cn%2Farchitectroad%2Farchitectroad-rpc-framework.html) 之后,意识到其实我们可以换一种思考方式去理解RPC,也就是从本地调用出发,进而去推导RPC调用 ![](https://www.wylong.top/netty/images/RPC/02-rpc%E6%98%AF%E4%BB%80%E4%B9%88.png) ### 本地函数调用 本地函数是我们经常碰到的,比如下面示例: ```java public String sayHello(String name) { return "hello, " + name; } ``` 我们只需要传入一个参数,调用sayHello方法就可以得到一个输出,也就是输入参数——>方法体——>输出,入参、出参以及方法体都在同一个进程空间中,这就是**本地函数调用** ### Socket通信 那有没有办法实现不同进程之间通信呢?调用方在进程A,需要调用方法A,但是方法A在进程B中 ![](https://www.wylong.top/netty/images/RPC/02-Socket%E9%80%9A%E4%BF%A1.png) 最容易想到的方式就是使用Socket通信,使用Socket可以完成跨进程调用,我们需要约定一个进程通信协议,来进行传参,调用函数,出参。 ### RPC框架 RPC框架就是用来解决上面的问题的,它能够让调用方像调用本地函数一样调用远程服务,底层通讯细节对调用方是透明的,将各种复杂性都给屏蔽掉,给予调用方极致体验。 ![](https://www.wylong.top/netty/images/RPC/02-RPC%E6%A1%86%E6%9E%B6.png) 总结下一个RPC框架需要重点关注哪几个点: - 代理 (动态代理) - 通讯协议 - 序列化 - 网络传输 当然一个优秀的RPC框架需要关注的不止上面几点,只不过本篇文章旨在做一个简易的RPC框架,理解了上面关键的几点就够了 ![](https://www.wylong.top/netty/images/RPC/02-rpc%E5%85%B3%E6%B3%A8%E7%82%B9.png) ---- ### 框架模块架构设计图 ![](https://www.wylong.top/netty/images/RPC/Rpc%E6%A1%86%E6%9E%B6%E6%A8%A1%E5%9D%97%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E5%9B%BE1.png) 分为4大块: - client客户端 - client core核心模块 - client api core核心模块 - client api模块 - 编解码 - 通讯协议:是 google的 protobuffer - 序列化:使用的是基于protobuffer封装的Protosutffer - 数据协议:封装Request 和 Response - 编解码器的实现:Encoder、Decoder - Server服务端 - server core 核心模块 - config provider core核心 - 通过配置类的形式,方便与spring集成 ### 调用流程图 ![](https://www.wylong.top/netty/images/RPC/RPC-%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E5%9B%BE1.png) ### 一、客户端 架构方法关系图: - 连接管理器 - 通道初始化器 ![](https://www.wylong.top/netty/images/RPC/RPC-RpcClientInitializer%E9%80%9A%E9%81%93%E5%88%9D%E5%A7%8B%E5%8C%961.png) - client客户端 ![](https://www.wylong.top/netty/images/RPC/RPC-Client%E5%AE%A2%E6%88%B7%E7%AB%AF1.png) - ClientHandler业务处理执行器 ![](https://www.wylong.top/netty/images/RPC/RPC-RpcClientHandler%E4%B8%9A%E5%8A%A1%E5%A4%84%E7%90%86%E6%89%A7%E8%A1%8C%E5%99%A81.png) ### 二、服务器 架构方法关系图: - server服务端 ![](https://www.wylong.top/netty/images/RPC/RPC-Server%E6%9C%8D%E5%8A%A1%E7%AB%AF1.png) - RpcServerHandler服务端业务执行器流程图 ![](https://www.wylong.top/netty/images/RPC/2-1-RPC-RpcServerHandler%E6%9C%8D%E5%8A%A1%E7%AB%AF%E4%B8%9A%E5%8A%A1%E6%89%A7%E8%A1%8C%E5%99%A81.png) ### 三、客户端异步调用 - 异步发送请求 ![](https://www.wylong.top/netty/images/RPC/2-2-RPC-RpcClientHandler%E5%BC%82%E6%AD%A5%E5%8F%91%E9%80%81%E8%AF%B7%E6%B1%821.png) - 客户端异步请求代理实现 ![](https://www.wylong.top/netty/images/RPC/2-4%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%BC%82%E6%AD%A5%E8%AF%B7%E6%B1%82%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0invokAsync%E5%BC%82%E6%AD%A5%E4%BB%A3%E7%90%86%E8%B0%83%E7%94%A8%E5%AE%9E%E7%8E%B01.png) ## 总结 以上我们基于Netty实现了一个非非非常简陋的RPC框架,比起成熟的RPC框架来说相差甚远 距离完整的RPC框架还差:ZK注册中心、与Spring集成等 - TODO - 已于ZK实现注册中心 - 与Spring集成 # 延伸阅读 - [https://xilidou.com/2018/09/2...](https://link.segmentfault.com/?url=https%3A%2F%2Fxilidou.com%2F2018%2F09%2F26%2Fdourpc-remoting%2F) - [https://www.cnblogs.com/luxia...](https://link.segmentfault.com/?url=https%3A%2F%2Fwww.cnblogs.com%2Fluxiaoxun%2Fp%2F5272384.html) - [https://my.oschina.net/huangy...](https://link.segmentfault.com/?url=https%3A%2F%2Fmy.oschina.net%2Fhuangyong%2Fblog%2F361751) - [https://www.w3cschool.cn/arch...](https://link.segmentfault.com/?url=https%3A%2F%2Fwww.w3cschool.cn%2Farchitectroad%2Farchitectroad-rpc-framework.html) - [https://www.cnkirito.moe/dubb...](https://link.segmentfault.com/?url=https%3A%2F%2Fwww.cnkirito.moe%2Fdubbo27-features%2F) - [https://juejin.im/post/5ad2a9...](https://link.segmentfault.com/?url=https%3A%2F%2Fjuejin.im%2Fpost%2F5ad2a99ff265da238d51264d%23heading-6) - [https://juejin.im/book/5b4bc2...](https://link.segmentfault.com/?url=https%3A%2F%2Fjuejin.im%2Fbook%2F5b4bc28bf265da0f60130116%2Fsection%2F5b4db0e6e51d45191d79e475%23heading-3)