点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章

本文来源:http://yeming.me/2016/03/12/netty1/

netty服务端代码分析

服务端启动配置

对于 ServerBootstrapServerBootstrap继承于 AbstractBootstrap,它从父类继承了 EventLoopGroupgroupChannelFactoryextendsC>channelFactory,自己新增了 EventLoopGroupchildGroupChannelHandlerchildHandler。上面 b.group开始的链式代码就是初始化上面这些属性的值的。

bossgroupworkergroup:可以看到都是 NioEventLoopGroup,可以理解成2个线程池。从 bossgroup中随便选一个作为 Reactor模型中的 acceptor,监听客户端连接,创建 socketChannel,然后从 workergroup选取一个io线程来处理 socketChannel的读取事件。

对于 NioEventLoopGroupNioEventLoop:先看下类图

可以看到 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注册到某个选择器上

MultithreadEventLoopGroup

public 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);最终调用到 AbstractUnsaferegister方法

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()这个方法就是上面我们说的注册感兴趣的事件。后面的 elseifelse都有 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?utmsource=infoq&utmmedium=popularlinks_homepage

● Spring IOC流程清楚不?聊聊看

● 面试官:ScheduleThreadPoolExecutor了解不?

● 配置中心只有Apollo么?看看点评的Lion

● 面试官说从源码角度说说Java线程池

● JedisPool连接池相关配置

● Hystrix初探

● 别再关注删库跑路了,谈谈数据库架构

● 那些年非常火的MyCAT是什么?

● Java14带来了许多新功能

● 关于烂代码的那些事(上)

● 关于整洁代码的那些事(中)

● 关于整洁代码的那些事(下)

● 面试官说Spring AOP 实现原理给我说说

● 深入理解JVM - 方法调用

● Spring Boot神操作-多个数据源Service层封装

● Lombok经常用,但是你知道它的原理是什么吗?

服务端_说说Netty服务端启动流程相关推荐

  1. php分布式微服务开发_分布式微服务架构

    学习.跳槽涨薪?请关注 随着业务的不断发展, 用户体量的快速扩张. 从单体/垂直架构转移到分布式/微服务架构是自然而然的选择. 01 分布式理论 分布式理论是分布式系统的基础, 在任何情况下分布式系统 ...

  2. office移动端_微软推出移动端office三合一版 相比WPS哪个更好?我对比了一下

    最近,微软终于正式上线了其在移动端的三合一office客户端,摆脱了以往想用office办公软件需要分别下载word.excel.powerpoint三个独立应用的情况.而老对手金山早已在移动端深耕多 ...

  3. 服务端_多面手之服务端测试

    阿里 qa 导读:久违了,夏去秋至,阿里巴巴技术质量新人手册又开始更新啦~ 上期我们给大家带来的是成为测试多面手中的移动测试篇,今天我们继续和大家讲讲服务端测试. 服务端测试 服务端测试有两种:一种是 ...

  4. netty 大端小端_深入浅出: 大小端模式

    Writer      :李强强 一.什么是大小端? 大小端在计算机业界,Endian表示数据在存储器中的存放顺序.百度百科如下叙述之: 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节 ...

  5. 中国重汽微服务管理_干货 | 微服务架构下 Spring Cloud OAuth2 通用权限管理系统

    点击蓝色"泥瓦匠BYSocket",关注我哟 加个"星标",不忘文末签到哦 作者:王杰 项目地址 Gitee: https://gitee.com/log4j/ ...

  6. python 微服务 网关_建设微服务API网关的一些实践

    随着这些年微服务的流行,API网关已经成为微服务架构中不可或缺的一环.一方面它承担着服务对外的唯一门户,一方面它提取了许多应用的共性功能. 整体架构 我们的Api网关目前的架构如上所示,可以看到Api ...

  7. mysql是大端小端_大端和小端 - HackerVirus - 博客园

    在计算机中是以字节为单位,每个地址对应一个字节,一个字节8bit.在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过siz ...

  8. 银行网点服务认证_银行营业网点服务国家标准达标单位

    序号银行营业网点名称序号银行营业网点名称1中国建设银行股份有限公司贵州省分行26韶山光大村镇银行股份有限公司韶润支行2临洮县金城村镇银行营业部27安徽太和农村商业银行股份有限公司镜湖支行3临洮县金城村 ...

  9. java移动文件导致tomcat死掉_原 netty导致tomcat假死

    一.系统需求: 保证后台系统在大并发下正常处理每一个业务连接请求. 二.运作方式: Netty+tomcat.在tomcat的web.xml配置文件中配置一个Listener类用来在tomcat初始化 ...

最新文章

  1. node.js php模板,node.js中EJS 模板的使用教程
  2. Git学习系列(二)创建本地仓库及文件操作
  3. 对象不支持“abigimage”属性或方法
  4. python柱状图分析代码
  5. USTC English Club Note20171013(2)
  6. shell实现简单的进程监控脚本
  7. java的方法是什么用,Java中的本机方法是什么?它们应该在何处使用?
  8. 汇编程序中,字符数据和ASCII的对应关系
  9. 都会五星回评,欢迎留下地址-博客之星
  10. LeetCode 1431. 拥有最多糖果的孩子
  11. 富文本处理NSMutableAttributedString
  12. J2EE之初识JSP
  13. 《南溪的目标检测学习笔记》——数据集制作(legacy)
  14. 任务02——安装 Intellj IDEA,编写一个简易四则运算小程序,并将代码提交到 GitHub...
  15. 常用公共数据集----数据获取
  16. matlab 单相整流电路,基于MATLAB的单相桥式整流电路研究
  17. ISBN(国际标准书号)
  18. Session 'app': Error Launching activity
  19. 手机按键精灵学习 —— 基础知识
  20. FMM和BMM的python代码实现

热门文章

  1. C++远航之封装篇——数据的封装
  2. kali linux 2.0 ssh,Kali 2.0使用SSH进行远程登录(示例代码)
  3. 网络流24题 洛谷 3355 骑士共存
  4. CentOS经常使用文件操作命令[百度博客搬家]
  5. 直击中关村创业大街,新街头霸王来了
  6. SQL强化(二) 在Oracle 中写代码
  7. Service Worker,Web Worker,WebSocket的对比
  8. window.cookie
  9. 迪美特TVZ8双核智能高清播放器 在电视上编程不是梦
  10. adb logcat 基本用法