• netty源码解析(4.0)-1 核心架构


    netty是java开源社区的一个优秀的网络框架。使用netty,我们可以迅速地开发出稳定,高性能,安全的,扩展性良好的服务器应用程序。netty封装简化了在服务器开发领域的一些有挑战性的问题:jdk nio的使用;多线程并发;扩展性。它还提供了多种应用层协议的支持:http/https/websock, protobuf, 自定义协议, 简化了服务器协议的开发。
    netty是一个基于事件驱动的框架,它把事件分成两种类型:输入事件(inbound)和输出事件(outbound), 整个框架都是围绕事件处理进行设计的,以下是netty的核心架构:

    上图中涉及到了netty的六个核心对象:
    Channel: 一个I/O操作的对象,所有的inbound事件都是由Channel产生,outbound事件最终都会有Channel处理(如果outbound事件没有被用户注册的handler丢弃的话)。
    ChannelPipeline: 有一个ChannelPipeline实例属于一个Channel实例,它是事件传播的管道,从Channel实例接收inbound事件,把outbound事件提交给Channel。
    ChannelHandlerContext: 这是一个双向链表结构,它的多个实例组成了一个双向链表,并有ChannelPipeline负责维护。 在ChannelPipeline的默认实现中,这个链默认添加了Head和Tail节点, Head节点同时实现ChannelOutboundHandler和ChannelInboundHandler接口,Head节点比较特殊,它会最终把事件交给Channel处理。Tail节点实现了ChannelInboundHandler接口,使用Channel触发的inbound事件会首先传到这里处理。
    ChannelHandler: 这里是netty的扩展接口,也是真正实现服务器通讯协议和业务功能功能的地方。ChannelHandler有两种类型:处理输入事件的ChannelinboundHandler和处理输出事件的ChannelOutboundHandler。用户的ChannelHandler要实现这两个接口中的任意一个或全部。当用户向ChannelPipeline注册自己的ChannelHandler时,ChannelPipleline会创建一个相应的ChannelHandlerContext实例,并让这个实例持有用户注册的ChannelHandler实例。然后把这个实例添加到双向链表中。用户注册的ChannelHandler的类型决定了这个实例的类型,进而决定了这个实例能够处理的事件类型。
    EventLoopGroup: 在Channel上执行I/O的线程组,netty把这个线程组中的线程定义为I/O线程,后面会讲到,有些特定的事件必须在I/O线程中处理。
    EventExecutorGroup: 用来执行ChannelHandlerContext和ChannelHandler中回调方法的线程。在用户向ChannelPipeline中注册一个ChannelHanlder时,如果指定了一个EventExecutorGroup,那么它和它对应的ChannelHandlerContext都会在指定的EventExecutorGroup执行,否则,在Channel的EventLoopGroup中执行。
     
    以上是netty核心架构中的核心核心对象,netty提供的所有能力都是通过对这些核心对象的扩展实现的。例如:
    NioSocketChannel和NioServerSocketChannel扩展了Channel, NioEventLoopGroup扩展了EventLoopGroup, netty通过这一组扩展实现了对JDK NIO的封装。
    ProtoBufDecoer和ProtoBufEncoder扩展ChannelHandler实现了对potobuf协议的支持。
    HttpObjectDecoder和HttpObjectEncoder扩展ChannelHandler实现了对http协议的支持。
    此外开发者还可通过对EventLoopGroup和EventExecutorGroup扩展实现不一样的线程模型,满足特定业务场景的需求。
    还可以对ChannelPipleline和ChannelHandlerContext扩展实现自定义的事件传递和处理流程。

  • 相关阅读:
    关于sqlite数据库在使用过程中应该注意以下几点
    关于THREAD线程中CurrentCulture与CurrentUICulture的学习
    转:ASP.NET MVC3升级到ASP.NET MVC4
    win8 iis安装及网站发布
    转: CKEditor/CKFinder升级心得
    [更新]Windows Phone 实现类似“微博”下拉刷新效果
    EntityFramework中使用Include可能带来的问题
    [更新]Luke.Net for Pangu 盘古分词版更新
    文件大小友好显示类
    找出最慢的查询语句Find your slowest queries
  • 原文地址:https://www.cnblogs.com/brandonli/p/9906508.html
Copyright © 2020-2023  润新知