netty概述

Nett概述

1、Netty简介

Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。

“快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。

netty官网: http://netty.io/

权威书籍:《Netty In Action》 (https://download.csdn.net/download/weixin_37068368/10377062)

官方样例:https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example

2、优缺点

2.1 缺点

  • NIO的类库和API繁杂,使用麻烦,需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等,这就像我们会使用Hibernate、MyBatis这些ORM框架而不会直接使用Connection、Statement一样;
  • 需要其他额外技能作为铺垫,必须对多线程和网络编程非常熟悉才能写出高质量的NIO程序;
  • 可靠性能力补齐,工作量和难度都非常大,例如客户端面临断线重连、网络闪断、半包读写、失败缓存、网络拥塞、异常码流等问题的处理;
  • JDK NIO的BUG,例如著名的epoll bug,该问题会导致Selector空轮训,最终导致CPU 100%。

也正是因为有种种缺点,因此不建议使用原生的NIO而是建议使用一些比较成熟的NIO框架例如Netty、Mina。

2.2 优点

  1. API使用简单、开发门槛低
  2. 功能强大,预置了多种编码解码功能,支持多种主流协议
  3. 定制能力强,预置了多种编码解码功能,并支持多种主流协议
  4. 性能高
  5. 成熟、稳定 Netty修复了已经发现的所有JDK NIO的BUG
  6. 社区活跃 版本迭代周期短 发现BUG可以及时修复
  7. 经历了大规模的商业应用考验,质量得到验证

3、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 - 分布式协调框架

4、Netty架构

4.1 Netty功能架构
  • 官网图片
    在这里插入图片描述

  • 中文版

在这里插入图片描述

说明

  • 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 采用了典型的三层网络架构进行设计和开发,其逻辑架构图如下所示。
在这里插入图片描述

  • 通信调度层 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值