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

Posted 毛奇志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty_06_手写RPC基础版(实践类)相关的知识,希望对你有一定的参考价值。

文章目录

一、前言

常用的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

以上是关于Netty_06_手写RPC基础版(实践类)的主要内容,如果未能解决你的问题,请参考以下文章

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

基于Netty手写RPC框架进阶版(下)——注册中心及服务的动态扩容

#yyds干货盘点# 基于Netty,20分钟手写一个RPC框架

手写dubbo-3rpc雏形——完成基本的远程调用

java 从零开始手写 RPC (04) -序列化

Netty_04_消息协议设计与实战(实践类)