![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
netty
文章平均质量分 69
netty梳理
芒骁
用代码改变世界
展开
-
Netty wakeup 唤醒的哲学
场景: NioEventLoop绑定的Selector开始工作执行select方法Selector#select 所在线程为NioEventLoop的工作线程执行select时会将NioEventLoop 的wakenUp原子更新为false进入select的逻辑首先从一个问题开始——Nio的空轮询问题这是由于底层的IO问题导致明明没有请求要处理反而唤醒了selectorNio 的空轮询问题Nio 的空轮转问题JDK空轮询Bug出现原因及解决方法为了解决NIO的空轮询问题,Netty转载 2022-08-10 12:19:03 · 157 阅读 · 0 评论 -
DefaultSelectStrategy NIOEventLoop执行策略
参考链接:selectStrategy处理逻辑如果 hasTasks 为 true,表示当前 NioEventLoop 线程存在异步任务的情况下,则调用 selectSupplier.get(),否则直接返回 -1。转载 2022-08-10 11:43:51 · 148 阅读 · 0 评论 -
Netty 线程工作机制—— NioEventLoop
这里会调用当前NioEventLoop工作,执行 eventLoop.execute,通过它的方法继承可以看到其实是使用SingleThreadEventLoop#execute方法NioEventLoop的父类体系很庞大,很多事情都有专门的父类去执行,比如这里的execute通过SingleThreadEventLoop去实现。......原创 2022-08-10 10:52:25 · 701 阅读 · 0 评论 -
Netty inEventLoop方法的思想延伸
首先来看最常用的场景:NioEventLoop的父类SingleThreadEventExecutor处理刚刚接受的任务时这里的boolean型 inEventLoop 可能有两种情况为false:NioEventLoop第一次使用,因为它在实例化的过程中是没有初始化 thread这个属性的,所以thread为null,无论和哪个线程比较都不会相等。(因为NioEventLoop它此时还没有创建工作线程)以下第一次接受任务(向Selector注册Channel的任务),boolean型 ....原创 2022-08-09 18:37:33 · 283 阅读 · 0 评论 -
Netty selector的运行
终于Selector要开始工作了。NioEventLoop#select private void select(boolean oldWakenUp) throws IOException { //拿到selector Selector selector = this.selector; try { int selectCnt = 0; long currentTimeNanos = System.nan..原创 2022-07-27 12:08:57 · 458 阅读 · 0 评论 -
Netty 总结文
aa原创 2022-05-13 22:05:22 · 155 阅读 · 0 评论 -
Netty 服务端建立连接
具体的准备细节可以参考ServerBootstrap工作场景我们直接看 doBind0DefaultPromise#await原创 2022-02-16 11:33:12 · 264 阅读 · 0 评论 -
NioEventLoop工作过程
aa’原创 2022-02-16 11:31:20 · 352 阅读 · 0 评论 -
Netty Selector的工作过程
NioEventLoop#openSelector Selector准备的开端 private Selector openSelector() { final AbstractSelector selector; try { selector = this.provider.openSelector(); //1. 创建一个平台级的Selector实现类 } catch (IOException var7) {原创 2022-02-16 11:30:58 · 138 阅读 · 0 评论 -
AbstractChannelHandlerContext
看到这张图就应该理解了ChannelHandler和PipeLine的关系,在初始化DefaultChannelPipeLine时我们就会增加两个TailContext和HeadContext,它们都是AbstractChannelHandlerContext的实现类,在我们自定义ChannelHandler并想将它插入到PipeLine处理请求的过程中时,就会创建一个对应的AbstractChannelHandlerContext的实现类来加入,而DefaultChannelHandlerContext.原创 2021-12-28 10:42:26 · 333 阅读 · 0 评论 -
Netty 准备阶段一 BossGroup和WorkerGroup的初始化
aa原创 2022-01-15 15:54:51 · 467 阅读 · 0 评论 -
Netty 准备阶段二 Channel的初始化
通过ServerBootStrap 的父类AbstractBootstrap#channel() 方法实现涉及组件:ChannelFactory、子类ReflectiveChannelFactory最终初始化了一个ReflectiveChannelFactory对象,通过class属性封装了类NioServerSocketChannel。原创 2022-01-16 10:54:54 · 377 阅读 · 0 评论 -
服务端 ServerBootstrap
Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 是服务端启动引导类。............原创 2021-12-27 18:10:52 · 5070 阅读 · 0 评论 -
Netty 向Selector注册Channel
选择线程池中的一个线程EventExecutor类型,现在是它的子类SingThreadEventLoop原创 2021-12-28 10:45:18 · 132 阅读 · 0 评论 -
DefaultChannelPipeline
DefaultChannelPipeline的构造器需要传入一个Channel,而这个Channel其实就是我们实例化的NioSocketChannel对象,DefaultChannelPipeline会将这个NioSocketChannel对象保存在Channel属性中。DefaultChannelPipeline中还有两个特殊的属性,即Head和Tail,这两个属性是双向链表的头和尾。其实在DefaultChannelPipeline中维护了一个以AbstractChannelHandlerCont..原创 2021-12-28 10:42:12 · 900 阅读 · 0 评论 -
NioEventLoopGroup
构造方法几个入参:int nThreads 线程数量Executor executor 线程池SelectorProvider selectorProvider 这个应该比较熟悉了,可以创建selectorThreadFactory threadFactory 线程工厂SelectStrategyFactory selectStrategyFactory select的策略RejectedExecutionHandler rejectedExecutionHandler 拒绝策略Ev..原创 2021-12-28 10:42:45 · 884 阅读 · 0 评论 -
MultithreadEventLoopGroup
如果我们传入的线程数nThreads是0,那么Netty会设置默认的线程数DEFAULT_EVENT_LOOP_THREADS,而这个默认的线程数是怎么确定的呢? private static final int DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2))..原创 2021-12-28 10:43:56 · 250 阅读 · 0 评论 -
客户端发起连接 Bootstrap#connect
private ChannelFuture doResolveAndConnect0(final Channel channel, SocketAddress remoteAddress, final SocketAddress localAddress, final ChannelPromise promise) { try { EventLoop eventLoop = channel.eventLoop(); Addre...转载 2021-12-28 10:46:30 · 606 阅读 · 0 评论 -
NioServerSocketChannel
在netty Bootstrap启动之后会执行 channel,此时将NioServerSocketChannel的Class对象加入到BootStrap 的ChannelFactory之中,这个ChannelFactory是ReflectiveChannelFactory类型的但是什么时候真正使用该Channel呢?这里调用ReflectiveChannelFactory的首先执行 newSocket方法......原创 2021-12-27 18:15:54 · 882 阅读 · 0 评论 -
ReflectiveChannelFactory
只有一个重要方法newChannel() 在合适的实际创建Channel的实例(1)Bootstrap中的ChannelFactory实现类是ReflectiveChannelFactory。(2)通过channel()方法创建的Channel具体类型是NioSocketChannel。Channel的实例化过程其实就是调用ChannelFactory的newChannel()方法,而实例化的Channel具体类型又和初始化Bootstrap时传入的channel()方法的参数相关。因此对于客户端的.原创 2021-12-27 18:15:34 · 98 阅读 · 0 评论