zoukankan      html  css  js  c++  java
  • Netty学习一:基本知识

    1. Netty基础知识

    1.1 Netty出现的原因

    • Java NIO 太难用,存在BUG(如Epoll-Bug)
    • 基于第一点,大多数高性能服务器被C和C++盘踞
    • 同样基于第一点,Java NIO编程门槛高
    • 业界其他的NIO框架不成熟

    1.2 Netty

    Netty是由JBOSS提供的一个Java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

    也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。

    “快速”和“简单”并不意味着会让你的最终应用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性.
    

    1.3 特性

    1.3.1 设计

    • 统一的API,适用于不同的协议(阻塞和非阻塞)
    • 基于灵活、可扩展的事件驱动模型
    • 高度可定制的线程模型
    • 可靠的无连接数据Socket支持(UDP)

    1.3.2 性能

    • 更好的吞吐量,低延迟
    • 更省资源
    • 尽量减少不必要的内存拷贝

    1.3.3 安全

    • 完整的SSL/TLS和STARTTLS的支持
    • 能在Applet与Android的限制环境运行良好

    1.3.4 健壮

    • 不再因过快、过慢或超负载连接导致OutOfMemoryError
    • 不再有在高速网络环境下NIO读写频率不一致的问题

    1.3.5 易用

    • 完善的JavaDoc,用户指南和样例
    • 简洁简单
    • 仅依赖标准JDK

    1.4 与其他框架的比较

    1.4.1 Mina

    Mina是有apache开发的帮助用户开发高性能和高伸缩网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。
    

    Netty与Mina的比较:

    • Netty和Mina的主导作者是同一人
    • Mina出自于Apache,Netty出身于商业开源大亨Jboss
    • Mina和Netty都采用了Reactors in threads模型
    • Mina是heapbytebuffer,Netty是directbytebuffer
    • 调度任务的不同
    • Mina和内核结合更紧密
    • Netty开发比Mina开发更灵活,更友好

    2. 架构简介

    2.1 架构分析

    2.1.1 总体结构

    2.1.1.1 Core
    Netty Core是Netty核心内容,它包括事件模型、通用API和Zero Copy功能。是上层功能的基础,由Core可以构建不同的应用服务。
    
    2.1.1.2 Protocl Support
    Protocol Support提供了多种协议的编解码包括HTTP、二进制和Google Protobuf等等,它们通过Codec Framework进行整合。
    
    2.1.1.3 Transport Support
    Transport Support提供了基本的NIO和BIO传输实现,是Netty网络通信的基础。
    
    2.1.1.4 Security Support
    Security Support不光提供了通信层的安全保障(比如SSL/TLS),还在应用层提供了解决OOM的方案。
    
    2.1.1.5 Container Integration
    Container Integration是可以应用于其他主流开发框架的集合,通过它可以和Spring、OSGi进行快速集成,为快速使用Netty提供基础支撑。
    

    2.1.2 逻辑架构

    2.1.2.1 Reactor通信调度层
    该层的主要职责是监听网络的读写和连接操作,负责将网络层的数据读取到内存缓冲区中,然后触发各种网络事件,例如连接创建、连接激活、读事件、写事件等等。将这些事件触发到PipeLine中,由PipeLine管理的职责链来后续进行处理。
    
    2.1.2.2 PipeLine
    PipeLine是职责链ChannelPipeLine,它负责事件在职责链中的有序传播,同时负责动态的编排职责链。职责链可以选择监听和处理自己关心的事件,它可以拦截处理和向后/向前传播事件。不同应用的Handler节点的功能也不同,通常情况下,往往会开发编解码Handler用于消息的编解码,它可以将外部的协议消息转换成内部的POJO对象,这样上层业务则只需要关心处理业务逻辑即可,不需要感知底层的协议差异和线程模型差异,实现层面的分层隔离。
    
    2.1.2.3 业务逻辑编排层
    业务逻辑编排层通常有两类:一类是纯粹的业务逻辑编排,还有一类是其他的应用层协议插件,用于特定协议相关的会话和链路管理。
    
    2.1.2.4 分层设计
    架构的不同层面,需要关心和处理的对象都不同,通常情况下,对于业务开发者,只需要关心职责链的拦截和业务Handler的编排,因为应用层协议栈往往是开发一次,到处运行,实际上对于业务开发者来说,只需要关心服务层的业务逻辑开发即可。各种应用协议以插件的形式提供,只有协议开发人员需要关注协议插件,对于其他业务开发人员来说,只需要关心业务逻辑定制即可。这种分层的架构设计理念实现了NIO框架各层之间的解耦,便于上层业务协议栈的开发和业务逻辑的定制。
    

    正是由于Netty的分层架构设计合理,基于Netty的各种应用服务器和协议栈开发才能够如雨后春笋般得到快速发展。

    2.2 架构特点

    2.2.1 高性能

    性能是设计出来的,而不是测试出来的

    • 采用异步非阻塞I/O类库,基于Reactor模型实现,解决了传统同步阻塞I/O模式下一个服务器无法平滑地处理线性增长的客户端问题
    • TCP接收和发送缓冲区使用直接内存代替堆内存,避免了内存复杂,提高读写性能
    • 通过内存池循环利用ByteBuf,避免频繁创建和销毁带来的性能损耗
    • 可配置的IO线程数、TCP参数
    • 采用环形数组缓冲区实现无锁化并发编程
    • 关键资源使用单线程串行化方式
    • 通过引入计数器及时地申请释放不再被引用的对象,细粒度的内存管理,减少GC

    2.2.2 可靠性

    • 链路有效性检测

      心跳机制进行检测:空闲时检测,事件通知

    • 内存保护机制

      计数器、重用、上限

    • 优雅停机

    2.2.3 可定制扩展性

    • 责任链模式
    • 基于接口开发
    • 提供了大量工厂类
    • 提供了大量的可配置参数

    3. 应用

    • 在互联网中的应用:Dubbo

      1. 提供异步、高性能的NIO的通信框架

      2. NIO客户端和服务端

      3. 心跳检测能力

      4. 断连重连机制

      5. 流量控制

      6. Dubbo协议的编解码

    • 大数据领域的应用:Apache Avro

      1. 提供异步、高性能的NIO的通信框架

      2. NIO客户端和服务端

      3. 心跳检测能力

      4. 断连重连机制

      5. 流量控制

    • 游戏服务器的应用

      1. 为各进程提供高性能的异步网络通信能力

      2. 自定义协议的编解码

      3. 心跳检测、流量整形、日志统计

      4. SSL、黑白名单

      5. 内存池技术保证最大限度重用对象

    4. 未来发展

    • 广泛的应用

    • 深入的技术演进

      1. 支持Android
      2. 简化处理器层次
      3. 更简单更精确的缓冲区泄漏追踪
      4. 更灵活的线程模型
      5. ...
    • 活跃的社区

      最后的提交在两小时前

    • 明确的Road Map

      4.x

      5.x

  • 相关阅读:
    python 得到请求的返回内容
    pyhton编码解码理解
    .NET数据库编程求索之路--1.引子
    (转)C#调用C函数(DLL)传递参数问题
    C# 如何在Excel 动态生成PivotTable
    高效Web开发的10个jQuery代码片段
    关于大型网站技术演进的思考(一)--存储的瓶颈(1)
    100. Same Tree
    226. Invert Binary Tree
    169. Majority Element
  • 原文地址:https://www.cnblogs.com/TomSnail/p/6122433.html
Copyright © 2011-2022 走看看