Netty了解与小试

简介:

在互联网的应用中有一个特点,高并发,但处理逻辑相对简单。针对这个特别有时间我们可以相对的简化下平时所有的WEB服务器,来满足这一的特点,而且更方便控制。Netty就是一个不错的选择,Netty 提供异步的、事件驱动的网络应用程 另外与Spring一起使用,以快速开发高性能、高可靠性的网络服务器和客户端程序。

最近的一个项目使用了这点,不错的解决了这类的应用。下面是在了解这方面的时间找到的不错的资料。

 

http://wenku.baidu.com/view/7765bc2db4daa58da0114a4c.html  深入浅出Netty

netty是JBOSS针对网络开发的一套应用框架,它也是在NIO的基础上发展起来的。netty基于异步的事件驱动,具有高性能、高扩展性等特性,它提供了统一的底层协议接口,使得开发者从底层的网络协议(比如 TCP/IP、UDP)中解脱出来。就使用来说,开发者只要参考 Netty提供的若干例子和它的指南文档,就可以放手开发基于Netty的服务端程序了。

   netty有几个比较重要的概念,在此,仅做介绍,详细可以参考netty文档或源码。

   1). channelBuffer:  Netty 的一个基本数据结构,这个数据结构存储了一个字节序列。 类似于 NIO  ByteBuffer,但操作起来比ByteBuffer更为简单方便。

   2). ChannelFactory 是一个创建和管理 Channel 通道及其相关资源的工厂接口,它处理所有的 I/O 请求并产生相应的 I/O ChannelEvent 通道事件。

  3).ChannelHandler是所有I/O ChannelEvent事件的响应类,所有消息,包括netty通信异常事件,均在该响应类内处理。

  4).*** Bootstrap 是一个设置服务的帮助类。你甚至可以在这个服务中直接设置一个 Channel 通道。

  现在以实现一个UDP协议下的服务器应用程序为例,演示netty通过spring注解开发服务器端。(在此以maven工具管理项目开发)

 

http://blog.csdn.net/tanrenzong1986/article/details/6404256

 

netty的性能非常高,能达到8000rps以上,见

 

http://blog.chinaunix.net/uid-11121450-id-3147009.html

 

 

Netty一般都通过bootStrap来启动, 网络动作过程就是服务器端bind->accept->read->write,客户端 connect->read->write,一般bind或者connect后会有多次read、write。依据这种特性netty将bind,accept与read,write的线程分离,connect与read、write线程分离

 

 

 

一、Netty主要可以分为3部分: buffer, channel, handle。

 

1、      Channelbuffer

 

l  所有的实现类中都提供,readerIndex, writerIndex两个指针,无需nio buffer的flip.

 

l  可以通过ChannelBufferFactory来创建channelbuffer. 分为两类buffer

 

 HeapChannelBufferFactory: 在jvm堆上创建缓冲区,默认是BIG_ENDIAN排序

 

DirectChannelBufferFactory:对应nio ByteBuffer.allocateDirect(),直接缓冲区分配

 

l  WrappedChannelBuffer实现对ChannelBuffer封装,通过其可以自定义channelbuffer.

 

 

 

2、      Channel:

 

通常每种类型的channel一般都有一个对应channelfactory类,以及一个channelconifg类。  通过channelfactory创建channel实例,然后由channelconifg来配置channel属性。

 

l  ChannelGroup:  一组通道的集合,线程安全, 关闭的通道会自动从集合中删除, 可以通过ChannelGroup广播消息。

 

l  Channel的种类:

 

LocalChannel、 LocalServerChannel:本地通道、虚拟一个网络。

 

DatagramChanneel: udp连接通道.

 

ServerSocketChannel、SoketChannel:  处理tcp/ip连接的通道。

 

l  Channelevent:  用于将:channel的相关信息 如channel本身,传递的数据,channel的状态, future等等一起打包,在调用org.jboss.netty.channel.Channels类的各个静态的fire方式中产生,然后在channelpipe中的sendUpsteam或sendDownStream中传递。

 

l  ChannelSink:处理pipeline中downstream结束后的事件。

 

 

 

3、      handler:

 

所有需要调用的handler都被包装成ChannelHandlerContext,注册到channelpipeline的一个map中,  通过两个指针:head和tail保证map中的handle的调用顺序。处理upstream时,通过head指针从前往后依次调用实现ChannelUpstreamHandler接口的handle.   downstream处理通过tail指针,从后往前依次调用实现ChannelDownstreamHandler接口的handle。  在downsream的channelpipeline传送完后,ChannelSink的eventSunk方法完成对系统底层的调用处理。(ChannelSink和channel是通过attach的方式绑定到channelpipeline上)

 

Netty中已经提供的handler的种类如下:

 

l  codec handle。包括  64位机器的编码、解码,   字符集转化,压缩,http请求编码、解码; 序列化对象的编码、解码等等。通过codec handle我们可以直接往channel中写java 对象。

 

l  Timeout handler通过jboss.netty.util.Timer来对读写超时或者闲置链接的通知,在handle中创建一个time对象,这个time对象包含一个定时器线程Work进程,在handle第一次被触发时,启动一个Work线程:监控超时事件。

 

l  Stream handler  用于异步处理大数据传递。通过将java.io.file对象包装成ChunkedFile对象,进行传递,ChunkedFile的底层实现是RandomAccessFile.

 

l  Queue handler: 用户将接受到的数据或需要发送的数据先存储到一个queue队列中,然后一次性的读和写。  包括BlockingReadHandler和BufferedWriteHandler. 注意在BlockingReadHandler将receivemessage存储入queue后,其后的handler将不再处理 messageReceived,exceptionCaught 和channelClosed事件,因此BlockingReadHandler必须放在channelpipeline的最后。  同理BufferedWriteHandler。

 

 

 

4、      其他

 

l  org.jboss.netty.container 各种容器的兼容 Microcontainer OSGi Spring framework 整合接口

 

l  Bootstrap 启动类: BootStrap: TCP服务器端启动; ClientBootStrap:Tcp client端启动和ConnectionlessBootstrap  UDP启动。

 

 

 

二、服务器的启动和客服端connect的过程

 

 

 

1 、服务器启动

 

 bootstrap.bind(…)-> 触发ServerSocketChannel.open()的事件(sendupstream)->捕捉open事件,channel.bind-> Channels.bind(…)  发起bind命令(sendDownstream)-> PipelineSink进行处理-> 使用socket进行bind,启动boss进程。

 

 Boostrap.bind 方法包含两个参数NioServerSocketChannelFactory、ChannelPipelineFactory。NioServerSocketChannelFactory包含连个线程池bossExecutor和workerExecutor,workerExecutor: 包含缺省为处理器个数×2个NioWorker进程。

 

 2、服务器处理连接

 

 Boss启动后,在监听accept事件, 将捕获到的事件作为一个task放到一个niowork进程

 

的registerTaskQueue队列中。

 

3、服务器端接收并处理数据

 

  NioWorker.run()->nioworker. processSelectedKeys()->Nioworker. Read()将从SocketChannel读取的数据封装成ChannelBuffer ->调用fireMessageReceived(channel,buffer)产生upstream事件 –> 由注册到Pipeline中的Hanlder进行处理

 

4、客户端connection

 

同服务器启动一样也需要创建一个NioClientSocketChannelFactory和一个ChannelPipelineFactory。  同服务器端不同的是client端的boss进程不要监听,它将本地发出的建立的链接的请求封装成task放入一个registerTaskQueue,boss负责消费Queue队列中的消息。

http://blog.csdn.net/north_eagle/article/details/6545357



本文转自茄子_2008博客园博客,原文链接:http://www.cnblogs.com/xd502djj/archive/2012/06/25/2561318.html,如需转载请自行联系原作者。



目录
相关文章
|
存储 缓存 NoSQL
跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)
本文将要分享的是如何从零实现一套基于Netty框架的分布式高可用IM系统,它将支持长连接网关管理、单聊、群聊、聊天记录查询、离线消息存储、消息推送、心跳、分布式唯一ID、红包、消息同步等功能,并且还支持集群部署。
13447 1
|
5月前
|
消息中间件 Oracle Dubbo
Netty 源码共读(一)如何阅读JDK下sun包的源码
Netty 源码共读(一)如何阅读JDK下sun包的源码
115 1
|
10月前
|
NoSQL Java Redis
跟着源码学IM(十二):基于Netty打造一款高性能的IM即时通讯程序
关于Netty网络框架的内容,前面已经讲了两个章节,但总归来说难以真正掌握,毕竟只是对其中一个个组件进行讲解,很难让诸位将其串起来形成一条线,所以本章中则会结合实战案例,对Netty进行更深层次的学习与掌握,实战案例也并不难,一个非常朴素的IM聊天程序。 原本打算做个多人斗地主练习程序,但那需要织入过多的业务逻辑,因此一方面会带来不必要的理解难度,让案例更为复杂化,另一方面代码量也会偏多,所以最终依旧选择实现基本的IM聊天程序,既简单,又能加深对Netty的理解。
148 1
|
5月前
|
编解码 前端开发 网络协议
Netty Review - ObjectEncoder对象和ObjectDecoder对象解码器的使用与源码解读
Netty Review - ObjectEncoder对象和ObjectDecoder对象解码器的使用与源码解读
101 0
|
5月前
|
编解码 安全 前端开发
Netty Review - StringEncoder字符串编码器和StringDecoder 解码器的使用与源码解读
Netty Review - StringEncoder字符串编码器和StringDecoder 解码器的使用与源码解读
174 0
|
12月前
|
分布式计算 网络协议 前端开发
【Netty底层数据交互源码】
【Netty底层数据交互源码】
|
12月前
|
Java 容器
【深入研究NIO与Netty线程模型的源码】
【深入研究NIO与Netty线程模型的源码】
|
编解码 弹性计算 缓存
Netty源码和Reactor模型
Netty源码和Reactor模型
95 0
|
设计模式 监控 前端开发
第 10 章 Netty 核心源码剖析
第 10 章 Netty 核心源码剖析
124 0
|
编解码 分布式计算 Java
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]