李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
01.Netty概述
Leefs
2022-06-06 PM
1406℃
0条
[TOC] ### 一、Netty简介 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。 “快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。 ### 二、优缺点 #### NIO缺点 - NIO的类库和API繁杂,使用麻烦,需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等,这就像我们会使用Hibernate、MyBatis这些ORM框架而不会直接使用Connection、Statement一样; - 需要其他额外技能作为铺垫,必须对多线程和网络编程非常熟悉才能写出高质量的NIO程序; - 可靠性能力补齐,工作量和难度都非常大,例如客户端面临断线重连、网络闪断、半包读写、失败缓存、网络拥塞、异常码流等问题的处理; - JDK NIO的BUG,例如著名的epoll bug,该问题会导致Selector空轮训,最终导致CPU 100%。 也正是因为有种种缺点,因此不建议使用原生的NIO而是建议使用一些比较成熟的NIO框架例如Netty、Mina。 #### netty优点 - API使用简单、开发门槛低 - 功能强大,预置了多种编码解码功能,支持多种主流协议 - 定制能力强,可以通过ChannelHandler对通信框架进行灵活扩展 - 性能高,与业界其他主流NIO框架对比,Netty性能最优 - 成熟、稳定,Netty修复了已经发现的所有JDK NIO的BUG,业务开发人员不需要再为NIO的BUG而烦恼 - 社区活跃、版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会被加入 - 经历了大规模的商业应用考验,质量得到验证 正因为这些优点,Netty逐渐成为了Java NIO变成的首选框架。 ### 三、Netty的地位 Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位 以下的框架都使用了 Netty,因为它们有网络通信需求! * Cassandra - nosql 数据库 * Spark - 大数据分布式计算框架 * Hadoop - 大数据分布式存储框架 * RocketMQ - ali 开源的消息队列 * ElasticSearch - 搜索引擎 * gRPC - rpc 框架 * Dubbo - rpc 框架 * Spring 5.x - flux api 完全抛弃了 tomcat ,使用 netty 作为服务器端 * Zookeeper - 分布式协调框架 ### 四、Netty架构 #### 4.1 Netty功能架构 + 官网图片 ![01.Netty概述01.png](https://lilinchao.com/usr/uploads/2022/06/4268773190.png) + **中文版** ![01.Netty概述03.jpg](https://lilinchao.com/usr/uploads/2022/06/3023142680.jpg) **说明** + **Transport Service服务传输层**:Netty提供了底层网络通讯的能力,它抽象了底层网络TCP、UDP等协议的网络通信,使得开发者将更多的精力专注于业务。也正是因为这一层的封装,使得NIO/BIO之间能够无缝切换。 + **Protocol Support协议层**:Netty几乎实现了市面上的大部分主流协议、包括HTTP、SSL、Protobuf、压缩、大文件传输、WebSocket、文本、二进制等主流协议, 而且Netty支持自定义扩展协议。Netty丰富的协议使得用户的开发成本大大降低,使用内置的协议可以很轻松的开发一个类似于Tomcat的Http服务器。 + **Core核心层**:是Netty的最主要的实现,后续的所有扩展都建立在Core之上,他提供了事件的可扩展模型、网络通讯编程的通用API、数据零拷贝和数据载体的封装和复用 #### 4.2 Netty逻辑架构 Netty 采用了典型的三层网络架构进行设计和开发,其逻辑架构图如下所示。 ![01.Netty概述02.png](https://lilinchao.com/usr/uploads/2022/06/1016307788.png) + **通信调度层 Reactor** 它由一系列辅助类完成,包括 Reactor 线程 NioEventLoop 及其父类,`NioSocketChannel / NioServerSocketChannel` 及其父类,Buffer 组件,Unsafe 组件等。 该层的主要职责就是**监听网络的读写和连接操作**,负责**将网络层的数据读取到内存缓冲区**,然后触发各种网络事件,例如连接创建、连接激活、读事件、写事件等,将这些事件触发到 PipeLine 中,由 PipeLine 管理的责任链来进行后续的处理。 + **责任链层Pipeline** 它负责上述的各种网络事件在责任链中的有序传播,同时负责动态地编排责任链。 责任链可以选择监听和处理自己关心的事件,它可以拦截处理事件,以及向前向后传播事件。 不同应用的 Handler 节点 的功能也不同,通常情况下,往往会开发编解码 Hanlder 用于消息的编解码,可以将外部的协议消息转换成内部的 POJO 对象,这样上层业务则只需要关心处理业务逻辑即可,不需要感知底层的协议差异和线程模型差异,实现了架构层面的分层隔离。 + **业务逻辑编排层 Service ChannelHandler** 业务逻辑编排层通常有两类:一类是纯粹的业务逻辑编排,还有一类是其他的应用层协议插件,用于特定协议相关的会话和链路管理。 例如,CMPP 协议,用于管理和中国移动短信系统的对接。 **总述** 架构的不同层面,需要关心和处理的对象都不同,通常情况下,对于业务开发者,只需要关心责任链的拦截和业务 Handler 的编排。因为应用层协议栈往往是开发一次,到处运行,所以实际上对于业务开发者来说,只需要关心服务层的业务逻辑开发即可。 各种应用协议以插件的形式提供,只有协议开发人员需要关注协议插件,对于其他业务开发人员来说,只需关心业务逻辑定制。 这种分层的架构设计理念实现了 NIO 框架各层之间的解耦,便于上层业务协议栈的开发和业务逻辑的定制。 正是由于 Netty 的分层架构设计非常合理,基于 Netty 的各种应用服务器和协议栈开发才能够如雨后春笋般得到快速发展。 ### 五、Netty核心组件 #### 5.1 Bootstrap or ServerBootstrap 一个Netty应用通常由一个Bootstrap开始,它主要作用是配置整个Netty程序,串联起各个组件。 #### 5.2 Handler 为了支持各种协议和处理数据的方式,便诞生了Handler组件。Handler主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。 + **ChannelInboundHandler** 一个最常用的Handler。这个Handler的作用就是处理接收到数据时的事件,也就是说,我们的业务逻辑一般就是写在这个Handler里面的,ChannelInboundHandler就是用来处理我们的核心业务逻辑。 #### 5.3 ChannelInitializer 当一个链接建立时,我们需要知道怎么来接收或者发送数据,当然,我们有各种各样的Handler实现来处理它,那么ChannelInitializer便是用来配置这些Handler,它会提供一个ChannelPipeline,并把Handler加入到ChannelPipeline。 #### 5.4 ChannelPipeline 一个Netty应用基于ChannelPipeline机制,这种机制需要依赖于EventLoop和EventLoopGroup,因为它们三个都和事件或者事件处理相关。 EventLoops的目的是为Channel处理IO操作,一个EventLoop可以为多个Channel服务。 EventLoopGroup会包含多个EventLoop。 #### 5.5 Channel 代表了一个Socket链接,或者其它和IO操作相关的组件,它和EventLoop一起用来参与IO处理。 #### 5.6 Future 在Netty中所有的IO操作都是异步的,因此,你不能立刻得知消息是否被正确处理,但是我们可以过一会等它执行完成或者直接注册一个监听,具体的实现就是通过Future和ChannelFutures,他们可以注册一个监听,当操作执行成功或失败时监听会自动触发。 总之,所有的操作都会返回一个ChannelFuture。 *附参考文章链接:* *https://www.cnblogs.com/h--d/p/14891780.html* *https://www.jianshu.com/p/1a6d1a25e6cc* *https://www.mdnice.com/writing/628ddf7572454fc091a4058f6155ba7d*
标签:
Netty
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2131.html
上一篇
18.NIO之零拷贝
下一篇
【转载】02.Netty线程模型
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
字符串
MySQL
工具
LeetCode刷题
Shiro
GET和POST
Python
算法
递归
JavaWeb
Linux
Netty
NIO
Typora
SQL练习题
JVM
SpringBoot
微服务
数学
Hive
Beego
Docker
Java阻塞队列
Spark Streaming
Livy
哈希表
队列
Flink
JavaSE
gorm
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭