Netty 使用和常用组件

简述

<dependency>
 	<groupId>io.netty</groupId>
 	<artifactId>netty-all</artifactId
 	<version>4.1.42.Final </version>
 	<scope>compile</scope>
</dependency>

Netty 的优势

1、API 使用简单,开发门槛低;
2、功能强大,预置了多种编解码功能,支持多种主流协议;
3、定制能力强,可以通过 ChannelHandler 对通信框架进行灵活地扩展;
4、性能高,通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优;
5、成熟、稳定,Netty 修复了已经发现的所有 JDK NIO BUG,业务开发人员不需要再为
NIO 的 BUG 而烦恼;
6、社区活跃,版本迭代周期短,发现的 BUG 可以被及时修复,同时,更多的新功能会
加入;
7、经历了大规模的商业应用考验,质量得到验证。

为什么 Netty 使用 NIO 而不是 AIO

  Netty 不看重 Windows 上的使用,在 Linux 系统上,AIO 的底层实现仍使用 EPOLL,没有
很好实现 AIO,因此在性能上没有明显的优势,而且被 JDK 封装了一层不容易深度优化。
  AIO 还有个缺点是接收数据需要预先分配缓存, 而不是 NIO 那种需要接收时才需要分配
缓存, 所以对连接数量非常大但流量小的情况, 内存浪费很多。
  而且 Linux 上 AIO 不够成熟,处理回调结果速度跟不上处理需求。

第一个 Netty 程序

Bootstrap、EventLoop(Group) 、Channel

  Bootstrap 是 Netty 框架的启动类和主入口类,分为客户端类 Bootstrap 和服务器类ServerBootstrap 两种。
  Channel 是 Java NIO 的一个基本构造。
它代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执行一个或者多个不同的 I/O 操作的程序组件)的开放连接,如读操作和写操作
  目前,可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。因此,它可以被打开或者被关闭,连接或者断开连接。
  EventLoop 暂时可以看成一个线程、EventLoopGroup 自然就可以看成线程组。

事件和 ChannelHandler、ChannelPipeline

  Netty 使用不同的事件来通知我们状态的改变或者是操作的状态。这使得我们能够基于已经发生的事件来触发适当的动作。
  Netty 事件是按照它们与入站或出站数据流的相关性进行分类的。
  可能由入站数据或者相关的状态更改而触发的事件包括: 连接已被激活或者连接失活;数据读取;用户事件;错误事件。
  出站事件是未来将会触发的某个动作的操作结果,这些动作包括:打开或者关闭到远程节点的连接;将数据写到或者冲刷到套接字。
  每个事件都可以被分发给 ChannelHandler 类中的某个用户实现的方法,既然事件分为入站和出站,用来处理事件的 ChannelHandler 也被分为可以处理入站事件的 Handler 和出站事件的 Handler,当然有些 Handler 既可以处理入站也可以处理出站。
  Netty 提供了大量预定义的可以开箱即用的 ChannelHandler 实现,包括用于各种协议(如 HTTP 和 SSL/TLS)的 ChannelHandler。
  基于 Netty 的网络应用程序中根据业务需求会使用 Netty 已经提供的 ChannelHandler 或者自行开发 ChannelHandler,这些 ChannelHandler 都放在 ChannelPipeline 中统一管理,事件就会在 ChannelPipeline 中流动,并被其中一个或者多个 ChannelHandler 处理。

你可能感兴趣的:(ZK&Netty,zookeeper)