李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
01.Netty概述
Leefs
2022-06-06 PM
931℃
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://www.lilinchao.com/archives/2131.html
上一篇
18.NIO之零拷贝
下一篇
【转载】02.Netty线程模型
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
序列化和反序列化
正则表达式
Linux
Spark
JavaWEB项目搭建
并发编程
Http
容器深入研究
Hive
二叉树
数据结构和算法
Filter
GET和POST
Shiro
Elasticsearch
DataX
Typora
MyBatisX
MyBatis-Plus
MySQL
Golang
工具
CentOS
Java阻塞队列
Jquery
Java
链表
ClickHouse
JavaSE
并发线程
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞