Java 编写基于 Netty 的 RPC 框架( 二 )

其他组件:
Handle: 为了支持各种协议和处理数据的方式,可以是连接,数据接收,异常,数据格式转换等
ChannelHandler
ChannelInboundHandler :最常用的Handler,作用是处理接收数据的事件,来处理我们的核心业务逻辑 。
【Java 编写基于 Netty 的 RPC 框架】ChannelInitializer : , 当一个链接建立时 , 我们需要知道怎么来接收或者发送数据 , 当然 , 我们有各种各样的Handler实现来处理它,那么ChannelInitializer便是用来配置这些Handler , 它会提供一个ChannelPipeline , 并把Handler加入到ChannelPipeline 。
ChannelPipeline :一个Netty应用基于ChannelPipeline机制,这种机制依赖EventLoop和EventLoopGroup,这三个都和事件或者事件处理相关
EventLoop : 为Channel处理IO操作,一个EventLoop可以为多个Channel服务
EventLoopGroup :包含多个EventLoop
Channel :代表一个Socket连接
Future :在Netty中所有的IO操作都是异步的,,因此我们不知道,过来的请求是否被处理了,所以我们注册一个监听,当操作执行成功或者失败时监听自动触发,所有操作都会返回一个ChannelFutrue
ChannelFuture
Netty 是一个非阻塞的,事件驱动的,网络编程框架,我们通过一张图理解一下,Channel,EventLoop以及EventLoopGroup之间的关系

Java 编写基于 Netty 的 RPC 框架

文章插图
 
解释一下,当一个连接过来,Netty首先会注册一个channel,然后EventLoopGroup会分配一个EventLoop绑定到这个channel,在这个channel的整个生命周期过程中,这个EventLoop一直为他服务,这个玩意就是一个线程
Java 编写基于 Netty 的 RPC 框架

文章插图
 
这下聊一下Netty如何处理数据?
前面有讲到,handler数据处理核心,,而ChannelPipeline负责安排Handler的顺序和执行,我们可以这样理解,数据在ChannelPipeline中流动,其中ChannelHandler就是一个个阀门,这些数据都会经过每一个ChannelHandler并且被他处理,其中ChannelHandler的两个子类ChannelOutboundHandler和ChannelInboundHandler,根据不同的流向,选择不同的Handler
Java 编写基于 Netty 的 RPC 框架

文章插图
 
由图可以看出,一个数据流进入ChannelPipeline时,一个一个handler挨着执行,各个handler的数据传递,这需要调用方法中ChannelHandlerContext来操作,而这个ChannelHandlerContext可以用来读写Netty中的数据流
三 Netty中的业务处理
netty中会有很多Handler.具体哪一种Handler还要看继承是InboundAdapter还是OutboundAdapter,Netty中提供一系列的Adapter来帮助我们简化开发,在ChannelPipeline中的每一个handler都负责把Event传递个洗下一个handler,有这些adapter,这些工作可以自动完成,,我们只需覆盖我们真正实现的部分即可,接下来比较常用的三种ChannelHandler
Encoders和Decodeers
我们在网络传输只能传输字节流,在发送数据时,把我们的message转换成bytes这个过程叫Encode(编码),相反,接收数据,需要把byte转换成message,这个过程叫Decode(解码)
Domain Logic
我们真正关心的如何处理解码以后的数据,我们真正的业务逻辑便是接收处理的数据,Netty提供一个常用的基类就是SimpleChannelInboundHandler<T>,其中T就是Handler处理的数据类型,消息到达这个Handler,会自动调用这个Handler中的channelRead0(ChannelHandlerContext,T)方法,T就是传过来的数据对象
四 基于netty实现的Rpc的例子
这是我的github上项目的位置
https://github.com/developerxiaofeng/rpcByNetty
项目目录结构如下
Java 编写基于 Netty 的 RPC 框架

文章插图
 
详细的项目细节看类中的注释,很详细哦 。
获取资料:最后给大家分享一些学习资料 , 里面包括:(BATJ面试资料、高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码 , MyBatis , Netty , redis , Kafka , MySQL , Zookeeper , Tomcat , Docker , Dubbo , Nginx等多个知识点的架构资料)和Java进阶学习路线图 。




推荐阅读