文章目录

  • 一、前言
  • 二、整体运行
  • 三、客户端和服务端
  • 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具体实现架构(为了完成 “像调用本地服务一样调用远程服务” 的目的):

Netty_06_手写RPC基础版(实践类)_rpc

需要用到的东西,包括 多协议、自定义消息类型、多种序列化方式、反射调用 等。

源码下载:https://www.syjshare.com/res/QL0434P3

手写RPC框架是netty的应用,不断往dubbo上靠拢

二、整体运行

先启动rpc服务端

Netty_06_手写RPC基础版(实践类)_dubbo_02

然后启动rpc客户端,看日志

Netty_06_手写RPC基础版(实践类)_rpc_03

然后看rpc服务端的日志

Netty_06_手写RPC基础版(实践类)_dubbo_04

三、客户端和服务端

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

Netty_06_手写RPC基础版(实践类)_客户端_05

Netty_06_手写RPC基础版(实践类)_rpc_06

Netty_06_手写RPC基础版(实践类)_rpc_07

Netty_06_手写RPC基础版(实践类)_服务端_08

Netty_06_手写RPC基础版(实践类)_rpc_09

步骤2:对象bean序列化为byte[] out写出去 log.info("============begin RpcEncoder=========");

Netty_06_手写RPC基础版(实践类)_服务端_10


步骤3:接收到服务端响应,立刻反序列化为对象 log.info("========begin RpcDecoder==========");

Netty_06_手写RPC基础版(实践类)_服务端_11


步骤4:打印一下反序列出来的对象 log.info("receive Rpc Server Result");

Netty_06_手写RPC基础版(实践类)_rpc_12

3.2 服务端

步骤1:接受到就解码反序列化为bean对象

步骤2:打印出来bean对象

步骤3:拼装响应

步骤4:编码为byte[],并发送出去

Netty_06_手写RPC基础版(实践类)_java_13


Netty_06_手写RPC基础版(实践类)_java_14


Netty_06_手写RPC基础版(实践类)_服务端_15


Netty_06_手写RPC基础版(实践类)_服务端_16

3.3 RpcServerInitializer和RpcClientInitializer

Netty_06_手写RPC基础版(实践类)_客户端_17


server有四个handler client有五个handler,相同的handler

编码器:就是固定长度,解决拆包粘包问题

序列化和反序列化:先序列化,然后发送;先接收,然后反序列化

四、小结

这个代码,服务端是netty集成springboot,客户端是普通的java main启动,演示netty的功能,包括如下:

(1) 可以提供nio,简化了 (代码演示了)
(2) 网络中的拆包粘包问题 (代码演示了)
(3) 多协议(代码演示了)
(4) 多种序列化方式 (代码演示了)
(5) 自定义消息格式 (代码演示了)
(6) 内存池 和 零拷贝 (内部原理,代码无法演示)

源码下载:https://www.syjshare.com/res/QL0434P3