文章目录
- 一、前言
- 二、整体运行
- 三、客户端和服务端
- 3.1 客户端
- 3.2 服务端
- 3.3 RpcServerInitializer和RpcClientInitializer
- 四、小结
一、前言
常用的rpc框架:dubbo thrift gRPC
rpc定义:remote proceducer call
rpc目的/解决的问题: 像调用本地服务一样调用远程服务
nio(非阻塞io,可以接收无限个cmd连接) - reactor(nio的网络设计模式) - netty依赖(高性能的网络通信框架) - rpc框架(像调用本地服务一样调用远程服务)
在微服务架构中,网络通信是一个问题,springcloud dubbo 中的各个微服务之间,相互调用,都是使用rpc协议进行通信,比如 openfeign .
rpc具体实现架构(为了完成 “像调用本地服务一样调用远程服务” 的目的):
需要用到的东西,包括 多协议、自定义消息类型、多种序列化方式、反射调用 等。
源码下载:https://www.syjshare.com/res/QL0434P3
手写RPC框架是netty的应用,不断往dubbo上靠拢
二、整体运行
先启动rpc服务端
然后启动rpc客户端,看日志
然后看rpc服务端的日志
三、客户端和服务端
3.1 客户端
步骤1:客户端启动就拼装消息bean
步骤2:对象bean序列化为byte[] out写出去 log.info("============begin RpcEncoder=========");
步骤3:接收到服务端响应,立刻反序列化为对象 log.info("========begin RpcDecoder==========");
步骤4:打印一下反序列出来的对象 log.info("receive Rpc Server Result");
步骤1:客户端启动就拼装消息bean
步骤2:对象bean序列化为byte[] out写出去 log.info("============begin RpcEncoder=========");
步骤3:接收到服务端响应,立刻反序列化为对象 log.info("========begin RpcDecoder==========");
步骤4:打印一下反序列出来的对象 log.info("receive Rpc Server Result");
3.2 服务端
步骤1:接受到就解码反序列化为bean对象
步骤2:打印出来bean对象
步骤3:拼装响应
步骤4:编码为byte[],并发送出去
3.3 RpcServerInitializer和RpcClientInitializer
server有四个handler client有五个handler,相同的handler
编码器:就是固定长度,解决拆包粘包问题
序列化和反序列化:先序列化,然后发送;先接收,然后反序列化
四、小结
这个代码,服务端是netty集成springboot,客户端是普通的java main启动,演示netty的功能,包括如下:
(1) 可以提供nio,简化了 (代码演示了)
(2) 网络中的拆包粘包问题 (代码演示了)
(3) 多协议(代码演示了)
(4) 多种序列化方式 (代码演示了)
(5) 自定义消息格式 (代码演示了)
(6) 内存池 和 零拷贝 (内部原理,代码无法演示)
源码下载:https://www.syjshare.com/res/QL0434P3