博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
netty初步,与各个版本的比较
阅读量:4261 次
发布时间:2019-05-26

本文共 2827 字,大约阅读时间需要 9 分钟。

1.入门文档
如果是入门的话,官网的文档已经相当好了。里面的例子程序得仔细阅读,这里就不再重复转载了。参见
2.为什么需要netty
2.1 主要是scalibity和performance
2.2 另外Netty In Action有一些说明,笔记如下:
2.2.1 传统的异步编程有2种模式:callback和Future
2.2.2 3种API比较
BIO: N个连接N个Thread
NIO: N个连接1个Selector-->1个Thread
NIO2:CompletionHandler避免了Selector的轮询(JDK7)
这张图是BIO和NIO的比较。
2.2.3 JDK的问题:
1.跨平台:linux上OK,windows上却出问题
2.ByteBuffer无法扩展
3.scattering gathering可能有内存泄露(直到java6的后期update版本或者Java7才解决)
4.epoll bug,可导致CPU 100%。 
Netty解决了以上4点问题。
3.Netty3,4,5 API不同点
本文写作时,各版本的最新版如下:
netty3 3.9.0
netty4 4.0.18
netty5 5.0.0 Alpha1
3.1 ChannelHandler的变化
首先有一些术语需要理解,请参见下面的表格和3张图,从中可以看到netty3,4,5之间的很大的不同。
收消息 上行,入站 InputStream.read(byte[])
发消息 下行,出站 OutputStream.write(byte[]), Socket.connect(SocketAddress), Socket.close()
Netty3使用了上行下行的概念
Netty4使用了入站出站的概念
Netty5则干脆取消了两者的划分,统一为一个概念
Netty3: ChannelHandler有两个子接口ChannelUpstreamHandler,ChannelDownstreamHandler,
上行和下行,这里的上行和下行和我们一般理解上的上下行不太一样,为何如此可以参考上面的3张图。
相应的类有SimpleChannelUpstreamHandler,SimpleChannelDownstreamHandler,以及一个同时实现两个接口的SimpleChannelHandler
Netty4: 接口变成了ChannelInboundHandler ChannelOutboundHandler,可能是为了避免原来的上下行造成误解,所以改成入站和出站了。
相应的类有ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter,我们只要选择一个继承就可以了。
Netty5: 取消了进站、出站的划分,统一为继承ChannelHandlerAdapter,原来的ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter被废弃。
ChannelHandler的API,从中可以看到netty3,4,5之间的很大的不同。
3.2 BootStrap的变化
3.2.1 netty4构造ServerBootstrap时采用了构建者模式,使得代码更优雅。
Java代码  
  1. EventLoopGroup bossGroup = new NioEventLoopGroup();  
  2. EventLoopGroup workerGroup = new NioEventLoopGroup();  
  3. ServerBootstrap b = new ServerBootstrap();  
  4. b.group(bossGroup, workerGroup)  
  5.  .channel(NioServerSocketChannel.class)  
  6.  .childHandler(new ChannelInitializer<SocketChannel>() {  
  7.     @Override  
  8.     public void initChannel(SocketChannel ch) throws Exception {  
  9.         ch.pipeline().addLast(new DiscardServerHandler());  
  10.     }  
  11. })  
  12.  .option(ChannelOption.SO_BACKLOG, 128)  
  13.  .childOption(ChannelOption.SO_KEEPALIVE, true);  
而netty3则是用最平常的setter。
Java代码  
  1. ChannelFactory factory = new NioServerSocketChannelFactory(  
  2.     Executors.newCachedThreadPool(),  
  3.     Executors.newCachedThreadPool());  
  4.   
  5. ServerBootstrap bootstrap = new ServerBootstrap(factory);  
  6.   
  7. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  8.     public ChannelPipeline getPipeline() {  
  9.           return Channels.pipeline(new DiscardServerHandler());  
  10.     }  
  11. });  
  12.       
  13. bootstrap.setOption("child.tcpNoDelay"true);  
  14. bootstrap.setOption("child.keepAlive"true);  
3.2.2 对比一下netty3和4,我们发现netty4因为采用了泛型的写法(.channel(NioServerSocketChannel.class)),所以NioServerSocketChannelFactory就不需要透露给用户了,这个工厂也被取消了。
3.2.3 另外netty4引入了ChannelOption的常量定义,注意这个类是泛型的(ChannelOption<T>),用了这个技巧从而可以确保赋值安全,使得SO_BACKLOG只能传一个int进来,SO_KEEPALIVE只能传一个boolean进来。
Java代码  
  1. public static final ChannelOption<Integer> SO_BACKLOG  
  2. public static final ChannelOption<Boolean> SO_KEEPALIVE  
Bootstrap的API,netty4相比netty3有比较大的变化,而netty5和netty4比则基本相同。
作为初步,暂时先分析到这里。其余不同点有待以后继续分析。
你可能感兴趣的文章
多线程——Java线程池原理深入
查看>>
多线程——并发锁的集结号
查看>>
JVM——深入解析之初识
查看>>
JVM——深入解析原理和运行机制(一)类加载过程
查看>>
JVM——深入解析原理和运行机制(一)类加载器
查看>>
VB与flash的交互
查看>>
番茄工作法
查看>>
SQL Server 错误:18456。用户“sa”登录失败
查看>>
SQL Server 2008阻止保存要求重新创建表的更改的解决
查看>>
学生信息管理系统之数据库远程使用
查看>>
如何做一名优秀的程序员
查看>>
【C++】C++11新增关键字详解
查看>>
【Ubuntu】VirtualBox显卡驱动VBoxVGA、VBoxSVGA、VMSVGA +3D对播放视频的影响
查看>>
【Gstreamer】在虚拟机中无法使用硬件加速:gstreamer1.0-vaapi
查看>>
免费图标查询、下载的网站
查看>>
【经验】Lenovo/ThinkPad 进入BIOS的方法汇总
查看>>
【Qt】QPixmap加载图片报错:Corrupt JPEG data: premature end of data segment Didn't expect more than one scan
查看>>
【Ubuntu】ubuntu设置GUI程序自启动
查看>>
【Ubuntu】ping: unknown host www.baidu.com
查看>>
【Qt】qss样式表之:QCalendarWidget,日历窗口样式表设置
查看>>