1.1.1 netty简介
- Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能服务器和客户端。
- Netty 是一个 NIO 客户机-服务器框架,它支持快速、简单地开发网络应用程序,如服务器和客户机。它大大简化了网络编程,如 TCP 和 UDP 套接字服务器。
- “快速和简单”并不意味着生成的应用程序将受到可维护性或性能问题的影响。Netty
经过精心设计,并积累了许多协议(如 ftp、smtp、http)的实施经验,以及各种二进
制和基于文本的遗留协议。因此,Netty 成功地找到了一种方法,在不妥协的情况下实
现了易于开发、性能、稳定性和灵活性。
1.1.2 谁在使用netty
Dubbo、zk、RocketMQ、ElasticSearch、Spring5(对 HTTP 协议的实现)、GRpc、Spark 等大
型开源项目都在使用 Netty 作为底层通讯框架。
1.1.3 Netty 中的核心概念
(1) channel
- 管道,其是对 Socket 的封装,其包含了一组 API,大大简化了直接与 Socket 进行操作的
复杂性。
(2) EventLoopGroup
- EventLoopGroup 是一个 EventLoop 池,包含很多的 EventLoop。
- Netty 为每个 Channel 分配了一个 EventLoop,用于处理用户连接请求、对用户请求的处理等所有事件。EventLoop 本身只是一个线程驱动,在其生命周期内只会绑定一个线程,让该线程处理一个 Channel 的所有 IO 事件。
- 一个 Channel 一旦与一个 EventLoop 相绑定,那么在 Channel 的整个生命周期内是不能 改变的。一个EventLoop 可以与多个 Channel 绑定。即 Channel 与 EventLoop 的关系是 n:1, 而EventLoop 与线程的关系是 1:1。
(3)ServerBootStrap
- 用于配置整个 Netty 代码,将各个组件关联起来。服务端使用的是 ServerBootStrap,而
客户端使用的是则 BootStrap。
(4)ChannelHandler 与 ChannelPipeline
- ChannelHandler 是对 Channel 中数据的处理器,这些处理器可以是系统本身定义好的编
解码器,也可以是用户自定义的。这些处理器会被统一添加到一个 ChannelPipeline 的对象中,然后按照添加的顺序对 Channel 中的数据进行依次处理。
(5)ChannelFuture
- Netty 中所有的 I/O 操作都是异步的,即操作不会立即得到返回结果,所以 Netty 中定义
了一个 ChannelFuture 对象作为这个异步操作的“代言人”,表示异步操作本身。如果想获取到该异步操作的返回值,可以通过该异步操作对象的 addListener()方法为该异步操作添加监听器,为其注册回调:当结果出来后马上调用执行。 - Netty 的异步编程模型都是建立在 Future 与回调概念之上的。
1.1.4 Netty 执行流程
- Server启动,Netty从parentGroup中选出一个NioEventLoop对指定port的连接进行监听
- Client启动,Netty从eventLoopGroup中选出一个NioEventLoop对连接的server并处理server发送过来的数据
- Client连接指定Server的port,创建channel
- Netty从childGroup中选出一个NioEventLoop与该channel绑定,用于处理该channel中的所有操作
- Client通过channel向Server发送数据包
- pipeline中的处理器一次对Channel中的数据包进行处理
- Server如需向Client发送数据,则需将数据经pipeline中的处理器处理成Bytebuf数据包
- Server将数据包通过Channel发送给client
- Client端pipeline中的处理器依次对channel中的数据包进行处理