自己做优惠券网站,企业信息管理系统免费,手机上如何制作app,葫芦岛建设网站点击上方☝SpringForAll社区 轻松关注#xff01;及时获取有趣有料的技术文章本文来源#xff1a;http://yeming.me/2016/03/12/netty1/netty服务端代码分析服务端启动配置对于 ServerBootstrap#xff1a;ServerBootstrap继承于 AbstractBootstrap#xff0c;它从父类继承… 点击上方☝SpringForAll社区 轻松关注及时获取有趣有料的技术文章本文来源http://yeming.me/2016/03/12/netty1/netty服务端代码分析服务端启动配置对于 ServerBootstrapServerBootstrap继承于 AbstractBootstrap它从父类继承了 EventLoopGroupgroup ChannelFactoryextendsCchannelFactory自己新增了 EventLoopGroupchildGroup ChannelHandlerchildHandler。上面 b.group开始的链式代码就是初始化上面这些属性的值的。bossgroup和 workergroup可以看到都是 NioEventLoopGroup,可以理解成2个线程池。从 bossgroup中随便选一个作为 Reactor模型中的 acceptor监听客户端连接创建 socketChannel然后从 workergroup选取一个io线程来处理 socketChannel的读取事件。对于 NioEventLoopGroup和 NioEventLoop先看下类图可以看到 NioEventLoopGroup继承了 EventLoopGroupNioEventLoop实现了EventLoop,而EventLoop又继承自EventLoopGroup。eventloopgroup.next()又可以返回一个eventloop。可以看到EventLoop最终继承于线程池Executor。而最终NioEventLoopGroup又实现了EventLoop接下来我们还会分析下NioEventLoopGroup服务端注册感兴趣事件和监听端口注册感兴趣事件b.bind最终调用到AbstractBootstrop的以下方法final ChannelFuture initAndRegister() { this.group().register(channel);(中间省略) }这个this.group就是一开始设置的bossgroup(NioEventLoopGroup),看到这个方法基本可以想到这个应该是把channel注册到某个选择器上MultithreadEventLoopGrouppublic ChannelFuture register(Channel channel) { return this.next().register(channel); }上面的类图已经可以看出 NioEventLoopGroup继承自 MultithreadEventLoopGroup最终 this.next()又会返回 NioEventLoop所以也就是可以理解是把 channel注册到 NioEventLoop上(我们猜想 NioEventLoop可以想象成封装了一个 selector)this.next()返回 NioEventLoop继承于 SingleThreadEventLoopchannel.unsafe().register(this,promise);最终调用到 AbstractUnsafe的 register方法 eventLoop.execute(new OneTimeTask() { public void run() { AbstractUnsafe.this.register0(promise); } });这里通过 bossgroup启动一个线程最终调用到 protected void doRegister() throws Exception { boolean selected false; while(true) { try { this.selectionKey this.javaChannel().register(this.eventLoop().selector, 0, this); return; } catch (CancelledKeyException var3) { if(selected) { throw var3; } this.eventLoop().selectNow(); selected true; } } }监听端口可以看到第四张截图ChannelFuture regFuture this.initAndRegister();if(regFuture.cause() ! null) { return regFuture;} else if(regFuture.isDone()) { doBind0(regFuture, channel, localAddress, promise1); return promise1;} else { AbstractBootstrap.doBind0(regFuture, channel, localAddress, promise); } }); return promise;}可以看到 initAndRegister()这个方法就是上面我们说的注册感兴趣的事件。后面的 elseif和 else都有 dobind0 方法这个方法也是通过之前的线程池启动一个线程去监听一个端口。参考netty api说明http://www.boyunjian.com/javadoc/io.netty/netty-transport/4.0.0.Alpha7//io/netty/channel/DefaultChannelFuture.htmlNetty 4源码解析服务端启动http://blog.csdn.net/dc726/article/details/47858077Netty 4源码解析请求处理http://blog.csdn.net/dc726/article/details/48084367Netty系列之Netty线程模型(http://www.infoq.com/cn/articles/netty-threading-model?utmsourceinfoqutmmediumpopularlinks_homepage● Spring IOC流程清楚不聊聊看● 面试官ScheduleThreadPoolExecutor了解不● 配置中心只有Apollo么看看点评的Lion● 面试官说从源码角度说说Java线程池● JedisPool连接池相关配置● Hystrix初探● 别再关注删库跑路了谈谈数据库架构● 那些年非常火的MyCAT是什么● Java14带来了许多新功能● 关于烂代码的那些事(上)● 关于整洁代码的那些事(中)● 关于整洁代码的那些事(下)● 面试官说Spring AOP 实现原理给我说说● 深入理解JVM - 方法调用● Spring Boot神操作-多个数据源Service层封装● Lombok经常用但是你知道它的原理是什么吗