`
xpenxpen
  • 浏览: 731728 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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不同点

本文写作时,各版本的最新版如下:
netty33.9.0
netty44.0.18
netty55.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时采用了构建者模式,使得代码更优雅。
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。
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进来。
public static final ChannelOption<Integer> SO_BACKLOG
public static final ChannelOption<Boolean> SO_KEEPALIVE


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

作为初步,暂时先分析到这里。其余不同点有待以后继续分析。
  • 大小: 7.1 KB
  • 大小: 6 KB
  • 大小: 6.1 KB
  • 大小: 6.1 KB
  • 大小: 10.1 KB
  • 大小: 8.2 KB
  • 大小: 3.4 KB
分享到:
评论
1 楼 wang23109203 2016-05-05  

相关推荐

    Netty初步学习-HelloNetty.rar

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

    netty-master.zip

    随附的"netty-课程演示源码(附部分中文注释).zip"和"netty-chapter-1-Netty初步印象之HelloWorld.zip"、"netty-chapter-4-Netty案例雏形代码.zip"提供了一系列的示例代码,帮助读者更好地理解和应用Netty,通过...

    Netty使用初步

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

    Netty3.x 源码解析

    通过这样的一个例子,我们可以初步感受Netty的使用方法。 源码级别的学习可以帮助开发者从本质上理解Netty的工作原理。为了深入理解Netty,需要关注以下几个关键点: 1. NIO基础:Netty基于Java NIO来实现非阻塞的...

    netty-3.2.5终极手册

    - **总结**:通过这些基础示例,读者可以初步了解Netty的工作机制及其核心功能。 #### 四、Netty 架构概览 ##### 1. 富有的缓冲数据结构 Netty内部使用高效的缓冲数据结构(ChannelBuffer),支持快速的数据读写...

    Java_NIO框架Netty教程.pdf

    了解了上述知识点后,读者应该对Netty的框架有了初步的理解,但Netty的强大远不止这些。在实际应用中,Netty还支持许多高级特性,如SSL/TLS加密通信、零拷贝(zero-copy)和协议栈的灵活定义等。学习和使用Netty,...

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

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

    netty-learning:netty-in-action是《 Netty实战》笔记。netty-private-protocol是一个基于Netty私有协议协议实现的

    进行初步研究,特作此项目。 源码地址:https://github.com/thinkingfioa/netty-learning 1.为什么要读Netty? 1.1净资产特性 1.2子项目讲解 netty-private-protocol -----基于Netty自定义私有协议的开发 netty-in-...

    Netty相关文档

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

    redant:基于Netty一个基于Netty的轻量级Web容器的轻型分布式Web容器

    RedAnt是一个基于Netty的轻量级Web容器 特性: IOC容器:通过@Bean注解可以管理所有对象,通过@Autowired注解进行对象注入 自定义路由:通过@Controller @Mapping @Param注解可以自定义路由 自动参数转换:通过...

    简单了解Java Netty Reactor三种线程模型

    在这种模型中,Acceptor线程池专门处理客户端连接,完成初步的认证等操作,然后将连接注册到后端的子Reactor线程池,由子线程池的线程负责后续的读写操作。这可以进一步提升服务端处理能力,确保连接建立过程的性能...

    ClusterDeviceControlPlatform:Java&Vue.js全栈“放置设备管理云平台『放置部分』』,使用Spring Boot,Netty搭建TCP服务器与上万设备的通信,基于JavaFX的GUI应用程序模拟上万台设备的行为,初步对服务器进行压力测试

    充分利用设备管理云平台「Java,SPA,Spring Boot 2.0,Netty,Vue.js 2.0,Element 2.0」项目描述Java&Vue.js全栈项目,大规模扩展设备管理云平台,由以下几部分组成: Java前端服务器,基于Vue.js的Web前端“ SPA...

    NettyServer收取数据存库

    在接收到数据时,会触发ChannelInboundHandlerAdapter中的channelRead()或channelReadComplete()方法,我们可以在这里进行数据的初步处理和解析。 描述中提到的"缓存到队列"策略是一种常见的并发编程解决方案,它...

    java_learning_practice:java进阶之路:面试高频算法,akka,多线程,NIO,Netty,SpringBoot,Spark && Flink等

    java_learning_practice学习java的积累示例:面试高频算法,akka,多线程,zookeeper,Disruptor,NIO,Netty,Thrift等项目组成收集总结初步&&大数据方向看到的优秀文章和系列博客;不定期更新pdf阿卡口味akka学习...

    Rabbit:RPC框架,使用ZooKeeper,Netty,期待良好的设计

    Rabbit从头搭建一个RPC框架,初步打算使用Netty进行数据通信,后期可能会增加BIO和NIO的方式因为是小白入门级别,所以项目代号Rabbit1、首先,先解释下RPC:RPC = Remote Procedure Call ,远程过程调用,它能够通过...

    CPU 高消耗排查

    #### 二、使用`top`命令进行初步分析 1. **`top`命令基础使用** - `top`是Linux系统中常用的监控工具之一,可以实时查看系统中进程的资源占用情况。 - 命令示例:`[root@3server ~]# top` - 通过`top`命令,我们...

    物联网COAP协议demo-Java版本

    由于物联网中的很多设备都是资源受限型的,即只有少量的内存空间和有限的计算能力,所以传统的HTTP协议应用在物联网上就显得过于庞大而不适用。 IETF的CoRE工作组提出了一种基于REST架构的CoAP协议。...

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

    smartacus-mqtt-broker欢迎志同道合的小伙伴一起探讨交流mqtt协议介绍随着工业的快速发展,对设备进行管理和数据采集的需求也越来越高。要解决大量设备的通信...初步协议。压缩消息。可以在不稳定的网络环境中进行良

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

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

    工商银行分布式服务C10K场景解决方案.docx

    初步验证结果显示,C10K场景下服务调用存在交易超时失败的问题。服务调用耗时过长会导致全链路节点长时间占用线程池资源,增加性能损耗,甚至可能引发服务雪崩,影响整个服务集群的性能。 对问题的深入分析主要围绕...

Global site tag (gtag.js) - Google Analytics