【Java进阶营】netty源码分析

【Java进阶营】netty源码分析,第1张

基本组成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GiJlgL6r-1650625844191)(//upload-images.jianshu.io/upload_images/24483793-26157847878c212c.png?imageMogr2/auto-orient/strip|imageView2/2/w/989/format/webp)]

从图中可以看出,netty主要涉及以下几个部分

  • NioEventLoop:netty的核心发动机,在死循环中select OP_READ/OP_ACCEPT事件
  • Channel:把NIO中SocketChannel封装成netty的NioSocketChannel(接收客户端连接后创建的channel);把NIO中ServerSocketChannel封装成netty的NioServerSocketChannel(netty server端启动时创建,绑定服务端端口);
  • ByteBuf:对channel中数据进行读写
  • Pipeline:把用户业务逻辑使用责任链串联起来,后面用户读写用户数据时会经过责任链中每个节点进行处理(接收到客户端连接创建NioSocketChannel时创建)
  • ChannelHandler:pipeline中的节点,负责处理具体的业务逻辑
基本流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6jc65K8-1650625844206)(//upload-images.jianshu.io/upload_images/24483793-869d54d3684f1dda.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]

NioEventLoop结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-608Ygszf-1650625844209)(//upload-images.jianshu.io/upload_images/24483793-ffae32cb78fa5d86.png?imageMogr2/auto-orient/strip|imageView2/2/w/845/format/webp)]

  • Group相关类:都从JDK提供的ExecutorService继承而来,因此明显是提供线程池相关的能力;在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
  • Executor相关类:都从JDK提供的AbstractExecutorService继承而来
Channel结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6cSM9lh-1650625844210)(//upload-images.jianshu.io/upload_images/24483793-579e0ee7b47a18b7.png?imageMogr2/auto-orient/strip|imageView2/2/w/992/format/webp)]

  • AbstractChannel:提供channel的基础功能包含unsafe/pipeline/eventLoop等
  • AbstractNioChannel:增加了Nio相关功能包含SelectableChannel/SelectionKey/readInterestOp等
  • AbstractNioMessageChannel:服务端channel基础类,提供服务端channel的doReadMessages/doWriteMessage抽象方法
  • AbstractNioByteChannel:客户端channel基础类,提供客户端channel的doReadBytes/doWriteBytes抽象方法
  • NioServerSocketChannel:服务端channel具体类,主要个性化的重写各个父类提供的抽象方法
  • NioSocketChannel:客户端channel具体类,主要个性化的重写各个父类提供的抽象方法
  • Unsafe相关类:Channel ~> AbstractChannel ~> AbstractNioChannel ~> AbstractNioByteChannel ~> NioSocketChannel 中分别有一个对应的内部类 Unsafe ~> AbstractUnsafe ~> AbstractNioUnsafe ~> NioByteUnsafe ~> NioSocketChannelUnsafe;Channel的IO *** 作都是委托给Unsafe,例如:read/write/bind/register/close等等
  • NioServerSocketChannel和NioSocketChannel几点区别:
    1. 向父类注册的事件不同,NioServerSocketChannel是accept, NioSocketChannel是read
    2. NioServerSocketChannel的read *** 作是指读取一条连接,NioSocketChannel是指读取IO数据

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/721307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存