出版社: 人民邮电出版社
出品方: 异步图书
副标题: Netty IN ACTION
原作名: Netty IN ACTION
译者: 何品
出版年: 2017-5-1
页数: 276
定价: 69.00
装帧: 平装
ISBN: 9787115453686
内容简介 · · · · · ·
编辑推荐
- Netty之父”Trustin Lee作序推荐
- 阿里巴巴中间件高级技术专家为本书中文版作序推荐
- 系统而详细地介绍了Netty的各个方面并附带了即用型的优质示例
- 附带行业一线公司的案例研究
- 极实用的Netty技术书
无论是构建高性能的Web、游戏服务器、推送系统、RPC框架、消息中间件还是分布式大数据处理引擎,都离不开Netty,在整个行业中,Netty广泛而成功的应用,使其成为了Java高性能网络编程的卓绝框架。
Netty的现Tech Lead Norman在本书中循序渐进地讲解了Netty的各个关键部分,在看完本书后,你不但可以熟练地使用Netty来构建以上系统,并且还可以避免很多常见的陷阱。
无论是想要学习Spring 5 、Spark、Cassandra等这样的系统,还是通过学习Netty来构建自己的基于Jav...
编辑推荐
- Netty之父”Trustin Lee作序推荐
- 阿里巴巴中间件高级技术专家为本书中文版作序推荐
- 系统而详细地介绍了Netty的各个方面并附带了即用型的优质示例
- 附带行业一线公司的案例研究
- 极实用的Netty技术书
无论是构建高性能的Web、游戏服务器、推送系统、RPC框架、消息中间件还是分布式大数据处理引擎,都离不开Netty,在整个行业中,Netty广泛而成功的应用,使其成为了Java高性能网络编程的卓绝框架。
Netty的现Tech Lead Norman在本书中循序渐进地讲解了Netty的各个关键部分,在看完本书后,你不但可以熟练地使用Netty来构建以上系统,并且还可以避免很多常见的陷阱。
无论是想要学习Spring 5 、Spark、Cassandra等这样的系统,还是通过学习Netty来构建自己的基于Java的高性能网络框架,或者是更加具体的高性能Web或者游戏服务器等,本书都将是你的超强拍档。
本书中文版基于Netty4.1.9做了修订,希望本书能够给你带来一个接近完美的阅读体验,并能帮到你。
内容提要
本书是为想要或者正在使用Java从事高性能网络编程的人而写的,循序渐进地介绍了Netty各个方面的内容。
本书共分为4个部分:第一部分详细地介绍Netty的相关概念以及核心组件,第二部分介绍自定义协议经常用到的编解码器,第三部分介绍Netty对于应用层高级协议的支持,会覆盖常见的协议及其在实践中的应用,第四部分是几个案例研究。此外,附录部分还会简单地介绍Maven,以及如何通过使用Maven编译和运行本书中的示例。
阅读本书不需要读者精通Java网络和并发编程。如果想要更加深入地理解本书背后的理念以及Netty源码本身,可以系统地学习一下Java网络编程、NIO、并发和异步编程以及相关的设计模式。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
作者简介 · · · · · ·
Norman Maurer,是苹果公司的资深软件工程师,同时也是Netty的核心开发人员。
Marvin Allen Wolfthal,是Dell Services的顾问,他使用Netty实现了多个任务关键型的企业系统。
何品,目前是淘宝的一名资深软件工程师,热爱网络、并发、异步相关的主题以及函数式编程,同时也是Netty、Akka等项目的贡献者,活跃于Scala社区,目前也在从事GraphQL相关的开发工作。
目录 · · · · · ·
第1 章 Netty——异步和事件驱动 3
1.1 Java 网络编程 4
1.1.1 Java NIO 5
1.1.2 选择器 6
1.2 Netty 简介 6
· · · · · · (更多)
第1 章 Netty——异步和事件驱动 3
1.1 Java 网络编程 4
1.1.1 Java NIO 5
1.1.2 选择器 6
1.2 Netty 简介 6
1.2.1 谁在使用Netty 7
1.2.2 异步和事件驱动 8
1.3 Netty 的核心组件 9
1.3.1 Channel 9
1.3.2 回调 9
1.3.3 Future 10
1.3.4 事件和ChannelHandler 11
1.3.5 把它们放在一起 12
1.4 小结 13
第2 章 你的第一款Netty应用程序 14
2.1 设置开发环境 14
2.1.1 获取并安装Java 开发工具包 14
2.1.2 下载并安装IDE 15
2.1.3 下载和安装Apache Maven 15
2.1.4 配置工具集 16
2.2 Netty 客户端/服务器概览 16
2.3 编写Echo 服务器 17
2.3.1 ChannelHandler 和业务逻辑 17
2.3.2 引导服务器 18
2.4 编写Echo 客户端 21
2.4.1 通过ChannelHandler 实现客户端逻辑 21
2.4.2 引导客户端 22
2.5 构建和运行Echo 服务器和客户端 24
2.5.1 运行构建 24
2.5.2 运行Echo 服务器和客户端 27
2.6 小结 29
第3 章 Netty 的组件和设计 30
3.1 Channel、EventLoop 和ChannelFuture 30
3.1.1 Channel 接口 31
3.1.2 EventLoop 接口 31
3.1.3 ChannelFuture 接口 32
3.2 ChannelHandler 和ChannelPipeline 32
3.2.1 ChannelHandler 接口 32
3.2.2 ChannelPipeline 接口 33
3.2.3 更加深入地了解ChannelHandler 34
3.2.4 编码器和解码器 35
3.2.5 抽象类SimpleChannelInboundHandler 35
3.3 引导 36
3.4 小结 37
第4 章 传输 38
4.1 案例研究:传输迁移 38
4.1.1 不通过Netty 使用OIO和NIO 39
4.1.2 通过Netty 使用OIO和NIO 41
4.1.3 非阻塞的Netty 版本 42
4.2 传输API 43
4.3 内置的传输 45
4.3.1 NIO——非阻塞I/O 46
4.3.2 Epoll——用于Linux的本地非阻塞传输 47
4.3.3 OIO——旧的阻塞I/O 48
4.3.4 用于JVM 内部通信的Local 传输 48
4.3.5 Embedded 传输 49
4.4 传输的用例 49
4.5 小结 51
第5 章 ByteBuf 52
5.1 ByteBuf 的API 52
5.2 ByteBuf 类——Netty的数据容器 53
5.2.1 它是如何工作的 53
5.2.2 ByteBuf 的使用模式 53
5.3 字节级操作 57
5.3.1 随机访问索引 57
5.3.2 顺序访问索引 57
5.3.3 可丢弃字节 58
5.3.4 可读字节 58
5.3.5 可写字节 59
5.3.6 索引管理 59
5.3.7 查找操作 60
5.3.8 派生缓冲区 60
5.3.9 读/写操作 62
5.3.10 更多的操作 64
5.4 ByteBufHolder 接口 65
5.5 ByteBuf 分配 65
5.5.1 按需分配:ByteBufAllocator 接口 65
5.5.2 Unpooled 缓冲区 67
5.5.3 ByteBufUtil 类 67
5.6 引用计数 67
5.7 小结 68
第6 章 ChannelHandler 和ChannelPipeline 70
6.1 ChannelHandler 家族 70
6.1.1 Channel 的生命周期 70
6.1.2 ChannelHandler的生命周期 71
6.1.3 ChannelInboundHandler接口 71
6.1.4 ChannelOutboundHandler接口 73
6.1.5 ChannelHandler 适配器 74
6.1.6 资源管理 74
6.2 ChannelPipeline 接口 76
6.2.1 修改ChannelPipeline 78
6.2.2 触发事件 79
6.3 ChannelHandlerContext接口 80
6.3.1 使用ChannelHandlerContext 82
6.3.2 ChannelHandler 和ChannelHandlerContext 的高级用法 84
6.4 异常处理 86
6.4.1 处理入站异常 86
6.4.2 处理出站异常 87
6.5 小结 88
第7 章 EventLoop 和线程模型 89
7.1 线程模型概述 89
7.2 EventLoop 接口 90
7.2.1 Netty 4 中的I/O 和事件处理 92
7.2.2 Netty 3 中的I/O 操作 92
7.3 任务调度 93
7.3.1 JDK 的任务调度API 93
7.3.2 使用EventLoop调度任务 94
7.4 实现细节 95
7.4.1 线程管理 95
7.4.2 EventLoop/线程的分配 96
7.5 小结 98
第8 章 引导 99
8.1 Bootstrap 类 99
8.2 引导客户端和无连接协议 101
8.2.1 引导客户端 102
8.2.2 Channel 和EventLoopGroup 的兼容性 103
8.3 引导服务器 104
8.3.1 ServerBootstrap 类 104
8.3.2 引导服务器 105
8.4 从Channel引导客户端 107
8.5 在引导过程中添加多个ChannelHandler 108
8.6 使用Netty 的ChannelOption 和属性 110
8.7 引导DatagramChannel 111
8.8 关闭 112
8.9 小结 112
第9 章 单元测试 113
9.1 EmbeddedChannel概述 113
9.2 使用EmbeddedChannel测试ChannelHandler 115
9.2.1 测试入站消息 115
9.2.2 测试出站消息 118
9.3 测试异常处理 119
9.4 小结 121
第二部分 编解码器
第10 章 编解码器框架 125
10.1 什么是编解码器 125
10.2 解码器 125
10.2.1 抽象类ByteToMessageDecoder 126
10.2.2 抽象类ReplayingDecoder 127
10.2.3 抽象类MessageToMessageDecoder 128
10.2.4 TooLongFrameException 类 130
10.3 编码器 131
10.3.1 抽象类MessageToByteEncoder 131
10.3.2 抽象类MessageToMessageEncoder 132
10.4 抽象的编解码器类 133
10.4.1 抽象类ByteToMessageCodec 133
10.4.2 抽象类MessageToMessageCodec 134
10.4.3 CombinedChannelDuplexHandler 类 137
10.5 小结 138
第11 章 预置的ChannelHandler和编解码器 139
11.1 通过SSL/TLS 保护Netty 应用程序 139
11.2 构建基于Netty 的HTTP/HTTPS 应用程序 141
11.2.1 HTTP 解码器、编码器和编解码器 141
11.2.2 聚合HTTP 消息 143
11.2.3 HTTP 压缩 144
11.2.4 使用HTTPS 145
11.2.5 WebSocket 146
11.3 空闲的连接和超时 148
11.4 解码基于分隔符的协议和基于长度的协议 150
11.4.1 基于分隔符的协议 150
11.4.2 基于长度的协议 153
11.5 写大型数据 155
11.6 序列化数据 1 57
11.6.1 JDK 序列化 157
11.6.2 使用JBoss Marshalling进行序列化 157
11.6.3 通过Protocol Buffers序列化 159
11.7 小结 160
第三部分 网络协议
第12 章 WebSocket 163
12.1 WebSocket 简介 163
12.2 我们的WebSocket 示例应用程序 164
12.3 添加WebSocket支持 165
12.3.1 处理HTTP 请求 165
12.3.2 处理WebSocket 帧 168
12.3.3 初始化ChannelPipeline 169
12.3.4 引导 171
12.4 测试该应用程序 173
12.5 小结 176
第13章 使用UDP 广播事件 177
13.1 UDP 的基础知识 177
13.2 UDP 广播 178
13.3 UDP 示例应用程序 178
13.4 消息 POJO:LogEvent 179
13.5 编写广播者 180
13.6 编写监视器 185
13.7 运行LogEventBroadcaster 和LogEventMonitor 187
13.8 小结 189
第四部分 案例研究
第14 章 案例研究,第一部分 193
14.1 Droplr—构建移动服务 193
14.1.1 这一切的起因 193
14.1.2 Droplr 是怎样工作的 194
14.1.3 创造一个更加快速的上传体验 194
14.1.4 技术栈 196
14.1.5 性能 199
14.1.6 小结——站在巨人的肩膀上 200
14.2 Firebase—实时的数据同步服务 200
14.2.1 Firebase 的架构 201
14.2.2 长轮询 201
14.2.3 HTTP 1.1 keep-alive和流水线化 204
14.2.4 控制SslHandler 205
14.2.5 Firebase 小结 207
14.3 Urban Airship—构建移动服务 207
14.3.1 移动消息的基础知识 207
14.3.2 第三方递交 208
14.3.3 使用二进制协议的例子 209
14.3.4 直接面向设备的递交 211
14.3.5 Netty 擅长管理大量的并发连接 212
14.3.6 Urban Airship 小结——跨越防火墙边界 213
14.4 小结 214
第15 章 案例研究,第二部分 215
15.1 Netty 在Facebook 的使用:Nifty 和Swift 215
15.1.1 什么是Thrift 215
15.1.2 使用Netty 改善Java Thrift 的现状 216
15.1.3 Nifty 服务器的设计 217
15.1.4 Nifty 异步客户端的设计 220
15.1.5 Swift:一种更快的构建Java Thrift 服务的方式 221
15.1.6 结果 221
15.1.7 Facebook 小结 224
15.2 Netty 在Twitter的使用:Finagle 224
15.2.1 Twitter 成长的烦恼 224
15.2.2 Finagle 的诞生 224
15.2.3 Finagle 是如何工作的 225
15.2.4 Finagle 的抽象 230
15.2.5 故障管理 231
15.2.6 组合服务 232
15.2.7 未来:Netty 232
15.2.8 Twitter 小结 233
15.3 小结 233
附录 Maven 介绍 234
· · · · · · (收起)
喜欢读"Netty实战"的人也喜欢的电子书 · · · · · ·
喜欢读"Netty实战"的人也喜欢 · · · · · ·
Netty实战的书评 · · · · · · ( 全部 7 条 )

Netty in Action


翻译不咋样, 看的费劲,特地来吐槽!
> 更多书评 7篇
读书笔记 · · · · · ·
我来写笔记-
CSDN文章(有格式和图片):[https://blog.csdn.net/wk52525/article/details/87931437] 一、Netty的概念及体系结构 1.java I/O 阻塞I/O NIO 2.Netty组件简介 Channel Channel 是 Java NIO 的一个基本构造,可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。 基本的 I/O 操作( bind() 、 connect() 、 read() 和 write() )依赖于底层网络传输所提 供的原语。 EventLoop EventLoop 定义了 Netty 的核心抽象,用...
2019-11-08 09:58:04
CSDN文章(有格式和图片):https://blog.csdn.net/wk52525/article/details/87931437
一、Netty的概念及体系结构
1.java I/O
阻塞I/O
NIO
2.Netty组件简介
Channel
Channel 是 Java NIO 的一个基本构造,可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。
基本的 I/O 操作( bind() 、 connect() 、 read() 和 write() )依赖于底层网络传输所提 供的原语。
EventLoop
EventLoop 定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件。
一个 EventLoopGroup 包含一个或者多个 EventLoop
一个EventLoop在它的生命周期内只和一个Thread绑定
所有由 EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理
一个Channel在它的生命周期内只注册于一个EventLoop
一个 EventLoop 可能会被分配给一个或多个 Channel
ChannelFuture
Netty 中所有的 I/O 操作都是异步的。因为一个操作可能不会立即返回,Netty 提供了 ChannelFuture 接口,其 addListener() 方法注册了一个 ChannelFutureListener ,监听器的回调方法operationComplete(),将会在对应的操作完成时被调用 。然后监听器可以判断该操作是成功地完成了还是出错了。
ChannelHandler
Netty 使用不同的事件来通知我们状态的改变或者是操作的状态,每个事件都可以被分发给 ChannelHandler 类中的某个用户实现的方法。
ChannelPipeline
ChannelPipeline 提供了 ChannelHandler 链的容器,并定义了用于在该链上传播入站 和出站事件流的 API。当 Channel 被创建时,它会被自动地分配到它专属的 ChannelPipeline 。
ChannelHandler安装到 ChannelPipeline 中的过程:
一个 ChannelInitializer 的实现被注册到了 ServerBootstrap 中 ;
当ChannelInitializer.initChannel() 方法被调用时,ChannelInitializer 将在 ChannelPipeline 中安装一组自定义的ChannelHandler;
ChannelInitializer 将它自己从ChannelPipeline 中移除。
在 Netty 中,有两种发送消息的方式。你可以直接写到 Channel 中,也可以 写到和 ChannelHandler 相关联的 ChannelHandlerContext 对象中。前一种方式将会导致消息从 ChannelPipeline 的尾端开始流动,而后者将导致消息从 ChannelPipeline 中的下一个 ChannelHandler 开始流动。
Bootstrap
服务器需要两组不同的 Channel 。第一组将只包含一个 ServerChannel ,代表服务 器自身的已绑定到某个本地端口的正在监听的套接字。而第二组将包含所有已创建的用来处理传 入客户端连接(对于每个服务器已经接受的连接都有一个)的 Channel。
与 ServerChannel 相关联的 EventLoopGroup 将分配一个负责为传入连接请求创建 Channel 的 EventLoop 。一旦连接被接受,第二个 EventLoopGroup 就会给它的 Channel 分配一个 EventLoop
3.传输
NIO传输
4.ByteBuf - Netty的数据容器
ByteBuf 维护了两个不同的索引:一个用于读取,一个用于写入。当你从 ByteBuf 读取时, 它的 readerIndex 将会被递增已经被读取的字节数。同样地,当你写入 ByteBuf 时,它的 writerIndex 也会被递增。
名称以 read 或者 write 开头的 ByteBuf 方法,将会推进其对应的索引,而名称以 set 或者 get 开头的操作则不会。后面的这些方法将在作为一个参数传入的一个相对索引上执行操作。
使用模式
堆缓冲区
最常用的 ByteBuf 模式是将数据存储在 JVM 的堆空间中。 这种模式被称为支撑数组 (backing array),它能在没有使用池化的情况下提供快速的分配和释放。这种方式非常适合于有遗留的数据需要处理的情况。
直接缓冲区
直接缓冲区的内容将驻留在常规的会被垃圾回收的堆之外。这对于网络数据传输是理想的选择,因为JVM在通过套接字发送数据时会在内部把堆上缓冲区的数据复制到一个直接缓冲区中。主要缺点是,相对于基于堆的缓冲区,它们的分配和释放都较为昂贵。
复合缓冲区
字节级操作
索引访问、读/写字节、索引管理、查找...
ByteBufHolder
为 Netty 的高级特性提供了支持,如缓冲区池化,其中可以从池中借用 ByteBuf ,并且在需要时自动释放。
ByteBuf 分配
ByteBufAllocator 接口:按需分配
Unpooled 缓冲区
ByteBufUtil 类
5.ChannelHandler和ChannelPipeline
Channel生命周期
registered->active->inactive->unregistered
资源管理
每当通过调用 ChannelInboundHandler.channelRead() 或者 ChannelOutboundHandler.write() 方法来处理数据时,你都需要确保没有任何的资源泄漏
通过调用 ReferenceCountUtil.release() 方法释放资源
ByteToMessageDecoder的channelRead()中默认会release(),所以自定义解码可继承此类并重写decode(),否则需手动release()
ChannelPipeline
每一个新创建的 Channel 都将会被分配一个新的 ChannelPipeline 。这项关联是永久性的
ChannelHandlerContext
代表了 ChannelHandler 和 ChannelPipeline 之间的关联,每当有 ChannelHandler 添加到 ChannelPipeline 中时,都会创建 ChannelHandlerContext
二、编解码
1.解码器(实现ChannelInboundHandler)
抽象类 ByteToMessageDecoder
抽象类 ReplayingDecoder
扩展了 ByteToMessageDecoder 类,使我们不必调用 readableBytes() 方法。通过使用一个自定义的 ByteBuf 实现:ReplayingDecoderByteBuf。
抽象类 MessageToMessageDecoder
在两个消息格式之间进行转换(例如从一种 POJO 类型转换为另一种)
LineBasedFrameDecoder
使用了行尾控制字符( \n 或者 \r\n )来解析消息数据
HttpObjectDecoder
HTTP 数据的解码器
2.编码器(实现ChannelOutboundHandler)
抽象类 MessageToByteEncoder
抽象类 MessageToMessageEncoder
3.编解码器类(同时实现ChannelInboundHandler和ChannelOutboundHandler)
抽象类 ByteToMessageCodec
抽象类 MessageToMessageCodec
CombinedChannelDuplexHandler 类
这个类充当了 ChannelInboundHandler 和 ChannelOutboundHandler (该类的类型 参数 I 和 O )的容器。通过提供分别继承了解码器类和编码器类的类型,我们可以实现一个编解码器,而又不必直接扩展抽象的编解码器类。
4.预置的ChannelHandler和编解码器
SSL/TLS
SslHandler:内部使用 SSLEngine
HTTP/HTTPS
HttpObjectDecoder
HttpRequestEncoder/Decoder(继承HttpObjectDecoder)
HttpResponseEncoder/Decoder(继承HttpObjectDecoder)
HttpRequestDecoder(聚合上述RequestEncoder/Decoder)
HttpContentDecompressor:HTTP 压缩
WebSocket
WebSocketServerProtocolHandler
空闲的连接和超时
IdleStateHandler:检测空闲时间,触发IdleStateEvent
ReadTimeoutHandler:指定时间间隔无入站数据抛出ReadTimeoutException 并关闭对应的 Channel
WriteTimeoutHandler:指定时间间隔无出站数据抛出WriteTimeoutException 并关闭对应的 Channel
基于分隔符的协议
DelimiterBasedFrameDecoder:由用户提供的分隔符来提取帧
LineBasedFrameDecoder:使用行尾控制字符( \n或者\r\n )来解析
基于长度的协议
FixedLengthFrameDecoder:提取在调用构造函数时指定的定长帧
LengthFieldBasedFrameDecoder:根据编码进帧头部中的长度值提取帧
写大型数据
ChunkedWriteHandler
序列化数据
JDK
CompatibleObjectEecoder/Decoder
ObjectEncoder/Decoder
JBoss Marshalling
CompatibleMarshallingEncoder/Decoer
MarshallingEncoder/Decoder
Protocol Buffers
ProtobufEncoder/Decoder
ProtobufVarint32LengthFieldPrepender
ProtobufVarint32FrameDecoder
5.编解码器中的引用计数
引用计数需要特别的注意。对于编码器和解码器来说:一旦消息被编码或者解码,它就会被 ReferenceCountUtil.release(message) 调用自动释放。如果你需要保留引用以便稍后使用,那么你可以调用 ReferenceCountUtil.retain(message) 方法。这将会增加该引用计数,从而防止该消息被释放。
三、网络协议
1.WebSocket:(一个webSocket服务的示例)
2.UDP:(一个UDP广播服务的示例)
四、案例研究
(主要讲解了各大公司如何使用netty及他们的网络服务架构)
回应 2019-11-08 09:58:04
-
CSDN文章(有格式和图片):[https://blog.csdn.net/wk52525/article/details/87931437] 一、Netty的概念及体系结构 1.java I/O 阻塞I/O NIO 2.Netty组件简介 Channel Channel 是 Java NIO 的一个基本构造,可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。 基本的 I/O 操作( bind() 、 connect() 、 read() 和 write() )依赖于底层网络传输所提 供的原语。 EventLoop EventLoop 定义了 Netty 的核心抽象,用...
2019-11-08 09:58:04
CSDN文章(有格式和图片):https://blog.csdn.net/wk52525/article/details/87931437
一、Netty的概念及体系结构
1.java I/O
阻塞I/O
NIO
2.Netty组件简介
Channel
Channel 是 Java NIO 的一个基本构造,可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。
基本的 I/O 操作( bind() 、 connect() 、 read() 和 write() )依赖于底层网络传输所提 供的原语。
EventLoop
EventLoop 定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件。
一个 EventLoopGroup 包含一个或者多个 EventLoop
一个EventLoop在它的生命周期内只和一个Thread绑定
所有由 EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理
一个Channel在它的生命周期内只注册于一个EventLoop
一个 EventLoop 可能会被分配给一个或多个 Channel
ChannelFuture
Netty 中所有的 I/O 操作都是异步的。因为一个操作可能不会立即返回,Netty 提供了 ChannelFuture 接口,其 addListener() 方法注册了一个 ChannelFutureListener ,监听器的回调方法operationComplete(),将会在对应的操作完成时被调用 。然后监听器可以判断该操作是成功地完成了还是出错了。
ChannelHandler
Netty 使用不同的事件来通知我们状态的改变或者是操作的状态,每个事件都可以被分发给 ChannelHandler 类中的某个用户实现的方法。
ChannelPipeline
ChannelPipeline 提供了 ChannelHandler 链的容器,并定义了用于在该链上传播入站 和出站事件流的 API。当 Channel 被创建时,它会被自动地分配到它专属的 ChannelPipeline 。
ChannelHandler安装到 ChannelPipeline 中的过程:
一个 ChannelInitializer 的实现被注册到了 ServerBootstrap 中 ;
当ChannelInitializer.initChannel() 方法被调用时,ChannelInitializer 将在 ChannelPipeline 中安装一组自定义的ChannelHandler;
ChannelInitializer 将它自己从ChannelPipeline 中移除。
在 Netty 中,有两种发送消息的方式。你可以直接写到 Channel 中,也可以 写到和 ChannelHandler 相关联的 ChannelHandlerContext 对象中。前一种方式将会导致消息从 ChannelPipeline 的尾端开始流动,而后者将导致消息从 ChannelPipeline 中的下一个 ChannelHandler 开始流动。
Bootstrap
服务器需要两组不同的 Channel 。第一组将只包含一个 ServerChannel ,代表服务 器自身的已绑定到某个本地端口的正在监听的套接字。而第二组将包含所有已创建的用来处理传 入客户端连接(对于每个服务器已经接受的连接都有一个)的 Channel。
与 ServerChannel 相关联的 EventLoopGroup 将分配一个负责为传入连接请求创建 Channel 的 EventLoop 。一旦连接被接受,第二个 EventLoopGroup 就会给它的 Channel 分配一个 EventLoop
3.传输
NIO传输
4.ByteBuf - Netty的数据容器
ByteBuf 维护了两个不同的索引:一个用于读取,一个用于写入。当你从 ByteBuf 读取时, 它的 readerIndex 将会被递增已经被读取的字节数。同样地,当你写入 ByteBuf 时,它的 writerIndex 也会被递增。
名称以 read 或者 write 开头的 ByteBuf 方法,将会推进其对应的索引,而名称以 set 或者 get 开头的操作则不会。后面的这些方法将在作为一个参数传入的一个相对索引上执行操作。
使用模式
堆缓冲区
最常用的 ByteBuf 模式是将数据存储在 JVM 的堆空间中。 这种模式被称为支撑数组 (backing array),它能在没有使用池化的情况下提供快速的分配和释放。这种方式非常适合于有遗留的数据需要处理的情况。
直接缓冲区
直接缓冲区的内容将驻留在常规的会被垃圾回收的堆之外。这对于网络数据传输是理想的选择,因为JVM在通过套接字发送数据时会在内部把堆上缓冲区的数据复制到一个直接缓冲区中。主要缺点是,相对于基于堆的缓冲区,它们的分配和释放都较为昂贵。
复合缓冲区
字节级操作
索引访问、读/写字节、索引管理、查找...
ByteBufHolder
为 Netty 的高级特性提供了支持,如缓冲区池化,其中可以从池中借用 ByteBuf ,并且在需要时自动释放。
ByteBuf 分配
ByteBufAllocator 接口:按需分配
Unpooled 缓冲区
ByteBufUtil 类
5.ChannelHandler和ChannelPipeline
Channel生命周期
registered->active->inactive->unregistered
资源管理
每当通过调用 ChannelInboundHandler.channelRead() 或者 ChannelOutboundHandler.write() 方法来处理数据时,你都需要确保没有任何的资源泄漏
通过调用 ReferenceCountUtil.release() 方法释放资源
ByteToMessageDecoder的channelRead()中默认会release(),所以自定义解码可继承此类并重写decode(),否则需手动release()
ChannelPipeline
每一个新创建的 Channel 都将会被分配一个新的 ChannelPipeline 。这项关联是永久性的
ChannelHandlerContext
代表了 ChannelHandler 和 ChannelPipeline 之间的关联,每当有 ChannelHandler 添加到 ChannelPipeline 中时,都会创建 ChannelHandlerContext
二、编解码
1.解码器(实现ChannelInboundHandler)
抽象类 ByteToMessageDecoder
抽象类 ReplayingDecoder
扩展了 ByteToMessageDecoder 类,使我们不必调用 readableBytes() 方法。通过使用一个自定义的 ByteBuf 实现:ReplayingDecoderByteBuf。
抽象类 MessageToMessageDecoder
在两个消息格式之间进行转换(例如从一种 POJO 类型转换为另一种)
LineBasedFrameDecoder
使用了行尾控制字符( \n 或者 \r\n )来解析消息数据
HttpObjectDecoder
HTTP 数据的解码器
2.编码器(实现ChannelOutboundHandler)
抽象类 MessageToByteEncoder
抽象类 MessageToMessageEncoder
3.编解码器类(同时实现ChannelInboundHandler和ChannelOutboundHandler)
抽象类 ByteToMessageCodec
抽象类 MessageToMessageCodec
CombinedChannelDuplexHandler 类
这个类充当了 ChannelInboundHandler 和 ChannelOutboundHandler (该类的类型 参数 I 和 O )的容器。通过提供分别继承了解码器类和编码器类的类型,我们可以实现一个编解码器,而又不必直接扩展抽象的编解码器类。
4.预置的ChannelHandler和编解码器
SSL/TLS
SslHandler:内部使用 SSLEngine
HTTP/HTTPS
HttpObjectDecoder
HttpRequestEncoder/Decoder(继承HttpObjectDecoder)
HttpResponseEncoder/Decoder(继承HttpObjectDecoder)
HttpRequestDecoder(聚合上述RequestEncoder/Decoder)
HttpContentDecompressor:HTTP 压缩
WebSocket
WebSocketServerProtocolHandler
空闲的连接和超时
IdleStateHandler:检测空闲时间,触发IdleStateEvent
ReadTimeoutHandler:指定时间间隔无入站数据抛出ReadTimeoutException 并关闭对应的 Channel
WriteTimeoutHandler:指定时间间隔无出站数据抛出WriteTimeoutException 并关闭对应的 Channel
基于分隔符的协议
DelimiterBasedFrameDecoder:由用户提供的分隔符来提取帧
LineBasedFrameDecoder:使用行尾控制字符( \n或者\r\n )来解析
基于长度的协议
FixedLengthFrameDecoder:提取在调用构造函数时指定的定长帧
LengthFieldBasedFrameDecoder:根据编码进帧头部中的长度值提取帧
写大型数据
ChunkedWriteHandler
序列化数据
JDK
CompatibleObjectEecoder/Decoder
ObjectEncoder/Decoder
JBoss Marshalling
CompatibleMarshallingEncoder/Decoer
MarshallingEncoder/Decoder
Protocol Buffers
ProtobufEncoder/Decoder
ProtobufVarint32LengthFieldPrepender
ProtobufVarint32FrameDecoder
5.编解码器中的引用计数
引用计数需要特别的注意。对于编码器和解码器来说:一旦消息被编码或者解码,它就会被 ReferenceCountUtil.release(message) 调用自动释放。如果你需要保留引用以便稍后使用,那么你可以调用 ReferenceCountUtil.retain(message) 方法。这将会增加该引用计数,从而防止该消息被释放。
三、网络协议
1.WebSocket:(一个webSocket服务的示例)
2.UDP:(一个UDP广播服务的示例)
四、案例研究
(主要讲解了各大公司如何使用netty及他们的网络服务架构)
回应 2019-11-08 09:58:04
-
CSDN文章(有格式和图片):[https://blog.csdn.net/wk52525/article/details/87931437] 一、Netty的概念及体系结构 1.java I/O 阻塞I/O NIO 2.Netty组件简介 Channel Channel 是 Java NIO 的一个基本构造,可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。 基本的 I/O 操作( bind() 、 connect() 、 read() 和 write() )依赖于底层网络传输所提 供的原语。 EventLoop EventLoop 定义了 Netty 的核心抽象,用...
2019-11-08 09:58:04
CSDN文章(有格式和图片):https://blog.csdn.net/wk52525/article/details/87931437
一、Netty的概念及体系结构
1.java I/O
阻塞I/O
NIO
2.Netty组件简介
Channel
Channel 是 Java NIO 的一个基本构造,可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。
基本的 I/O 操作( bind() 、 connect() 、 read() 和 write() )依赖于底层网络传输所提 供的原语。
EventLoop
EventLoop 定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件。
一个 EventLoopGroup 包含一个或者多个 EventLoop
一个EventLoop在它的生命周期内只和一个Thread绑定
所有由 EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理
一个Channel在它的生命周期内只注册于一个EventLoop
一个 EventLoop 可能会被分配给一个或多个 Channel
ChannelFuture
Netty 中所有的 I/O 操作都是异步的。因为一个操作可能不会立即返回,Netty 提供了 ChannelFuture 接口,其 addListener() 方法注册了一个 ChannelFutureListener ,监听器的回调方法operationComplete(),将会在对应的操作完成时被调用 。然后监听器可以判断该操作是成功地完成了还是出错了。
ChannelHandler
Netty 使用不同的事件来通知我们状态的改变或者是操作的状态,每个事件都可以被分发给 ChannelHandler 类中的某个用户实现的方法。
ChannelPipeline
ChannelPipeline 提供了 ChannelHandler 链的容器,并定义了用于在该链上传播入站 和出站事件流的 API。当 Channel 被创建时,它会被自动地分配到它专属的 ChannelPipeline 。
ChannelHandler安装到 ChannelPipeline 中的过程:
一个 ChannelInitializer 的实现被注册到了 ServerBootstrap 中 ;
当ChannelInitializer.initChannel() 方法被调用时,ChannelInitializer 将在 ChannelPipeline 中安装一组自定义的ChannelHandler;
ChannelInitializer 将它自己从ChannelPipeline 中移除。
在 Netty 中,有两种发送消息的方式。你可以直接写到 Channel 中,也可以 写到和 ChannelHandler 相关联的 ChannelHandlerContext 对象中。前一种方式将会导致消息从 ChannelPipeline 的尾端开始流动,而后者将导致消息从 ChannelPipeline 中的下一个 ChannelHandler 开始流动。
Bootstrap
服务器需要两组不同的 Channel 。第一组将只包含一个 ServerChannel ,代表服务 器自身的已绑定到某个本地端口的正在监听的套接字。而第二组将包含所有已创建的用来处理传 入客户端连接(对于每个服务器已经接受的连接都有一个)的 Channel。
与 ServerChannel 相关联的 EventLoopGroup 将分配一个负责为传入连接请求创建 Channel 的 EventLoop 。一旦连接被接受,第二个 EventLoopGroup 就会给它的 Channel 分配一个 EventLoop
3.传输
NIO传输
4.ByteBuf - Netty的数据容器
ByteBuf 维护了两个不同的索引:一个用于读取,一个用于写入。当你从 ByteBuf 读取时, 它的 readerIndex 将会被递增已经被读取的字节数。同样地,当你写入 ByteBuf 时,它的 writerIndex 也会被递增。
名称以 read 或者 write 开头的 ByteBuf 方法,将会推进其对应的索引,而名称以 set 或者 get 开头的操作则不会。后面的这些方法将在作为一个参数传入的一个相对索引上执行操作。
使用模式
堆缓冲区
最常用的 ByteBuf 模式是将数据存储在 JVM 的堆空间中。 这种模式被称为支撑数组 (backing array),它能在没有使用池化的情况下提供快速的分配和释放。这种方式非常适合于有遗留的数据需要处理的情况。
直接缓冲区
直接缓冲区的内容将驻留在常规的会被垃圾回收的堆之外。这对于网络数据传输是理想的选择,因为JVM在通过套接字发送数据时会在内部把堆上缓冲区的数据复制到一个直接缓冲区中。主要缺点是,相对于基于堆的缓冲区,它们的分配和释放都较为昂贵。
复合缓冲区
字节级操作
索引访问、读/写字节、索引管理、查找...
ByteBufHolder
为 Netty 的高级特性提供了支持,如缓冲区池化,其中可以从池中借用 ByteBuf ,并且在需要时自动释放。
ByteBuf 分配
ByteBufAllocator 接口:按需分配
Unpooled 缓冲区
ByteBufUtil 类
5.ChannelHandler和ChannelPipeline
Channel生命周期
registered->active->inactive->unregistered
资源管理
每当通过调用 ChannelInboundHandler.channelRead() 或者 ChannelOutboundHandler.write() 方法来处理数据时,你都需要确保没有任何的资源泄漏
通过调用 ReferenceCountUtil.release() 方法释放资源
ByteToMessageDecoder的channelRead()中默认会release(),所以自定义解码可继承此类并重写decode(),否则需手动release()
ChannelPipeline
每一个新创建的 Channel 都将会被分配一个新的 ChannelPipeline 。这项关联是永久性的
ChannelHandlerContext
代表了 ChannelHandler 和 ChannelPipeline 之间的关联,每当有 ChannelHandler 添加到 ChannelPipeline 中时,都会创建 ChannelHandlerContext
二、编解码
1.解码器(实现ChannelInboundHandler)
抽象类 ByteToMessageDecoder
抽象类 ReplayingDecoder
扩展了 ByteToMessageDecoder 类,使我们不必调用 readableBytes() 方法。通过使用一个自定义的 ByteBuf 实现:ReplayingDecoderByteBuf。
抽象类 MessageToMessageDecoder
在两个消息格式之间进行转换(例如从一种 POJO 类型转换为另一种)
LineBasedFrameDecoder
使用了行尾控制字符( \n 或者 \r\n )来解析消息数据
HttpObjectDecoder
HTTP 数据的解码器
2.编码器(实现ChannelOutboundHandler)
抽象类 MessageToByteEncoder
抽象类 MessageToMessageEncoder
3.编解码器类(同时实现ChannelInboundHandler和ChannelOutboundHandler)
抽象类 ByteToMessageCodec
抽象类 MessageToMessageCodec
CombinedChannelDuplexHandler 类
这个类充当了 ChannelInboundHandler 和 ChannelOutboundHandler (该类的类型 参数 I 和 O )的容器。通过提供分别继承了解码器类和编码器类的类型,我们可以实现一个编解码器,而又不必直接扩展抽象的编解码器类。
4.预置的ChannelHandler和编解码器
SSL/TLS
SslHandler:内部使用 SSLEngine
HTTP/HTTPS
HttpObjectDecoder
HttpRequestEncoder/Decoder(继承HttpObjectDecoder)
HttpResponseEncoder/Decoder(继承HttpObjectDecoder)
HttpRequestDecoder(聚合上述RequestEncoder/Decoder)
HttpContentDecompressor:HTTP 压缩
WebSocket
WebSocketServerProtocolHandler
空闲的连接和超时
IdleStateHandler:检测空闲时间,触发IdleStateEvent
ReadTimeoutHandler:指定时间间隔无入站数据抛出ReadTimeoutException 并关闭对应的 Channel
WriteTimeoutHandler:指定时间间隔无出站数据抛出WriteTimeoutException 并关闭对应的 Channel
基于分隔符的协议
DelimiterBasedFrameDecoder:由用户提供的分隔符来提取帧
LineBasedFrameDecoder:使用行尾控制字符( \n或者\r\n )来解析
基于长度的协议
FixedLengthFrameDecoder:提取在调用构造函数时指定的定长帧
LengthFieldBasedFrameDecoder:根据编码进帧头部中的长度值提取帧
写大型数据
ChunkedWriteHandler
序列化数据
JDK
CompatibleObjectEecoder/Decoder
ObjectEncoder/Decoder
JBoss Marshalling
CompatibleMarshallingEncoder/Decoer
MarshallingEncoder/Decoder
Protocol Buffers
ProtobufEncoder/Decoder
ProtobufVarint32LengthFieldPrepender
ProtobufVarint32FrameDecoder
5.编解码器中的引用计数
引用计数需要特别的注意。对于编码器和解码器来说:一旦消息被编码或者解码,它就会被 ReferenceCountUtil.release(message) 调用自动释放。如果你需要保留引用以便稍后使用,那么你可以调用 ReferenceCountUtil.retain(message) 方法。这将会增加该引用计数,从而防止该消息被释放。
三、网络协议
1.WebSocket:(一个webSocket服务的示例)
2.UDP:(一个UDP广播服务的示例)
四、案例研究
(主要讲解了各大公司如何使用netty及他们的网络服务架构)
回应 2019-11-08 09:58:04
论坛 · · · · · ·
在这本书的论坛里发言当前版本有售 · · · · · ·
-
限时抢
以下书单推荐 · · · · · · ( 全部 )
- 网络/Networking (李鼎)
- T (dhcn)
- 分布式系统 (Jackode)
- manning系列 (limlung)
- java分布式系统 (猫王)
谁读这本书?
二手市场
订阅关于Netty实战的评论:
feed: rss 2.0
0 有用 Mark_Lee 2018-01-29 22:38:59
Netty框架,入门介绍,还要再复习
0 有用 青崖 2022-03-07 21:28:40
短小精悍,结构清晰,有图有貌
8 有用 plantegg 2019-07-11 16:58:04
这书烂到家了,无论是翻译后的词汇还是逻辑组织真的很差劲,徒有其名
0 有用 六欲浊流谢晦渊 2018-09-15 18:17:00
写的很清楚,唯一的遗憾是没有对更深一层的代码细节进行深入解读,不过也不重要,毕竟框架就是拿来用的,就这点儿言本书做得很出色
0 有用 ranit 2019-04-16 08:08:14
翻译的不是很流畅,但是不影响阅读。
0 有用 微雨青城 2022-07-24 16:33:56
看完了还是不会用
0 有用 破晓之春 2022-06-26 19:01:24
还好是先看视频学习的,不然直接看这种书,就这质量。肯定一脸懵逼
0 有用 Ruby 2022-06-14 14:01:22
翻译不太好,本来挺简单的一句话翻译出来让人很难理解
0 有用 会划水的鱼 2022-05-15 16:47:06
不错的API讲解指南
0 有用 小乙哥 2022-05-14 23:01:06
可读性很好,对于快去了解netty的原理很有帮助,翻译的流畅性稍微欠点火候,最后几张的案例如果再多点业务背景介绍就好了