Netty 是什么
-
netty 是一个基于nio的客户、服务器端编程框架,
-
netty提供异步的,事件驱动的网络应用程序框架和工具,可以快速开发高可用的客户端和服务器。
-
netty是基于nio的,它封装了jdk的nio,让我们使用起来更加方法灵活
为什么要用 Netty?
-
跨平台与兼容性
-
Netty提供了自己的ByteBuffer实现
-
压碎著名的Epoll缺陷
Netty 应用场景
-
高性能的 RPC 框架(Hadoop,Dubbo)
-
网络游戏
Netty 核心组件有哪些?分别有什么作用?
-
EventLoop:每个客户端的socket都会注册到一个EventLoop上,由这个EventLoop负责处理该channel的所有IO事件和IO操作。
-
Event:
ChannnelActive事件(建立连接),
ChannelInActive事件(连接关闭),
ChannelRead事件(收到消息),
ChannelReadComplete事件(读完成),
ChannelRegistered事件(channel被注册到EventLoop)
ChannelUnregistered事件(channel从EventLoop注销),
ChannelWritabilityChanged 事件(可写状态改变),
ExceptionCaught事件(出现异常),
UserEventTriggerd事件(收到一个用户自定义事件) -
Channel:netty在socket上的一种封装和抽象。
-
ChannelPipeline:拦截器链模式,负责处理该channel的所有入站事件和出站操作
-
ChannelHandler:处理IO事件,拦截IO事件,把IO事件、IO操作传递给当前ChannelPipeline中的下一个Handler.
-
ChannelContextHandler:和ChannelPipe以及其他ChannelHandler交互。向上或向下传递事件
EventloopGroup 和 EventLoop
-
EventloopGroup:
一般创建两个,一个用于处理客户端连接,一个用于处理I/O流操作 -
EventLoop
处理I/O读写
防止并发操作导致的锁竞争(系统Task)
处理定时任务
Bootstrap 和 ServerBootstrap
-
Bootstrap:
客户端入口,
指定Channel,
设置SocketChannel选项,
设置处理器,
连接指定地址 -
ServerBootstrap:
服务端入口,
指定channel,
设置处理器,
配置ServerSocketChannle,
配置子通道SocketChannel,
绑定并监听某端口
NioEventLoopGroup 默认的构造函数会起多少线程?
DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(“io.netty.eventLoopThreads”, NettyRuntime.availableProcessors() * 2));
-
bossGroup 中只有一个线程
-
workerGroup中默认是 CPU 核心数乘以2
Netty 线程模型
-
Netty通过Reactor模型基于多路复用器接收并处理用户请求
-
boss线程池的线程负责处理请求的accept事件,封装后交给work线程池
-
work线程池负责请求的read和write事件,由对应的Handler处理
Netty 服务端和客户端的启动过程
-
启动ServerBootstrap/Bootstrap
-
指定监听组(boosGroup服务端)和工作组workGroup
-
指定NIO模式
-
初始化Channel
-
连接后的读写逻辑
-
监听/连接 ip端口
Netty 长连接、心跳机制
-
使用IdleStateHandler 超时机制来实现心跳和重连
-
通过三个参数(段时间内未接受和发送数据,段时间内未接收数据,段时间内未发送数据)来执行指定方法
Netty 零拷贝
-
零拷贝的应用程序要求内核直接将数据从磁盘文件拷贝到套接字(Socket),而无须通过应用程序。
-
零拷贝不仅提高了应用程序的性能,而且减少了内核和用户模式见上下文切换
Netty的特点?
-
高并发(NIO)
-
传输快(零拷贝)
-
封装好(封装NIO细节,提供易用API)
-
解决了Epoll Bug(Selector 空轮询,最终导致 CPU 100%)
(巨坑)
在windows10环境下使用NIO/Netty等各种socket连接时,设置端口复用貌似没什么用,断开的端口还是会处于timeout状态(待解决)