Java之飞鸽传书 - Netty

万物互联是现在乃至未来的趋势. 只要互联就需要网络,不管是无线还是有线。只要牵涉到联网,就牵涉到两台机器上的应用程序之间的通信。 只要是通信,我们就需要又快又好的进行通信。那么应该有一个事物来做这样基础的事情,这样开发者可以专注于写业务逻辑.
这个事物就是Netty. 当然Netty不是进行Java进行网络通信的唯一选择,我们自己也可以写一个网络编程框架,但在此刻,它是网络通信框架领域那颗最耀眼的明星,这就是影响力,必须承认它的人气。当我们讨论Java网络编程框架的时候,Netty是一个绕不过去的话题. 让我来沏一杯茶,闲言碎语几句.

  • 背景
  • 什么是Netty?
  • 为什么是Netty?
  • Netty是如何实现的?
  • Netty的实践
  • 网络编程框架的将来

背景

Netty是2004年由韩国人trustin lee开发出来的,同时他也是mina的作者. Netty到现在为止已经由16年的历史,我有理由相信它会继续存活16年

什么是Netty?

Netty是

  • 网络编程框架 - Netty解决问题的领域是网络,非网络的它不关心.
  • 异步和基于事件驱动的
  • 容易使用,性能好 - 开发者视角
  • 开发服务器和客户端 - 意味着Netty的使用场景不是单机

为什么是Netty?

截止当前这个时间点,github上还有406个问题是open的, 关闭了4810问题, 如果除以16,那么就是1年300个问题,一天一个问题。这也能说明一个问题,网络编程领域的炸弹和坑有很多,不要掉以轻心.

为什么不是JDK NIO?

Netty的技能包比JDK NIO多

  • 支持多种传输层协议
  • 解决了粘包,半包现象
  • 流量控制,黑白名单
  • 处理各种个样的异常,比如断连,异常
    • 这让我想起了Jquery, Jquery屏蔽了各种浏览器的差异,提供了一个统一的接口给用户操作DOM.

JDK NIO 本身有很多bug, 约为5000个左右.
这里说明了两个问题:

  • 开发者直接使用JDK NIO是不明智的选择
  • 开发者开发一个网络编程框架也是一个不明智的选择

Netty是如何实现的?

  • Netty设计哲学

    • API让人用起来舒服, 这个是针对使用者的 - 这种舒服应该符合用户的感性和直觉,就好像做西红柿炒蛋的时候,放好鸡蛋之后接着放西红柿。
    • 实现让人舒服 - 这个是针对维护者的.

      The answer is the philosophy it is built on. Netty is designed to give you the most comfortable experience both in terms of the API and the implementation from the day one. It is not something tangible but you will realize that this philosophy will make your life much easier as you read this guide and play with Netty.

  • Netty是基于Reactor模式实现的

    • 单Reactor单线程
    • 单Reactor多线程
    • 主从Reactor多线程
  • Netty用到的设计模式

    • 单例 - ReadTimeOutException#INSTANCE
    • 工厂 - ReflectiveChannelFatory
    • 策略 - EventExcutorChooser
    • 装饰 - WrappedByteBuf
    • 模板 - AbstracTrafficShapingHandler
    • 职责链 - ChannelPipeline
    • 构造者 - WebSocketServerProtocolConfig.Builder
    • 观察者 - ChannelFuture#AddListener
  • 从框架设计角度,Netty的核心概念是

    • Channel - 可以理解为任意两点之间的连接.
    • EventLoop - Channel和EventLoop是多对一的关系,EventLoop和线程是一对一的关系,也就是一个Chanenel接连对应一个稳定的线程, 这样的好处是事件处理是单线程,避免并发问题. Channel通过事件的方式给EventLoop发送消息.
    • EventLoopGroup - 对EventLoop从功能的角度进行分类
      • bossGroup - 专门用来处理连接
        • bossGroup连接处理完成之后,要将连接交给workGroup,这到底选择哪个EventLoop呢?Netty使用的是轮询算法.
      • workerGroup - 专门用来处理读和写
    • ServerBootStrap
    • ChannelHandler和ChannelPipeline
      • ChannelHandler - 事件的处理者,比如做一些业务代码处理
      • ChannelPipeline - 指定事件的处理顺序,先处理第一件事情,然后处理第二件事件, 换言之就是管理秩序.
      • ChannelHandlerContext - 用于ChannelHandler和ChannelPipeline之间的交互.
    • ChannelFuture
  • Netty的执行流程 - 这个流程的步数是奇数,首尾对称.

    • 启动服务
    • 打开连接
    • 接受数据
    • 数据处理
    • 发送数据
    • 关闭连接
    • 关闭服务
  • Netty逻辑架构图

  • Netty功能图

Netty的实践

网络编程框架的未来