1. 前言

本系列主要是用于梳理Netty的架构流程,深入设计细节,重点关注Netty是如何实现它所声称的特性。

(ps:本人水平有限,如有错误,请不吝指教 : ))

2. 什么是Netty

Netty 是一个异步事件驱动的网络编程框架和工具,使用Netty 可以快速开发出可维护的,高性能、高扩展能力的协议服务及其客户端应用。Netty极大地简化并优化网络编程,例如TCP和UDP套接字服务器。

Netty吸收了多种协议的实现经验,包括FTP、SMPT、HTTP、各种二进制和文本协议,成功找到一种开发应用程序的方法,保证易于开发、性能、稳定性、扩展性等特性。

3. Netty总体架构

  • 为不同的传输类型定义统一的API,适用于阻塞和非阻塞套接字;
  • 基于一个灵活、可扩展的事件模型,允许关注明确的任务分工;
  • 高度可定制的线程模型,适用于单线程、一个或多个像SEDA这样的线程池;
  • 真正无连接的数据报套接字支持(版本3.1+);
  • 完整的 SSL / TLS 和 StartTLS 的支持;
  • HTTP、WebSocket支持;
  • Google Protocol Buffer支持。

4. 关注点

本系列文章主要关注Core部分的实现:

  • Extensible Event Model(可扩展的事件模型);
  • Universal Communication API(统一的通信API);
  • Zero-Copy-Capable Rich Byte Buffer(零拷贝的Buffer)。

4.1 Extensible Event Model

Netty具有定义良好的I/O事件模型。由于严格的层次结构区分了不同的事件类型,因此Netty允许你在不破坏现有代码的情况下实现自己的事件类型,这是与其他框架相比另一个不同的地方。

4.2 Universal Communication API

Java的Old I/O和New I/O,使用了互不兼容的API,而Netty则提供了统一的API封装这两种I/O模型。

4.3 Zero-Copy-Capable Rich Byte Buffer

在数据传输时,最终处理的数据会需要对单个传输层的报文,进行组合或者拆分。NIO原生的ByteBuffer要做到这件事,需要对ByteBuffer内容进行拷贝,产生新的ByteBuffer,而Netty通过提供Composite(组合)和Slice(切分)两种Buffer来实现零拷贝。

5. Netty源码结构

为了理解Netty的异步事件驱动机制,需要研究Netty的源码实现。其包结构如下所示:

io.netty

- bootstrap 配置启动服务相关的类

- buffer 缓冲区相关的类

- channel 处理连接的核心类

- handler 实现协议编解码的类

- util 工具类

接下来,我们就逐一分析这些包结构中的实现。


(END)

Netty 5.0源码分析之综述的更多相关文章

  1. Netty 5.0源码分析-ByteBuf

    1. 概念 Java NIO API自带的缓冲区类功能相当有限,没有经过优化,使用JDK的ByteBuffer操作更复杂.故而Netty的作者Trustin Lee为了实现高效率的网络传输,重新造轮子 ...

  2. Netty 5.0源码分析-Bootstrap

    1. 前言 io.netty.bootstrap类包提供包含丰富API的帮助类,能够非常方便的实现典型的服务器端和客户端通道初始化功能. 包含的接口类: //提供工厂类的newChannel方法创建一 ...

  3. Netty 核心组件 Pipeline 源码分析(二)一个请求的 pipeline 之旅

    目录大纲: 前言 针对 Netty 例子源码做了哪些修改? 看 pipeline 是如何将数据送到自定义 handler 的 看 pipeline 是如何将数据从自定义 handler 送出的 总结 ...

  4. AFNetWorking3.0源码分析

    分析: AFNetWorking(3.0)源码分析(一)——基本框架 AFNetworking源码解析 AFNetworking2.0源码解析<一> end

  5. Solr5.0源码分析-SolrDispatchFilter

    年初,公司开发法律行业的搜索引擎.当时,我作为整个系统的核心成员,选择solr,并在solr根据我们的要求做了相应的二次开发.但是,对solr的还没有进行认真仔细的研究.最近,事情比较清闲,翻翻sol ...

  6. 阅读《RobHess的SIFT源码分析:综述》笔记

    今天总算是机缘巧合的找到了照样一篇纲要性质的文章. 如是能早一些找到就好了.不过“在你认为为时已晚的时候,其实还为时未晚”倒是也能聊以自慰,不过不能经常这样迷惑自己,毕竟我需要开始跑了! 就照着这个大 ...

  7. Solr4.8.0源码分析(25)之SolrCloud的Split流程

    Solr4.8.0源码分析(25)之SolrCloud的Split流程(一) 题记:昨天有位网友问我SolrCloud的split的机制是如何的,这个还真不知道,所以今天抽空去看了Split的原理,大 ...

  8. Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)

    Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...

  9. Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四)

    Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四) 题记:本来计划的SolrCloud的Recovery策略的文章是3篇的,但是没想到Recovery的内容蛮多的,前面 ...

随机推荐

  1. [翻译]初识SQL Server 2005 Reporting Services Part 2

    原文:[翻译]初识SQL Server 2005 Reporting Services Part 2 在Part 1文章中我们对SQL Server Reporting Services 2005(S ...

  2. SSMS2008插件开发(1)--介绍

    原文:SSMS2008插件开发(1)--介绍 SSMS2008就是Microsoft Sql Server Management Studio 2008的简称.许多人叫做SQL2008或SQL SER ...

  3. ios中mvc的FormsAuthentication.SetAuthCookie(cookieUserName, false)失败

    如果楼主使用.net开发,要注意FormsAuthentication.SetAuthCookie 方法的使用会导致ios出现该问题.因为这个方法在ios设备上是把票据加入到url中,导致url和你的 ...

  4. 序列化(ObjectOutputStream和ObjectInputStream)(切记:out是输出到本地中,in是输入到程序中)

    注意:序列化自定义类必须实现一个接口Serializable,在c#中序列化自定义类是使用特性也就是[Serializable] //要实现序列化的类 public class Student imp ...

  5. rabbitmq-message(C#)

    1.安装Erlang Windows Binary File 2.安装rabbitmq-server(windows)rabbitmq-server-3.5.4.exe 参考:http://www.r ...

  6. json序列化NHibernate的实体

    在使用nhibernate时,想将实体对象序列化成json字符串,然后打印在日志中. 序列化时会出现问题,应该是因为这个实体被hibernate管理的原因.具体原因没有分析. 解决方案:为实体创建一个 ...

  7. MvcMovieStore实例 教程

    转原创:MvcMovieStore 实例教程(新概念版:mvc5.0,EF6.01)-初露锋芒 如需转载,请注明出处:http://www.cnblogs.com/DoduNet/ 最近趁业余时间,把 ...

  8. [转]Breaking Bad With DTrace

    Source:http://initwithfunk.com/blog/2013/05/31/breaking-bad-with-dtrace/ I’ve spent an unwise amount ...

  9. 使用PetaPoco结合注入实现业务级事务

    使用PetaPoco结合注入实现业务级事务   PetaPoco是一个轻量级ORM,我的MVC项目中使用它结合Repository模式,依靠Unity的生命周期管理对象,保证请求/线程级别的数据上下文 ...

  10. ASP.NET Web API是如何根据请求选择Action的?[下篇]

    ASP.NET Web API是如何根据请求选择Action的?[下篇] 再<上篇>中我们简单介绍了用于实现Action选择机制的HttpActionSelector,接下来我们来讨论本章 ...