Netty的基本架构详解

虚烬
• 阅读 1279

上一节课我们对Netty有了一个初步的认识,这一节课我们会一起俯瞰整个Netty的脉络,以便于对Netty的架构原理有一个整体的认知!下图是Netty的主要架构骨架:(欢迎关注wx公众号:【源码学徒】共同探究各类开源代码实现!)

Netty的基本架构详解

EventLoopGroup基本认识

我们需要了解的 EventLoopGroup, Netty对EventLoopGroup做了很多的扩展实现,下图是他的家族图谱:

Netty的基本架构详解

我们上一节课使用的案例,使用的是NioEventLoopGroup,他是NIO的实现,可以看出来他是MultithreadEventLoopGroup的子类,从名字上可以看出来,NioEventLoopGroup是一个多线程事件循环组,这里你可以把它看作是一个线程池,内部存在多个线程(NioEventLoop),每一个客户端连接的SocketChannel都对应一个线程(NioEventLoop)!

我们上面一直再说NioEventLoop, 我们基于上图可以看出来,他是SingleThreadEventLoop的子类,从名字上也能看出来,他是一个单线程的执行器!我们可以看到,他的父接口事实上也是继承与EventLoopGroup, 也就是说,虽然NIoEventLoop是一个单线程事件循环,但是我们基于接口,也可以把他看作为一个线程池,只不过这个线程池内部只有一个线程!

\## Netty的通讯通道

我们需要了解的Netty中的管道种类,这里我们重点分析NIO的实现方式:

Netty的基本架构详解

我们可以看到,Netty的Socket通讯管道的主要实现方式有两种,NioServerSocketChannel, NioSocketChannel, 这两种实现是Netty对于服务端通道,与客户端通道的不同实现,我们在开发Netty的服务端与客户端的时候,会指定使用管道的类型! 这里面有一个比较重要的点,即NioServerSocketChannel的父类实现是 AbstractNioMessageChannel, NioSocketChannel的父类实现是AbstractNioByteChannel ,这两个实现是后续NIO事件循环的时候判断是处理连接还是处理数据的重要手段,这里留个印象,我们后续会详细说!

Netty的管道流

我们需要了解的Netty的业务执行链,又叫管道流 ChannelPipeline

我们的Netty代码中都会由类似这种逻辑的代码:

Netty的基本架构详解

他是Netty能够让我们专注于业务的主要实现方式,他的主要实现是一个双向链表,这里是在链表末尾追加一个Handler业务处理器,Handler的种类大致分为两种:

Netty的基本架构详解

如上图所示,他有两种实现方式,一个是ChannelInboundHandlerAdapter一个是ChannelOutboundHandlerAdapter, 他们的调用在一个业务流中的执行顺序如下,我们借用一个图示来说明:

Netty的基本架构详解

当我们调用Socket的读数据的API时,即从Socket管道读取数据时,Pipeline会按照你的添加顺序依次执行 Inbound Handler,当我们读取事件完毕,调用write方法向通道内写入数据的时候,管道流开始调用 Outbound Handler方法,倒序调用!这个倒序调用可能不好理解,我们还是用图来说明:

Netty的基本架构详解

当调用read方法的时候,顺序调用Inbound节点! 当调用write方法的时候,倒序调用outbount方法!

Netty的Handler事件回调种类

1. ChannelInboundHandler

方法名称方法作用
handlerAdded通道被添加 1
channelRegisteredJDK注册成功后回调所有Handler的方法 2
channelActivejdkChannel被激活后回调 3
channelRead通道内有数据可读 4
channelReadComplete数据读取完毕 5
channelInactive通道被关闭后回调该方法 6
channelUnregistered通道被取消注册回调用该方法 7
handlerRemoved通道被删除 8
userEventTriggered如果触发了用户事件,则调用该方法。
channelWritabilityChanged可写的状态改变
exceptionCaught发生了异常

2. ChannelOutboundHandler

方法名称方法作用
bind进行绑定操作后调用。
connect进行连接操作后调用。
disconnect进行断开连接操作后调用。
close进行关闭操作后调用。
deregister从当前已注册的EventLoop进行注销操作后调用。
read读数据
write写数据
flush刷新到管道

总结

通过本篇文章,我们可以了解到Netty中比较重要的几个概念,EventLoopGroup的基本概念、Netty中的通道概念、Netty中的管道流的概念!

点赞
收藏
评论区
推荐文章
Stella981 Stella981
4年前
Netty 入门,这一篇文章就够了
Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo、Rocketmq、Hadoop等,针对高性能RPC,一般都是基于Netty来构建,比如sockbolt。总之一句话,Java小伙伴们需要且有必要学会使用Netty并理解其实现原理。netty旨在为可维护的高性能、高可扩展
Stella981 Stella981
4年前
Netty源码解析
本文来分享Netty中的零拷贝机制以及内存缓冲区ByteBuf的实现。源码分析基于Netty4.1.52Netty中的零拷贝Netty中零拷贝机制主要有以下几种1.文件传输类DefaultFileRegiontransferTo,调用FileChanneltransferTo,直接将文件缓冲区的数据发送到目标Cha
Stella981 Stella981
4年前
Netty 入门初体验
Netty简介Netty是一款异步的事件驱动的网络应用程序框架,支持快速开发可维护的高性能的面向协议的服务器和客户端。Netty主要是对java的nio包进行的封装为什么要使用Netty上面介绍到Netty是一款高性能的网络通讯框架,那么我们为什么要使用Netty,换句话说,
Stella981 Stella981
4年前
Netty源码分析(二):服务端启动
上一篇粗略的介绍了一下netty,本篇将详细介绍Netty的服务器的启动过程。ServerBootstrap看过上篇事例的人,可以知道ServerBootstrap是Netty服务端启动中扮演着一个重要的角色。它是Netty提供的一个服务端引导类,继承自AbstractBootstrap。Serv
Stella981 Stella981
4年前
Netty构建游戏服务器(三)
一,基本方法上节实现了netty的基本连接,这节加入spring来管理netty,由spring来开启netty服务。在netty服务器中,我们建立了三个类:HelloServer(程序主入口), HelloServerInitializer(传输通道初始化),HelloServerHandler(业务控制器)这三个类中Hello
Stella981 Stella981
4年前
Netty入门2之
在上一章中我们认识了netty,他有三大优点:并发高,传输快,封装好。在这一章我们来用Netty搭建一个HttpServer,从实际开发中了解netty框架的一些特性和概念。netty.png认识Http请求在动手写Netty框架之前,我们先要了解http请求的组成,如下图:HTTPresponsecomponentpa
Stella981 Stella981
4年前
Spark RPC通讯机制
Spark1.6推出了RPCEnv,RPCEndpoint,RPCEndpointRef为核心的新型架构下的RPC通信方式。早期版本当中,有netty和Akka两种实现方式。但是从最新的2.11代码来看,Akka已经找不到了。关于netty的更多知识,可以查看之前的文章。RpcEndpoint和RpcEndpointRef有一个管理者:RpcEnv。
Stella981 Stella981
4年前
Netty网络编程(初识)
Netty简单介绍核心架构图(现在还看不是很懂):!netty(https://static.oschina.net/uploads/img/201712/02192156_X1e5.png"netty")Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高
Stella981 Stella981
4年前
Netty之大名鼎鼎的EventLoop
EventLoopGroup与Reactor:前面的章节中我们已经知道了,一个Netty程序启动时,至少要指定一个EventLoopGroup(如果使用到的是NIO,通常是指NioEventLoopGroup),那么,这个NioEventLoopGroup在Netty中到底扮演着什么角色呢?我们知道,Netty是Reactor模型的
Stella981 Stella981
4年前
Netty 能做什么
作为一个学Java的,如果没有研究过Netty,那么你对Java语言的使用和理解仅仅停留在表面水平,会点SSH,写几个MVC,访问数据库和缓存,这些只是初等Java程序员干的事。如果你要进阶,想了解Java服务器的深层高阶知识,Netty绝对是一个必须要过的门槛。有了Netty,你可以实现自己的HTTP服务器,FTP服务器,UDP服务器,RPC服务器,W