netty答题
1,介绍一下netty
netty封装了Java原生的nio,是一个异步和数据驱动的网络编程框架,
与tcp:
- netty -> Java Runtime Socket (io、nio、nio2) -> OS Socket -> TCP (当然也可以是UDP、SCTP);
- 既然连操作系统层的Socket都必须做三次握手(仅对TCP而言),Netty当然无法跳过,只不过它对用户屏蔽了三次握手(当然还有四次挥手)的部分细节。
异步:read和write方法均是异步方法,用户进程发起一个IO操作然后,立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知(回到函数,channelactive和channelRead
bio:在bio是阻塞的通信模式。一个用户连接占用一条线程,服务器通过一个Acceptor线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式。当连接没有数据,也会阻塞在那里不释放cpu,若客户端数量增多,频繁地创建和销毁线程会给服务器打开很大的压力。(内存(每条线程栈上的基本数据类型,对象引用,方法栈,程序计数器)和cpu上下文切换(cpu寄存器需要把线程重新装入
nio:netty使用的是封装Java的nio模型,Java API 这是一个繁琐和不容易保证的用法,所以我们一般都使用netty完成nio模型的编程,在netty的多路复用nio模型,工作模式是一个工作线程对应多条连接,用一个轮询器selector不断轮询连接,若连接上有io事件,则可以获得io线程的资源,当连接没有了io请求,线程不用被阻塞,selector会轮询到其他有io请求的连接,这样线程可以被重定向到其他任务上。
启动过程:服务端监听线程和IO线程分离,创建服务端的时候实例化了2个EventLoopGroup,bossGroup和workGroup,1个EventLoopGroup实际就是一个EventLoop线程组,
bossGroup线程组实际就是Acceptor线程池,负责处理客户端的TCP连接请求,如果系统只有一个服务端端口需要监听,则建议bossGroup线程组线程数设置为1。服务端Channel创建完成之后,bossGroup将会把channel绑定在一个可用的event loop上(没有的时候创建),相当于注册到eventloop的多路复用器Selector上,用于接收客户端的TCP连接,关系是1:1:1
如果监听到客户端连接,则创建客户端SocketChannel连接,重新注册到workerGroup的IO线程上。EventLoopGroup从中选择一个I/O线程负责网络消息的读写。选择IO线程之后,将SocketChannel注册到多路复用器上,监听后面的io操作。一个workgroup最多
开cpu数量*2的线程,workgroup:selector:连接 = 1 : n :m
线程安全:Netty采用了串行化设计理念,从消息的读取、编码以及后续Handler的执行,始终都由IO线程NioEventLoop负责,也就是一个客户端连接始终绑定在他一开始注册的NioEvenLoop,这就意味着整个流程不会进行线程上下文的切换,客户端连接不会在两个两个io线程切换,造成可见性问题(工作线程到主内存拷贝的时候有可见性问题,可以引出jmm),所以数据也不会面临被并发修改的风险

复杂和时间不可控业务:在添加 pipeline 中的 handler 时候,添加一个线程池, handler 中的代码不用做任何修改,当selector轮询到它的时候,从上下文中发现有线程池,就用线程池执行耗时任务,不占用当前线程,当耗时任务执行完毕再执行 write 方法的时候,会将任务的结果写入outbound 等待轮询
channel相关:
- 每个Channel会绑定一个ChannelPipeline,每个ChannelPipeline会持有一个Channel
- 每个ChannelHandler对应一个ChannelHandlerContext,ChannelPipeline持有ChannelHandlerContext链表,也就相当于持有ChannelHandler链表
- ChannelHandlerContext作为上下文,持有ChannelPipeline和它对应ChannelHandler的引用,持有ChannelPipeline相当于间接持有Channel,同时持有它上/下一个ChannelHandlerContext的引用
- inbound按照顺序,outbound逆序,inbound事件------channel注册事件,读事件,outbound事件-----bind事件write事件
SimpleChannelInbouundHandler<Object>比channelInboundHandlerAdapter多了添加泛型和自动清空缓冲区


参考
io模型最明白:https://my.oschina.net/zhangph89/blog/967490
比较全面:http://www.infoq.com/cn/articles/netty-threading-model
netty答题的更多相关文章
- hbase之createTable完整的netty实现执行流程
hbase的客户端代码并不想hive一样用java编写,shell调用,而是使用ruby编写. 在admin.rb文件中方法create,其中接受两个参数,其中第二个参数类型为变长参数. 而在crea ...
- Netty 学习笔记(1)通信原理
前言 本文主要从 select 和 epoll 系统调用入手,来打开 Netty 的大门,从认识 Netty 的基础原理 —— I/O 多路复用模型开始. Netty 的通信原理 Netty 底层 ...
- 谈谈如何使用Netty开发实现高性能的RPC服务器
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...
- 基于netty http协议栈的轻量级流程控制组件的实现
今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...
- 从netty-example分析Netty组件续
上文我们从netty-example的Discard服务器端示例分析了netty的组件,今天我们从另一个简单的示例Echo客户端分析一下上个示例中没有出现的netty组件. 1. 服务端的连接处理,读 ...
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- 从netty-example分析Netty组件
分析netty从源码开始 准备工作: 1.下载源代码:https://github.com/netty/netty.git 我下载的版本为4.1 2. eclipse导入maven工程. netty提 ...
- Netty实现高性能RPC服务器优化篇之消息序列化
在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...
- Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇
目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...
随机推荐
- elment-ui table组件 -- 远程筛选排序
elment-ui table组件 -- 远程筛选排序 基于 elment-ui table组件 开发,主要请求后台实现筛选 排序的功能. 需求 排序 筛选 是对后台整个数据进行操作,而不是对当前页面 ...
- react项目打包后路径找不到,项目打开后页面空白的问题
使用 npm install -g create-react-app快速生成项目脚手架打包后出现资源找不到的路径问题: 解决办法:在package.json设置homepage
- C#窗体如何通过keybd_event()函数模拟键盘按键(组合键)产生事件
如何模拟键盘按键触发产生的事件,比如模拟按下Alt + F4 关闭当前程序,Ctrl+Shift 切换输入法等 可以通过win32api 键盘事件 keybd_event() 来实现 1.定义键盘按键 ...
- 封装一个简单的原生js焦点轮播图插件
轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...
- SQL Server 调优系列基础篇 - 并行运算总结(一)
前言 上三篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符.联合运算符的优化技巧. 本篇我们分析SQL Server的并行运算,作为多核计算机盛行的今天,SQL Server也会适时调整自 ...
- C#阿里云 移动推送 接入
接入阿里云的 移动推送 SDK,实现在后台直接 发送消息给APP的功能. ----------------OpenAPI进行推送 2.0高级接口 阿里云配置准备:1.移动app配置:打开 ...
- js常用用途
页面元素查找 查找元素方法表达式 返回值 依据元 ...
- maven多环境配置
我们在开发项目的时候,往往会有好几个环境.比如开发.预发布(测试).产品,每个环境一般用到配置都不一样,最典型的就是数据库,开发的数据库与产品的数据库肯定是不一样的,如果要多个环境的切换就得改配置,这 ...
- Arrays类的分析及使用
1. Arrays类介绍 Arrays类是Java API中提供的类,在java.util包中,此类包含用来操作数组的各种方法,比如排序和搜索,在这个类中如果指定数组引用为null,则此类方法都会抛 ...
- 【Android SDK Manager】SDk国内镜像下载地址
中国科学院开源协会镜像站地址: IPV4/IPV6: http://mirrors.opencas.cn 端口:80 IPV4/IPV6: http://mirrors.opencas.org 端口: ...