阅读 73

netty-概述

问题

  1. 什么是netty
  2. netty开发步骤
  3. netty性能之道

什么是netty

  1. Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架

  2. 为什么要用netty?

    • 原生 NIO 存在问题: 不好用,太简单,有bug。
      1. NIO 的类库和 API 繁杂
      2. 需要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,必须对多线程和网络编程非常熟悉, 才能编写出高质量的 NIO 程序
      3. 开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常  流的处理等等处理起来难度会比较大。
      4. JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU 100%。直到 JDK 1.7 版本该问题仍旧存在,没有被根本解决。
      5. 代码示例
        nio:www.cnblogs.com/jing99/p/12…
        netty:没有代码!
  3. netty的结构

  • 组件图 image.png
  • 分层架构图
    image.png
  • bootstrap, eventLoop, channel, channelHandler,channelPipeline, bytebuf

netty开发的步骤

  1. 创建服务器
  2. 编解码及对应编解码器
  3. 具体的协议解析与开发

netty高性能之道

reactor线程模型

  1. 什么是reactor线程模型 Reactor模式是一种典型的事件驱动的编程模型,Reactor逆置了程序处理的流程,其基本的思想即为Hollywood Principle— 'Don't call us, we'll call you'.
    Reactor事件处理机制为:主程序将事件以及对应事件处理的方法在Reactor上进行注册, 如果相应的事件发生,Reactor将会主动调用事件注册的接口,即 回调函数

  2. netty线程模型介绍

    1. 单线程reactor image.png
    2. 多线程reactor
      image.png
    3. 主从reactor(netty使用的线程模型) image.png

同步非阻塞io(io多路复用io)

  1. io多路服用主要依赖于操作系统内核提供的poll/epoll函数、以下为两者的主要流程:

image.png 2. 需要认知一个硬件:DMA(用于将输入设备缓冲区中数据拷贝到系统内存(pagecache)中) -- 释放了宝贵的cpu资源
3. poll/epoll整体流程:网卡收到数据后,由DMA将数据搬运到系统内存中,将对应tcp通道加入就绪列表。应用线程遍历列表获取到对应的可读数据,将系统内存数据读取到应用内存中。因此一次遍历即可将多tcp通道数据加载进应用内存中。

无锁化串行设计

  1. channelPipeline设计
    • 使用了责任链模式
    • 在当前节点操作完后,通过执行fireXXX(具体的方法)调用下一个节点的动作
    • 除非用户主动切换,全程为单线程完成
      • 为什么延时高会打炸dubbo?打炸哪里?

image.png

耗时操作的处理

  1. 需要获取操作结果 -- 使用function及对应的listener。
  2. 耗时操作 -- 另外的业务线程池

ByteBuf 与 内存池 与 零拷贝

/

高效的并发编程

高性能的序列化框架

后续计划

  1. netty-io: 关于底层的io相关的内容,netty-io层到底帮你做了啥? Epoll Bug 是啥,怎么解决的?从底层出发解析一个请求如何被服务器识别且进行响应?
  2. netty内存管理: ByteBuf设计 与 内存池的应用 与 零拷贝相关问题
文章分类
后端
文章标签