Java NIO 图解 Netty 服务端启动的过程

这篇具有很好参考价值的文章主要介绍了Java NIO 图解 Netty 服务端启动的过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.启动概述

了解整体Netty常用的核心组件后,并且对比了传统IO模式。在对比过程中,找到了传统IO对应Netty中是如何实现的。最后我们了解到在netty中常用的那些组件。


本文在了解下这些核心组件的前提下,进一步了解组件如何在整个服务器启动过程如何被创建,如何组件之间配合来使用。首先也是先了解下大概服务端的启动过程,并且在了解过程中我们带着自己的问题去在学习过程中探寻答案。

1.1 启动概述

1.2 启动问题

  1. netty服务端启动是如何设置非阻塞模式的?
  2. 服务端启动后事件是如何注册到selector上?

二.启动详述

2.1 channel 创建

还是一样首先在channel创建过程大概有哪些过程

  • bind

  • initAndRegister

  • 默认构造函数创建channel

具体调用关系

时序图中从1,2,3步都好理解。

2.1.1 创建channelFactory

从类的反射得到channel这里是一个关键点需要说明:


图中直接使用channelFactory来实现了channel的实例化.那么就按图索骥这个channelFactory是什么时候赋值的。

图中我们一步步找到channelFactory的路径。我们再看第三步是谁调用了
channel(Class<? extends C> channelClass) 创建了channelFactory。最后发现我们在bootstrap设置channel属性的时候设置了channelFactory。

走到这里我们才真正进入知道在bootstrap设置NioServerSocketChannel。并利用NioServerSocketChannel创建。

上述步骤我们小结一下。通过设置bootstrap的Channel属性来设置服务端NioServerSocketChannel生成了channelFactory。channelFactory 来主动调用传入的class来构造channel。

2.2.2 NioServerSocketChannel默认构造函数创建Channel

从上图中我们知道该构造工厂是调用类的构造函数来进行初始化,通过代码中我们知道构造类为NioServerSocketChannel。那么就看下NioServerSocketChannel构造过程。

先上来还是看下整体步骤:


通过默认的newSocket方法创建了jdk底层的channel,然后通过Channel的配置了channel的id,对应channel底层的读写unsafe组件,channel对应的逻辑处理pipeline,
最后通过configureBlocking设置channel为非阻塞模式【回答了我们第一个问题】。
第三步:通过channelConfig设置一些tcp层面的设置

至此channel创建完成

2.2 channel 初始化

通过上面2.1 整个channel已经创建完成。第二大步在创建channel的基础上,给channel做一些属性配置。


上图设置用的属性 对应到代码中 为如下的代码


这里均为一些自己的属性和配置的设置,至此channel的创建和初始化完成。这里的配置用以客户端新建连接时进行设置。

2.3 selector 注册

还是先整体看下 整个 selector 流程,是如何将channel注册到selector上。

ps:以上代码流程需要一层层通过断点方式进行跟踪。

第一步:AbstractBootStrap register 入口

以上的步骤完成channel的创建和初始化,通过initAndRegister内部方法来实现selector挂载.

第二步:调用

io.netty.channel.MultithreadEventLoopGroup#register(io.netty.channel.Channel)

register方法中通过next方法获取下一个可以调用EventLoop来调用它的register方法

第三步:调用

io.netty.channel.SingleThreadEventLoop#register(io.netty.channel.Channel)

调动channel.unsafe.register 方法获取channel底层操作,并调用unsafe的register方法

第四步:通过调用abstract Nio Channel 将channel注册到eventLoop的selector中【第二个问题的答案】,并将当前channel作为attache与socket channel关联。

完成对应的selector 和 channel 绑定之后如果有相应的事件回调会进行事件回调操作,这里需要的话需要继承ChannelInboundHandlerAdapter中对应的方法channelRegistered, channelActive。

至此nio channel 通过java 底层的socketchannel绑定 到指定的selector ,完成selector与niochannel 的注册过程。

2.4 端口绑定

基本步骤

第一步:底层端口channel绑定

第二步:最终调用AbstractNioChannel doBeginRead方法。

激活channel 并向selector 注册 read 事件。

三 .总结

整体了解到netty服务端的启动过程。

  1. 通过NioServerSocketChannel的channelFactory创建channelFactory方法

  2. channelFactory 通过反射调用nioServerSocketChannel构造函数。创建channel对象

  3. channel通过NioServerSocketChannelConfig将自定义的option,attr,handler设置完成。

  4. abstract Nio Channel调用register方法实现selector和channel的绑定

  5. 最终调用java channel 进行端口绑定并向selector 注册read事件

整体netty服务端启动完成。

作者:京东科技 陈方林

来源:京东云开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-681360.html

到了这里,关于Java NIO 图解 Netty 服务端启动的过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java NIO 和 Netty快速入门

    channel 是读写数据的双向通道,可以从 channel将数据读入buffer,也可以将buffer数据写入channel(较之前的stream要么是输入,要么是输出更为底层) 四种常见Channel: FileChannel DatagramChannel SocketChannel ServerSocketChannel buffer用来缓冲读写数据 常见buffer: ByteBuffer MappedByteBuffer DirectByteBuffer

    2024年02月22日
    浏览(31)
  • 以 Java NIO 的角度理解 Netty

    上篇文章《Netty 入门指南》主要涵盖了 Netty 的入门知识,包括 Netty 的发展历程、核心功能与组件,并且通过实例演示了如何使用 Netty 构建一个 HTTP 服务器。由于 Netty 的抽象程度较高,因此理解起来可能会更加复杂和具有挑战性,所以本文将通过 Java NIO 的处理流程与 Netty 的

    2024年02月12日
    浏览(34)
  • 快速入门Java NIO(Not I/O)的网络通信框架--Netty

    了解netty前需要对nio有一定认识,该笔记基础来自bilinbili黑马,在此基础上自己学习的笔记,添加了一些自己的理解 了解java 非阻塞io编程 1.1 Netty 是什么? Netty 是一个异步(基于多线程)的、基于事件驱动(多路复用的那写事件驱动)的网络应用框架,用于快速开发可维护、高性能的

    2024年01月17日
    浏览(38)
  • Java服务刚启动时,一小波接口超时排查全过程

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明。 我们组有一个流量较大的Java服务,每次发代码时,服务都会有一小波接口超时,之前简单分析过,发现这些超时的case仅发生在服务刚启动时,少量请求会耗时好几秒,但之后又马上恢复正常。

    2024年02月16日
    浏览(46)
  • netty源码阅读--服务启动

    netty是一个非常成熟的NIO框架,众多apache的顶级项目底层通信框架都是用的是netty,本系列博客主要是记录自己复习netty源码的过程,重在理解netty的关键如:如何启动,如何接受网络数据、netty的内存管理机制以及编解码器等,废话不多说,直接跟着netty源码中的MQTT的官方示例

    2023年04月22日
    浏览(27)
  • 【netty基础四】netty与nio

    阻塞I/O在调用InputStream.read()方法时是 阻塞的,它会一直等到数据到来 (或超时)时才会返回; 同样,在调用ServerSocket.accept()方法时,也会一直 阻塞到有客户端连接 才会返回,每个客户端连接成功后,服务端都会启动一个线程去处理该客户端的请求。 阻塞I/O的通信模型示意

    2024年02月10日
    浏览(77)
  • Netty开篇——NIO章下(五)

    SelectionKey 表示 Selector 和网络通道的注册关系,共四种(全是常量): Int OP_ACCEPT:有新的网络连接可以接受,值为 16 (1 4) Int OP_CONNECT: 代表连接已经建立,值为 8 (1 3) Int OP_READ:代表读操作,值为 1 (1 0) Int OP_WRITE: 代表写操作,值为 4  (1 2) 相关方法:   ServerSocket

    2024年01月20日
    浏览(35)
  • Netty开篇——NIO章上(三)

    Java NIO基本介绍 java non-blocking I/O 称为NIO(也叫New IO)。JDK4开始提供,同步非阻塞 相关内容在 java.nio 包及子包下,对java.io 包中的很多类进行改写。 三大核心: Channel(通道),Buffer(缓冲区),Selector(选择器) NIO是 面向缓冲区或者面向块 编程 的 。数据读取到一个它后处理的缓冲区,

    2024年01月16日
    浏览(36)
  • NIO和netty的常用类

    给ServerBootstrap配置两个EventLoopGroup,一个建立连接,一个处理网络io。 EventLoopGroup给EventLoop分配线程。 在 Netty 中,EventLoop 通过不断轮询 Selector 来检测 Channel 上发生的事件,当 Channel 上的事件到达时,EventLoop 会将事件传入 相应的Channel 的成员变量 ChannelPipeline 中,经过所有C

    2024年01月25日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包