Netty in action学习笔记
1.Netty——异步和事件驱动
# 查看本地线程栈大小,我本地是8192,即8M,进程栈不会大于线程栈的2倍
ulimit -s
-
异步和可伸缩性,是netty的特色,正因为一步,所以才提高了可伸缩性
-
future虽好,但是缺乏了事件通知机制,导致我们不得不手动检查或者一直阻塞到事件完成,ChannelFuture通过注册一个或多个ChannelFutureListener实例,实现了事件监听
-
因为netty是异步的,所以Channel的操作会返回ChannelFuture,一点也不奇怪,而channelFuture又支持能够直接获取channel,
2.你的第一款应用程序
OioEventLoopGroup还不太理解
答:阻塞传输
channelRead0是SimpleChannelInboundHandler类的
3.Netty的组件和设计
Channel是注册到Event Loop上的,一个channel在它的生命周期内只注册一个EventLoop,一个EventLoop在它的生命周期内之和一个Thread绑定。
但是反过来,一个Thread对应多个EventLoop,一个EventLoop可能会被分配给一个或者多个Channel。
这样的设计,共享线程资源,又避免了channel的线程间数据共享。
4.传输
socket是用来干啥的?
进行客户端与服务端传输的,
创建socket你需要干什么?
绑定端口号
channel是线程安全的,在多线程环境下,可以使用同一个线程写数据。
netty支持的传输
- nio
- epoll
- oio
- local
- embedded
5.ByteBuf
直接缓冲区的缺点:分配和释放都比较昂贵
代码层面的理解,你需要分配一个新的数组,然后将数据copy到直接缓冲区
我们可以认为,直接缓冲区比非直接缓冲区的速度快一点,但是这个速度差距不会非常大,通常在1.5倍以内,也就是说,差距不会大于50%,而且,这个数据会因为测试出现一定的随机性,大小关系可能发生变化。
缓冲区的分类
- 堆缓冲区(非直接缓冲区)
- 直接缓冲区
- 复合缓冲区(jdk ByteBuffer所不具备的)
英文学习
composite:复合的,复合型
6.ChannelHandler和ChannelPipeline
channel的生命周期形态顺序
ChannelRegistered——》ChannelActive——》ChannelInactive——》ChannelUnregistered
ChannelPromise配合ChannelOutboundHandler使用,定义了一些可写的方法,保证ChannelFuture不可变。