高性能网络通信框架Netty-基础概念篇

简介: Netty是一种可以轻松快速的开发协议服务器和客户端网络应用程序的NIO框架,它大大简化了TCP或者UDP服务器的网络编程,但是你仍然可以访问和使用底层的API,Netty只是对其进行了高层的抽象。

一、前言

Netty是一种可以轻松快速的开发协议服务器和客户端网络应用程序的NIO框架,它大大简化了TCP或者UDP服务器的网络编程,但是你仍然可以访问和使用底层的API,Netty只是对其进行了高层的抽象。

Netty的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题。Netty是被精心设计的,它的设计参考了许多协议的实现,比如FTP,SMTP,HTTP和各种二进制和基于文本的传统协议,因此 Netty成功的实现了兼顾快速开发,性能,稳定性,灵活性为一体,不需要为了考虑一方面原因而妥协其他方面。

image

二、基础概念

Channel也就是通道,这个概念是在JDK NIO类库里面提供的一个概念,JDK中其实现类有客户端套接字通道java.nio.channels.SocketChannel和服务端监听套接字通道java.nio.channels.ServerSocketChannel,Channel的出现是为了支持异步IO操作,JDK里面的通道是java.nio.channels.Channel。

io.netty.channel.Channel是Netty框架自己定义的一个通道接口,Netty实现的客户端NIO套接字通道是NioSocketChannel,提供的服务器端NIO套接字通道是NioServerSocketChannel。

  • NioSocketChannel
    客户端套接字通道,内部管理了一个Java NIO中的java.nio.channels.SocketChannel实例,用来创建SocketChannel实例和设置该实例的属性,并调用Connect方法向服务端发起TCP链接等。
  • NioServerSocketChannel
    服务器端监听套接字通道,内部管理了一个Java NIO中的java.nio.channels.ServerSocketChannel实例,用来创建ServerSocketChannel实例和设置该实例属性,并调用该实例的bind方法在指定端口监听客户端的链接。
  • Channel与socket的关系
    在Netty中Channel有两种,对应客户端套接字通道NioSocketChannel,内部管理java.nio.channels.SocketChannel套接字,对应服务器端监听套接字通道NioServerSocketChannel,其内部管理自己的java.nio.channels.ServerSocketChannel套接字。也就是Channel是对socket的装饰或者门面,其封装了对socket的原子操作。
  • EventLoopGroup
    Netty之所以能提供高性能网络通讯,其中一个原因是因为它使用Reactor线程模型。在netty中每个EventLoopGroup本身是一个线程池,其中包含了自定义个数的NioEventLoop,每个NioEventLoop是一个线程,并且每个NioEventLoop里面持有自己的selector选择器。

在Netty中客户端持有一个EventLoopGroup用来处理网络IO操作,在服务器端持有两个EventLoopGroup,其中boss组是专门用来接收客户端发来的TCP链接请求的,worker组是专门用来具体处理完成三次握手的链接套接字的网络IO请求的。

  • Channel 与 EventLoop 的关系
    Netty中NioEventLoop是EventLoop的一个实现,每个NioEventLoop中会管理自己的一个selector选择器和监控选择器就绪事件的线程;每个Channel只会关联一个NioEventLoop;

当Channel是客户端通道NioSocketChannel时候,会注册NioSocketChannel管理的SocketChannel实例到自己关联的NioEventLoop的selector选择器上,然后NioEventLoop对应的线程会通过select命令监控感兴趣的网络读写事件;
当Channel是服务端通道NioServerSocketChannel时候,NioServerSocketChannel本身会被注册到boss EventLoopGroup里面的某一个NioEventLoop管理的selector选择器上,而完成三次握手的链接套接字是被注册到了worker EventLoopGroup里面的某一个NioEventLoop管理的selector选择器上;
需要注意是多个Channel可以注册到同一个NioEventLoop管理的selector选择器上,这时候NioEventLoop对应的单个线程就可以处理多个Channel的就绪事件;但是每个Channel只能注册到一个固定的NioEventLoop管理的selector选择器上。

  • ChannelPipeline
    Netty中的ChannelPipeline类似于Tomcat容器中的Filter链,属于设计模式中的责任链模式,其中链上的每个节点就是一个ChannelHandler。在netty中每个Channel有属于自己的ChannelPipeline,对从Channel中读取或者要写入Channel中的数据进行依次处理,如下图是netty源码里面的一个图:

image
需要注意一点是虽然每个Channel(更底层说是每个socket)有自己的ChannelPipeline,但是每个ChannelPipeline里面可以复用一个ChannelHandler。

三、总结

Netty作为高性能异步通讯框架,其应用还是比较广泛的,比如阿里巴巴开源的高性能Rpc框架Dubbo的网络通讯默认实现使用的是Netty, 蚂蚁金服开源的金融级Sofa-Bolt 框架,底层网络通讯也是基于 Netty 来实现的,还有最近刚开源的Zuul2.0使用Netty重写了其接受与处理请求的逻辑。

image.png

目录
相关文章
|
3天前
|
存储 网络协议 Linux
RTnet – 灵活的硬实时网络框架
本文介绍了开源项目 RTnet。RTnet 为以太网和其他传输媒体上的硬实时通信提供了一个可定制和可扩展的框架。 本文描述了 RTnet 的架构、核心组件和协议。
11 0
RTnet – 灵活的硬实时网络框架
|
4天前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
12 0
|
4天前
|
存储 网络协议 Unix
【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)
【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)
6 0
|
5天前
|
运维 网络协议 安全
第一节-网络的基本概念
第一节-网络的基本概念
12 0
|
8天前
|
机器学习/深度学习 人工智能 编解码
【AI 生成式】生成对抗网络 (GAN) 的概念
【5月更文挑战第4天】【AI 生成式】生成对抗网络 (GAN) 的概念
【AI 生成式】生成对抗网络 (GAN) 的概念
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
【AI 初识】递归神经网络 (RNN) 概念
【5月更文挑战第2天】【AI 初识】递归神经网络 (RNN) 概念
|
12天前
|
负载均衡 网络协议 应用服务中间件
【亮剑】在Linux中构建高可用性和高性能网络服务的负载均衡工具HAProxy、Nginx和Keepalived。
【4月更文挑战第30天】本文介绍了在Linux中构建高可用性和高性能网络服务的负载均衡工具HAProxy、Nginx和Keepalived。HAProxy是一个高性能的开源TCP和HTTP负载均衡器,适合处理大量并发连接;Nginx是一个多功能Web服务器和反向代理,支持HTTP、HTTPS和TCP负载均衡,同时提供缓存和SSL功能;Keepalived用于监控和故障切换,通过VRRP实现IP热备份,保证服务连续性。文中详细阐述了如何配置这三个工具实现负载均衡,包括安装、配置文件修改和启动服务,为构建可靠的负载均衡系统提供了指导。
|
14天前
|
数据中心
【专栏】交换机的电口和光口,包括它们的概念、特点、应用场景及区别。做网络的这个常识得懂!
【4月更文挑战第28天】本文详细探讨了交换机的电口和光口,包括它们的概念、特点、应用场景及区别。电口采用RJ45接口,适合短距离、低成本的局域网连接,而光口利用光纤进行高速、长距离传输,适用于大型数据中心和广域网。电口与光口的主要区别在于传输介质、距离、带宽、成本、抗干扰能力和安装维护难度。选择时需根据传输距离、带宽需求、成本及网络环境来决定。了解这些知识能帮助我们更好地设计和管理网络系统。
|
14天前
|
网络协议 网络安全 数据库
【专栏】网络端口的奥秘,包括基本概念、技术原理和实际应用
【4月更文挑战第28天】本文深入探讨了网络端口的奥秘,包括基本概念、技术原理和实际应用。网络端口是区分网络服务的抽象概念,与TCP/IP协议密切相关。端口号范围从0到65535,知名端口常分配给标准服务,如HTTP和FTP。TCP提供可靠的数据传输,而UDP则更高效。端口还涉及端口扫描、转发和映射等高级技术。在实际应用中,端口广泛用于Web服务器、数据库通信及网络安全。随着云计算和虚拟化的兴起,端口管理变得更为复杂,对IT专业人员的技能要求提高。理解并掌握网络端口对于提升个人技能和保障网络安全至关重要。
|
15天前
|
Rust 前端开发 安全
【专栏】WebAssembly将支持更多语言,结合低代码平台
【4月更文挑战第27天】WebAssembly是种虚拟机格式,用于在浏览器中运行编译后的C/C++、Rust等语言代码,提供高性能、高可移植性和安全性。其优势在于更快的执行速度、跨平台兼容及安全的沙箱环境。广泛应用在游戏开发、图形处理、计算机视觉等领域。未来,WebAssembly将支持更多语言,结合低代码平台,优化开发流程,同时应对优化编译和安全性的挑战,引领高性能网络应用新时代。