合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
Netty是一个基于Java的高性能网络应用框架,封装了Java NIO的复杂性,提供了简单而强大的网络编程API,使得开发者能够更方便地开发网络应用程序。
所以说学习Netty前先理解一下Java NIO是很有必要的,不然云里雾里的。
Netty有多优秀呢?包括但不限于以下几点
如果基于Java NIO开发一个成熟的应用,要非常注意如ByteBuffer内存泄漏、Channel注册连接、线程管理等问题。
而Netty能够更好地处理连接管理、线程模型和内存管理等方面的问题,提供更高的吞吐量和更低的延迟。
如果基于Java NIO写一个HTTP协议、Websocket协议,那我们需要考虑格式、编解码问题。
而Netty提供了丰富的扩展点,比如编解码器、处理器和拦截器等,开发人员可以通过不同的配置搭建HTTP、WebSocket、TCP和RTSP等协议,也可以轻松地添加编解码器,实现自定义协议。
Netty具有良好的容错能力和稳定性,能够处理各种网络故障和异常情况,并提供了多种容错和恢复机制,如断线重连和心跳机制等。
总的来说,开发人员在开发网络应用程序时,使用Netty能够更专注于业务逻辑。
下图为Netty所支持的功能
图片
为了进一步了解Netty,这里介绍一下Netty的前世今生。
目前有很多知名的项目都选用了Netty作为网络通信的基础,比如知名的RPC框架Dubbo、gRPC,消息队列Kafka、RocketMQ,搜索引擎Elasticsearch等,所以当学习了解这些项目时,Netty会作为一个加分项。
因为Netty是基于Java NIO封装的,更加的抽象,要使用Netty进行开发,必须要熟悉Netty中的几个核心组件,下面一一介绍:
ChannelInboundHandler:用于处理入站事件,例如连接建立、数据读取等。
ChannelOutboundHandler:用于处理出站事件,例如数据写入、连接关闭等。
SimpleChannelInboundHandler:继承自ChannelInboundHandler,简化了消息处理的逻辑。
SimpleChannelOutboundHandler:继承自ChannelOutboundHandler,简化了消息发送的逻辑。
HttpServerCodec:它负责处理 HTTP 请求和响应的编解码。
HttpObjectAggregator:将 HTTP 请求的多个部分合并成一个完整的 FullHttpRequest。
WebSocketServerProtocolHandler:处理 WebSocket 协议的握手和帧的编解码。
下面以HTTP协议为例,用Netty编写一个HTTP服务器。
在这之前,我们先用上篇文章的NIOServer接收一下浏览器的请求,大概是这样的:
HTTP请求格式
可以看到接收到了一个HTTP请求的报文数据,有请求行、请求头和请求主体,这时候也能看到浏览器返回的响应是:ERR_INVALID_HTTP_RESPONSE,发送的响应无效。
为什么?这是因为NIOServer中的输出格式HTTP协议不认识。
所以如果使用Java NIO实现一个HTTP服务器,需要处理很多的工作,但是如果用Netty实现一个HTTP服务器非常简单,直接上代码:
Netty实现HTTP服务器
运行这个示例后,你可以使用浏览器或者其他工具发送HTTP请求到 http://localhost:8080 ,一个HTTP服务器就诞生了,非常简单。
接下来对代码进行讲解:
代码中的b.group(bossGroup, workerGroup)意思是有两个线程组会去处理服务器中的IO事件,bossGroup只用一个线程来专门负责监听服务端的端口,接收客户端连接请求,并将连接分配给 workerGroup 中的 EventLoop 进行处理。
workerGroup负责处理已接收的连接的 I/O 事件,将请求解码、处理业务逻辑以及发送响应等操作都交给 EventLoop 来处理。这个是典型的主从Reactor模式,通过将连接的接收和处理分离到不同的线程池中,可以提高网络应用程序的性能,模型如下。
图片
NioServerSocketChannel是指定服务器的Channel类型,还有NioDatagramChannel等类型,取决于应用场景。
.handler(new LoggingHandler(LogLevel.INFO))是为bossGroup指定一个通道处理器,记录进出 Channel 的数据流,将相关信息打印到日志中,便于排查。
.childHandler()则是为workerGroup中的EventLoop配置处理器,比如请求解码、处理业务逻辑以及发送响应。
ChannelPipeline就是添加具体的通道处理器,代码中的HttpServerCodec、HttpObjectAggregator处理器都是用来处理HTTP请求的编解码,SimpleChannelInboundHandler则是拿到经过多个处理器的数据流后进行业务逻辑及响应。
Netty是一个非常优秀的、强大的、高性能的网络通信框架,在这个互联网飞速发展的时代,我们需要了解并且使用像这样的优秀的框架,帮助我们快速开发应用,在使用它的同时要知其原理,也可以在业务中进行创新,就像Dubbo、gRPC、Zookeeper一样采用Netty成为与其一样优秀的框架。
TOP