netty
netty入门
服务端
ServerBootstrap() : 启动器,负责组装netty组件,启动服务器
NioEventLoopGroup() : EventLoop是一个selector加上一个thread就是一个eventloop,即循环处理可读可写事件,既然是group就是组的意思,里面有BossEventLoop和WorkerEventLoop,分别处理accept和读写的事件
NioServerSocketChannel() : 选择服务器ServerSocketChannel的实现,OIO,BIO
childHandle:决定了worker(child)能做哪些事情
channelInitializer:channel代表和客户端进行数据读写的通道, Initializer初始化,负责添加别的handler
StringDecoder():将ByteBuf进行解码,转换成字符串
ChannelInboundHandleAdapter:自定义handler
bind:绑定监听端口
客户端
Bootstrap() : 启动类
StringEncoder() : 编码器
connect:链接哪个服务器
sync():阻塞方法,直到连接建立
writeAndFlush():向服务器发送数据
channel:就像数据的通道
msg:流动的数据
handle:数据的处理工序
pipeline:工序有多道,就是流水线
handle分为Inbound 和 Outbound,入站和出站
eventloop:干活的工人,处理数据
-
工人可以管理多个channel 的 io操作,且一个工人只要负责了一个channel,就会绑定,负责到底
-
一个工人既可以处理io操作,也可以处理普通任务
-
工人按照pipeline的顺序,按序执行handle
组件
EventLoop
事件循环对象
eventloop本质上是一个单线程执行器(同时维护了一个selector),里面有run方法源源不断地处理Channel里面的IO事件
由于它继承过一个线程池的类,因此包含所有的线程池的方法
并且还包含判断当前线程是否属于此EventLoop的方法和查看自己属于哪个EventLoopGroup
事件循环组
EventLoopGroup是一组EventLoop,Channel会调用EventLoopGroup中的register方法来绑定其中一个eventloop,后续这个channel的IO事件都由此Eventloop执行(保证了IO的线程安全)
如何实现handle换人,源码分析
static void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) { final Object m = next.pipeline.touch(ObjectUtil.checkNotNull(msg, "msg"), next); // 下一个handle的事件循环是否和这个事件循环是一个线程
EventExecutor executor = next.executor();//返回下一个handle的eventLoop
// 是,直接调用 if (executor.inEventLoop()) { next.invokeChannelRead(m); }
// 不是,将要执行的代码作为任务提交给下一个事件循环处理
else { executor.execute(new Runnable() { // 如果是外部线程,则提交给异步任务队列 @Override public void run() { next.invokeChannelRead(m); } }); } }
channel
channel的主要作用:
-
close()关闭chanel
-
closeFuture()处理channel的关闭
{
如果想要在关闭channel后执行一些操作会发现一个问题,那就是因为close方法也是异步调用的方法, 这就导致了,写在close方法后的操作不是在真正关闭后执行的,因为close异步的,执行close后会立马 执行之后的代码,达不到想要的效果,因此我们需要用closedFuture对象,调用sync方法解决
}
其中sync():同步等待channel关闭
{
如果不适用sync方法会出现问题,因为connect方法是异步非阻塞的,main线程调用了connect, 但是实际执行connect的是nio线程,没有sync方法,main方法直接去准备拿channel了,但是那时 候connect还没执行完,sync会阻塞当前线程,直到nio线程执行完毕
}
addlistener:异步等待channel关闭
-
pipeline()添加处理器
-
write:写入数据
-
writeAndFlush:将数据写入并刷出
*带有future,promise的类型都是和 异步方法配套使用的
*异步提升的是吞吐量而不是缩短响应时间