服务端_说说Netty服务端启动流程
本文来源:http://yeming.me/2016/03/12/netty1/
netty服务端代码分析
服务端启动配置
对于 ServerBootstrap
:ServerBootstrap
继承于 AbstractBootstrap
,它从父类继承了 EventLoopGroupgroup
, ChannelFactoryextendsC>channelFactory
,自己新增了 EventLoopGroupchildGroup
, ChannelHandlerchildHandler
。上面 b.group
开始的链式代码就是初始化上面这些属性的值的。
bossgroup
和 workergroup
:可以看到都是 NioEventLoopGroup
,可以理解成2个线程池。从 bossgroup
中随便选一个作为 Reactor
模型中的 acceptor
,监听客户端连接,创建 socketChannel
,然后从 workergroup
选取一个io线程来处理 socketChannel
的读取事件。
对于 NioEventLoopGroup
和 NioEventLoop
:先看下类图
可以看到 NioEventLoopGroup
继承了 EventLoopGroup
NioEventLoop实现了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);
最终调用到 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?utmsource=infoq&utmmedium=popularlinks_homepage
● Spring IOC流程清楚不?聊聊看
● 面试官:ScheduleThreadPoolExecutor了解不?
● 配置中心只有Apollo么?看看点评的Lion
● 面试官说从源码角度说说Java线程池
● JedisPool连接池相关配置
● Hystrix初探
● 别再关注删库跑路了,谈谈数据库架构
● 那些年非常火的MyCAT是什么?
● Java14带来了许多新功能
● 关于烂代码的那些事(上)
● 关于整洁代码的那些事(中)
● 关于整洁代码的那些事(下)
● 面试官说Spring AOP 实现原理给我说说
● 深入理解JVM - 方法调用
● Spring Boot神操作-多个数据源Service层封装
● Lombok经常用,但是你知道它的原理是什么吗?
服务端_说说Netty服务端启动流程相关推荐
- php分布式微服务开发_分布式微服务架构
学习.跳槽涨薪?请关注 随着业务的不断发展, 用户体量的快速扩张. 从单体/垂直架构转移到分布式/微服务架构是自然而然的选择. 01 分布式理论 分布式理论是分布式系统的基础, 在任何情况下分布式系统 ...
- office移动端_微软推出移动端office三合一版 相比WPS哪个更好?我对比了一下
最近,微软终于正式上线了其在移动端的三合一office客户端,摆脱了以往想用office办公软件需要分别下载word.excel.powerpoint三个独立应用的情况.而老对手金山早已在移动端深耕多 ...
- 服务端_多面手之服务端测试
阿里 qa 导读:久违了,夏去秋至,阿里巴巴技术质量新人手册又开始更新啦~ 上期我们给大家带来的是成为测试多面手中的移动测试篇,今天我们继续和大家讲讲服务端测试. 服务端测试 服务端测试有两种:一种是 ...
- netty 大端小端_深入浅出: 大小端模式
Writer :李强强 一.什么是大小端? 大小端在计算机业界,Endian表示数据在存储器中的存放顺序.百度百科如下叙述之: 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节 ...
- 中国重汽微服务管理_干货 | 微服务架构下 Spring Cloud OAuth2 通用权限管理系统
点击蓝色"泥瓦匠BYSocket",关注我哟 加个"星标",不忘文末签到哦 作者:王杰 项目地址 Gitee: https://gitee.com/log4j/ ...
- python 微服务 网关_建设微服务API网关的一些实践
随着这些年微服务的流行,API网关已经成为微服务架构中不可或缺的一环.一方面它承担着服务对外的唯一门户,一方面它提取了许多应用的共性功能. 整体架构 我们的Api网关目前的架构如上所示,可以看到Api ...
- mysql是大端小端_大端和小端 - HackerVirus - 博客园
在计算机中是以字节为单位,每个地址对应一个字节,一个字节8bit.在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过siz ...
- 银行网点服务认证_银行营业网点服务国家标准达标单位
序号银行营业网点名称序号银行营业网点名称1中国建设银行股份有限公司贵州省分行26韶山光大村镇银行股份有限公司韶润支行2临洮县金城村镇银行营业部27安徽太和农村商业银行股份有限公司镜湖支行3临洮县金城村 ...
- java移动文件导致tomcat死掉_原 netty导致tomcat假死
一.系统需求: 保证后台系统在大并发下正常处理每一个业务连接请求. 二.运作方式: Netty+tomcat.在tomcat的web.xml配置文件中配置一个Listener类用来在tomcat初始化 ...
最新文章
- node.js php模板,node.js中EJS 模板的使用教程
- Git学习系列(二)创建本地仓库及文件操作
- 对象不支持“abigimage”属性或方法
- python柱状图分析代码
- USTC English Club Note20171013(2)
- shell实现简单的进程监控脚本
- java的方法是什么用,Java中的本机方法是什么?它们应该在何处使用?
- 汇编程序中,字符数据和ASCII的对应关系
- 都会五星回评,欢迎留下地址-博客之星
- LeetCode 1431. 拥有最多糖果的孩子
- 富文本处理NSMutableAttributedString
- J2EE之初识JSP
- 《南溪的目标检测学习笔记》——数据集制作(legacy)
- 任务02——安装 Intellj IDEA,编写一个简易四则运算小程序,并将代码提交到 GitHub...
- 常用公共数据集----数据获取
- matlab 单相整流电路,基于MATLAB的单相桥式整流电路研究
- ISBN(国际标准书号)
- Session 'app': Error Launching activity
- 手机按键精灵学习 —— 基础知识
- FMM和BMM的python代码实现
热门文章
- C++远航之封装篇——数据的封装
- kali linux 2.0 ssh,Kali 2.0使用SSH进行远程登录(示例代码)
- 网络流24题 洛谷 3355 骑士共存
- CentOS经常使用文件操作命令[百度博客搬家]
- 直击中关村创业大街,新街头霸王来了
- SQL强化(二) 在Oracle 中写代码
- Service Worker,Web Worker,WebSocket的对比
- window.cookie
- 迪美特TVZ8双核智能高清播放器 在电视上编程不是梦
- adb logcat 基本用法