`

Netty初步 --概念

 
阅读更多

1.入门文档
如果是入门的话,官网的文档已经相当好了。里面的例子程序得仔细阅读,这里就不再重复转载了。参见http://netty.io/wiki/user-guide.html

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%。  https://github.com/netty/netty/issues/327
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);  
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
 .channel(NioServerSocketChannel.class)
 .childHandler(new ChannelInitializer<SocketChannel>() {
    @Override
    public void initChannel(SocketChannel ch) throws Exception {
        ch.pipeline().addLast(new DiscardServerHandler());
    }
})
 .option(ChannelOption.SO_BACKLOG, 128)
 .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);  
ChannelFactory factory = new NioServerSocketChannelFactory(
    Executors.newCachedThreadPool(),
    Executors.newCachedThreadPool());

ServerBootstrap bootstrap = new ServerBootstrap(factory);

bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
    public ChannelPipeline getPipeline() {
          return Channels.pipeline(new DiscardServerHandler());
    }
});
    
bootstrap.setOption("child.tcpNoDelay", true);
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  
public static final ChannelOption<Integer> SO_BACKLOG
public static final ChannelOption<Boolean> SO_KEEPALIVE



Bootstrap的API,netty4相比netty3有比较大的变化,而netty5和netty4比则基本相同。

作为初步,暂时先分析到这里。其余不同点有待以后继续分析。

分享到:
评论

相关推荐

    Netty初步学习-HelloNetty.rar

    在"Netty初步学习-HelloNetty.rar"这个压缩包中,我们可以看到包含"第二课netty服务端"的资源,这表明我们将学习如何构建一个简单的 Netty 服务端。下面将详细解释 Netty 的核心概念和步骤,以帮助你入门。 1. **...

    netty-3.2.5终极手册

    本书不仅涵盖了Netty的基本概念和入门教程,还深入探讨了其架构设计原理及高级特性。 #### 二、Netty 的问题与解决方案 ##### 1. 当前问题 当前网络通信中广泛采用通用协议或库进行交互,例如使用HTTP客户端库从...

    Netty使用初步

    《Netty使用初步》 Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。它广泛应用于各种分布式系统、云计算平台以及游戏服务器等场景。本篇文章将深入探讨Netty...

    Netty_In_Action第5版电子书及书中源码

    2. **快速入门**:演示如何创建一个简单的服务器和客户端,让读者对Netty的使用有初步认识。 3. **Channel与Pipeline**:讲解Netty的核心组件,包括Channel负责网络通信,Pipeline处理数据传输过程中的事件和处理...

    Netty3.x 源码解析

    3. ChannelPipeline:ChannelPipeline是Netty中的核心概念之一,负责管理和传递事件流。 4. ChannelHandler:它是业务逻辑处理的核心,不同的Handler负责不同类型的任务。 5. 编解码器:Netty提供了很多内置的编...

    Netty相关文档

    在压缩包中的"Netty使用初步.doc"可能是对Netty的入门教程,涵盖基础概念如Channel、EventLoop、ByteBuf等,以及如何创建服务器和客户端,处理各种网络事件等。通常,这样的文档会引导读者逐步实现一个简单的Netty...

    smartacus-mqtt-broker:smartacus-mqtt-broker是基于Java的开源MQTT代理,它完全支持MQTT3.x。使用Netty 4.1.37

    要实现工业上的IOT的概念,我们就要了解Iot的概念。要实现这些设备在复杂网络环境中的通信问题,就引出了很多协议,其中MQTT是最流行的一种。 MQTT(消息队列遥测传输)是一个轻量级开放的消息协议,用它进行传输,...

    Java思维导图xmind文件+导出图片

    初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 RabbitMQ消息路由机制分析 RabbitMQ消息确认机制 Redis redis数据结构分析 Redis主从复制原理及无磁盘复制分析 Redis管道模式...

    微服务分布式系统架构之zookeeper与dubbo.pdf

    Dubbo是由阿里巴巴开源的一个高性能Java RPC框架,它基于Netty进行通信,提供了高效的远程调用能力。在微服务架构中,Dubbo可以将不同的微服务通过RPC的方式进行通信和调用,它可以集成SpringBoot进行开发,使得...

    Java写的一个简单QQ代码

    在这个项目中,我们看到一个名为“Java写的一个简单QQ代码”的压缩包,它包含了一个初步实现的Java版本的QQ聊天应用。尽管功能可能不完整,但它为我们提供了一个学习和理解Java编程以及网络通信基础的良好实例。 1....

    ComDis_2_Server

    7. **框架与库**:项目可能依赖于特定的Java框架,如Spring Boot用于快速开发和微服务架构,或者Netty这样的高性能异步网络库。理解这些框架的工作原理和使用方法对项目的维护和扩展至关重要。 8. **日志与监控**:...

Global site tag (gtag.js) - Google Analytics