Netty框架详解:高性能、异步事件驱动的秘密

需积分: 0 1 下载量 137 浏览量 更新于2024-06-25 收藏 360KB DOCX 举报
"Netty是一个Java开发的高性能、异步事件驱动的网络应用程序框架,用于构建高度可定制的服务器和客户端。它封装了NIO,提供了简单易用的API,适用于处理高并发和低延迟的网络应用。Netty以其优秀的性能、稳定性、活跃的社区支持以及丰富的功能集成为许多大型项目的首选通信框架。例如,阿里巴巴的Dubbo和RocketMQ都采用了Netty作为底层通信组件。Netty的高性能体现在其IO线程模型、内存零拷贝、内存池设计、串行化处理读写和高性能序列化协议等多个方面。此外,BIO、NIO和AIO在处理I/O的方式上有所不同,BIO是阻塞的、面向流的,NIO是基于缓冲区、非阻塞的,而AIO则是异步的,由操作系统通知应用进行处理。" Netty作为一个强大的网络通信框架,其特点和优势显著: 1. **高并发**:Netty利用NIO(非阻塞IO)的特性,使得在处理大量并发连接时能保持高性能,减少线程资源的消耗。 2. **传输快**:Netty实现了内存零拷贝技术,减少了数据在内核空间和用户空间之间的多次拷贝,提升了传输效率。 3. **封装性**:Netty封装了NIO的复杂性,提供了一套易于理解和使用的API,简化了开发过程。 4. **性能高**:Netty经过精心优化,综合性能优于其他同类NIO框架。 5. **稳定性**:Netty修复了NIO的已知问题,确保了框架的稳定性和可靠性。 6. **社区活跃**:Netty有一个活跃的开发者社区,频繁更新版本,快速响应和修复问题。 Netty的应用场景广泛,包括但不限于: - 分布式服务框架,如阿里巴巴的Dubbo,使用Netty作为基础的通信组件,保证了服务间的高效通信。 - 消息中间件,如RocketMQ,也依赖Netty来实现高效的网络通信。 Netty的高性能体现在多个层面: - **IO线程模型**:采用同步非阻塞方式,少量线程就能处理大量并发连接。 - **内存零拷贝**:通过DirectByteBuffer减少不必要的内存拷贝,提高内存利用率。 - **内存池设计**:通过内存池管理内存分配,减少内存碎片,提高性能。 - **串行化处理读写**:避免了因同步导致的性能开销,提高了处理效率。 - **高性能序列化协议**:支持如protobuf等高效的序列化协议,减小数据传输的开销。 而BIO、NIO和AIO的主要区别在于它们处理I/O请求的方式: - **BIO**( Blocking I/O)是传统的阻塞式IO,每个连接都需要一个单独的线程处理,资源消耗较高。 - **NIO**(Non-blocking I/O)引入了多路复用器,一个线程可以处理多个连接,当连接上有I/O事件时才处理,提高了并发能力。 - **AIO**(Asynchronous I/O)或称NIO.2,允许操作系统在完成I/O操作后通知应用,进一步减少了线程等待的时间。 理解这些概念对于深入学习和使用Netty以及理解网络通信的底层机制至关重要。

C:\Windows\system32\cmd.e:x + zation(InitDestroyAnnotationBeanPostProcessor.java:136) ...26 common frames omittedCaused by: java.net.BindException: Address already in use: bindsun.nio.ch.Net.bind(Native Method)atatsun.nio.ch.Net.bind(Net.java:433)at sun.nio.ch.Net.bind(Net.java:425)sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)atat io .grpc.netty.shaded. io.netty.channel.socket.nio.NioServerSocketchannel.doBind(NioServerSocketchannel.java:13at io . grpc.netty.shaded.io.netty.channel.Abstractchannel$AbstractUnsafe.bind(Abstractchannel.java:551)at io .grpc.netty.shaded. io.netty.channel.DefaultchannelPipeline$HeadContext.bind(DefaultchannelPipeline.java:134at io .grpc.netty.shaded.io.netty.channel.AbstractchannelHandlerContext.invokeBind(AbstractChannelHandlerContextat io.grpc.netty.shaded.io.netty.channel.AbstractchannelHandlerContext.bind(AbstractchannelHandlerContext.java:4at io.grpc .netty.shaded.io.netty.channel.Defaultchannelpipeline.bind(DefaultchannelPipeline.java:985)atio.grpc.nettyshaded.io.netty.channel.AbstractChannel.bind(Abstractchannel.java:247)atio.grpc.netty.shaded.io.netty..bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:344)at io.grpc.netty.shaded, io.netty.util,concurrent.AbstractEventExecutor,safeExecute(AbstractEventExecutor.java:16 2) 0 java:503) 88) at io .grpc.netty,shaded. io.netty.util.concurrent .singleThreadEventExecutor.runAllTasks(SingleThreadEventExecutorio.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518)io.grpc.netty..shaded.at io.grpc.netty.shaded. io.netty.util.concurrent ,singleThreadEventExecutor$6.run(SingleThreadEventExecutor .javaat io.grpc.netty.shaded.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)at io.grpc.netty.shaded. io.netty.util.concurrent .FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)at java.lang.Thread.run(Thread.iava:748) at java:510) 1044)

2025-03-11 上传
519 浏览量

2023-07-14 15:19:01.215 WARN 7308 --- [sson-netty-2-15] io.netty.util.concurrent.DefaultPromise : An exception was thrown by org.redisson.misc.RedissonPromise$$Lambda$888/0x00000008008f7440.operationComplete() java.lang.NullPointerException: null 2023-07-14 15:19:01.216 ERROR 7308 --- [sson-netty-2-15] o.r.c.SentinelConnectionManager : Can't execute SENTINEL commands on /172.24.107.11:26379 org.redisson.client.RedisException: ERR No such master with that name. channel: [id: 0x2d66827d, L:/172.23.9.103:46812 - R:/172.24.107.11:26379] command: (SENTINEL SLAVES), params: [mymaster] at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:365) ~[redisson-3.13.3.jar:3.13.3] at org.redisson.client.handler.CommandDecoder.decodeCommand(CommandDecoder.java:196) ~[redisson-3.13.3.jar:3.13.3] at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:134) ~[redisson-3.13.3.jar:3.13.3] at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:104) ~[redisson-3.13.3.jar:3.13.3] at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:501) ~[netty-codec-4.1.51.Final.jar:4.1.51.Final] at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366) ~[netty-codec-4.1.51.Final.jar:4.1.51.Final] at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) ~[netty-codec-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final] at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.51.Final.jar:4.1.51.Final] at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.51.Final.jar:4.1.51.Final] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.51.Final.jar:4.1.51.Final] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na] 解决方法

268 浏览量