1、Hadoop、Storm、Spark、Facebook、Twitter、Ali baba都在使用Java高性能NIO通信框架Netty,本書告訴你Why,通過(guò)本書你可以、系統(tǒng)地理解Netty 架構(gòu)設(shè)計(jì)理念,以及異步NIO 編程。1、Hadoop、Storm、Spark、Facebook、Twitter、Ali baba都在使用Java高性能NIO通信框架Netty,本書告訴你Why,通過(guò)本書你可以、系統(tǒng)地理解Netty 架構(gòu)設(shè)計(jì)理念,以及異步NIO 編程。
2、本書作者為博學(xué)一線專家,在產(chǎn)品中廣泛應(yīng)用了Netty等NIO框架,具有豐富的多年實(shí)踐經(jīng)驗(yàn),這就使得本書內(nèi)容帶有很強(qiáng)的實(shí)踐性,讓你更快速掌握J(rèn)ava高并發(fā)異步通信的優(yōu)先選擇 框架——Netty的用法。
3、本書第1版出版后受到業(yè)界的一致好評(píng),應(yīng)讀者的要求,第2版增加了MessagePack 編解碼、服務(wù)端創(chuàng)建、客戶端創(chuàng)建、高性能之道、性、安全性等內(nèi)容,內(nèi)容更精彩。
Netty是什么?使用Netty能夠做什么?為什么要從傳統(tǒng)的Socket開(kāi)發(fā)切換到NIO進(jìn)行編程?為什么不直接基于JDK的NIO類庫(kù)編程而選擇Netty?如何系統(tǒng)地掌握Netty進(jìn)行NettyNIO開(kāi)發(fā)、Netty編解碼開(kāi)發(fā)、Netty多協(xié)議開(kāi)發(fā)?如何通過(guò)對(duì)Netty源碼的學(xué)習(xí)獲得更深入地知識(shí)?掌握了Netty后,如何將其應(yīng)用到實(shí)際架構(gòu)中?Netty工程師的就業(yè)前景和可涉足的行業(yè)是怎樣的?本書都會(huì)一一解答。
推薦購(gòu)買:
《云計(jì)算網(wǎng)絡(luò)珠璣》
李林鋒:Netty中國(guó)推廣者,現(xiàn)華為技術(shù)有限公司平臺(tái)中間件架構(gòu)與設(shè)計(jì)部設(shè)計(jì)師,公司總裁技術(shù)創(chuàng)新獎(jiǎng)獲得者。長(zhǎng)期從事高性能通信軟件的架構(gòu)設(shè)計(jì)和開(kāi)發(fā)工作,有多年在NIO領(lǐng)域的設(shè)計(jì)、開(kāi)發(fā)和運(yùn)維經(jīng)驗(yàn),精通NIO編程和Netty、Mina等主流NIO框架。目前負(fù)責(zé)華為軟件公司下一代SOA中間件和PaaS平臺(tái)的架構(gòu)設(shè)計(jì)工作。
基礎(chǔ)篇走進(jìn)Java NIO
第1 章Java 的I/O 演進(jìn)之路.2
1.1 I/O 基礎(chǔ)入門...............3
1.1.1 Linux 網(wǎng)絡(luò)I/O 模型簡(jiǎn)介.......3
1.1.2 I/O 多路復(fù)用技術(shù).................6
1.2 Java 的I/O 演進(jìn)..........8
1.3 總結(jié)............................ 10
第2 章NIO 入門.................... 11
2.1 傳統(tǒng)的BIO 編程....... 11
2.1.1 BIO 通信模型圖.................. 12
2.1.2 同步阻塞式I/O 創(chuàng)建的TimeServer 源碼分析............. 13
2.1.3 同步阻塞式I/O 創(chuàng)建的TimeClient 源碼分析.......... 16
2.2 偽異步I/O 編程........ 18
2.2.1 偽異步I/O 模型圖.............. 19
2.2.2 偽異步I/O 創(chuàng)建的TimeServer 源碼分析..... 19
2.2.3 偽異步I/O 弊端分析........... 21
2.3 NIO 編程.................... 24
2.3.1 NIO 類庫(kù)簡(jiǎn)介.. 24
2.3.2 NIO 服務(wù)端序列圖.............. 28
2.3.3 NIO 創(chuàng)建的TimeServer 源碼分析................ 30
2.3.4 NIO 客戶端序列圖.............. 36
2.3.5 NIO 創(chuàng)建的TimeClient 源碼分析................ 39
2.4 AIO 編程.................... 45
2.4.1 AIO 創(chuàng)建的TimeServer 源碼分析................ 46
2.4.2 AIO 創(chuàng)建的TimeClient 源碼分析................ 51
2.4.3 AIO 版本時(shí)間服務(wù)器運(yùn)行結(jié)果.................... 56
2.5 4 種I/O 的對(duì)比......... 58
2.5.1 概念澄清.......... 58
2.5.2 不同I/O 模型對(duì)比.............. 59
2.6 選擇Netty 的理由..... 60
2.6.1 不選擇Java 原生NIO 編程的原因............... 61
2.6.2 為什么選擇Netty ................ 62
2.7 總結(jié)............................ 63
入門篇 Netty NIO 開(kāi)發(fā)指南
第3 章Netty 入門應(yīng)用.......... 66
3.1 Netty 開(kāi)發(fā)環(huán)境的搭建................ 66
3.1.1 下載Netty 的軟件包........... 67
3.1.2 搭建Netty 應(yīng)用工程........... 67
3.2 Netty 服務(wù)端開(kāi)發(fā)...... 68
3.3 Netty 客戶端開(kāi)發(fā)...... 73
3.4 運(yùn)行和調(diào)試................ 76
3.4.1 服務(wù)端和客戶端的運(yùn)行...... 76
3.4.2 打包和部署...... 77
3.5 總結(jié)............................ 77
第4 章TCP 粘包/拆包問(wèn)題的解決之道...... 79
4.1 TCP 粘包/拆包.......... 79
4.1.1 TCP 粘包/拆包問(wèn)題說(shuō)明..... 80
4.1.2 TCP 粘包/拆包發(fā)生的原因....... 80
4.1.3 粘包問(wèn)題的解決策略.......... 81
4.2 未考慮TCP 粘包導(dǎo)致功能異常案例................. 82
4.2.1 TimeServer 的改造.............. 82
4.2.2 TimeClient 的改造............... 83
4.2.3 運(yùn)行結(jié)果.......... 84
4.3 利用LineBasedFrameDecoder 解決TCP 粘包問(wèn)題................ 85
4.3.1 支持TCP 粘包的TimeServer ....................... 86
4.3.2 支持TCP 粘包的TimeClient........................ 88
4.3.3 運(yùn)行支持TCP 粘包的時(shí)間服務(wù)器程序........ 90
4.3.4 LineBasedFrameDecoder 和StringDecoder 的原理分析........... 91
4.4 總結(jié)............................ 92
第5 章分隔符和定長(zhǎng)解碼器的應(yīng)用...... 93
5.1 DelimiterBasedFrameDecoder 應(yīng)用開(kāi)發(fā)............. 94
5.1.1 DelimiterBasedFrameDecoder 服務(wù)端開(kāi)發(fā).... 94
5.1.2 DelimiterBasedFrameDecoder 客戶端開(kāi)發(fā).... 97
5.1.3 運(yùn)行DelimiterBasedFrameDecoder 服務(wù)端和客戶端............... 99
5.2 FixedLengthFrameDecoder 應(yīng)用開(kāi)發(fā)............... 101
5.2.1 FixedLengthFrameDecoder 服務(wù)端開(kāi)發(fā)...... 101
5.2.2 利用telnet 命令行測(cè)試EchoServer 服務(wù)端......103
5.3 總結(jié).......................... 104
中級(jí)篇 Netty 編解碼開(kāi)發(fā)指南
第6 章編解碼技術(shù).............. 106
6.1 Java 序列化的缺點(diǎn) ...... 107
6.1.1 無(wú)法跨語(yǔ)言.... 107
6.1.2 序列化后的碼流太大........ 107
6.1.3 序列化性能太低................ 110
6.2 業(yè)界主流的編解碼框架............ 113
6.2.1 Google 的Protobuf 介紹.... 113
6.2.2 Facebook 的Thrift 介紹.... 115
6.2.3 JBoss Marshalling 介紹..... 116
6.3 總結(jié).......................... 117
第7 章MessagePack 編解碼............... 118
7.1 MessagePack 介紹... 118
7.1.1 MessagePack 多語(yǔ)言支持.. 119
7.1.2 MessagePack Java API 介紹........................ 119
7.1.3 MessagePack 開(kāi)發(fā)包下載. 120
7.2 MessagePack 編碼器和解碼器開(kāi)發(fā)................. 120
7.2.1 MessagePack 編碼器開(kāi)發(fā)....... 120
7.2.2 MessagePack 解碼器開(kāi)發(fā) ...... 121
7.2.3 功能測(cè)試........ 121
7.3 粘包/半包支持......... 124
7.4 總結(jié).......................... 127
第8 章Google Protobuf 編解碼.......... 128
8.1 Protobuf 的入門....... 129
8.1.1 Protobuf 開(kāi)發(fā)環(huán)境搭建..... 129
8.1.2 Protobuf 編解碼開(kāi)發(fā)......... 131
8.1.3 運(yùn)行Protobuf 例程............ 133
8.2 Netty 的Protobuf 服務(wù)端開(kāi)發(fā).. 133
8.2.1 Protobuf 版本的圖書訂購(gòu)服務(wù)端開(kāi)發(fā)........ 134
8.2.2 Protobuf 版本的圖書訂購(gòu)客戶端開(kāi)發(fā)........ 136
8.2.3 Protobuf 版本的圖書訂購(gòu)程序功能測(cè)試.... 139
8.3 Protobuf 的使用注意事項(xiàng)......... 140
8.4 總結(jié).......................... 142
第9 章JBoss Marshalling 編解碼....... 143
9.1 Marshalling 開(kāi)發(fā)環(huán)境準(zhǔn)備........ 143
9.2 Netty 的Marshalling 服務(wù)端開(kāi)發(fā)..................... 144
9.3 Netty 的Marshalling 客戶端開(kāi)發(fā)..................... 147
9.4 運(yùn)行Marshalling 客戶端和服務(wù)端例程........... 149
9.5 總結(jié).......................... 150
高級(jí)篇 Netty 多協(xié)議開(kāi)發(fā)和應(yīng)用
第10 章HTTP 協(xié)議開(kāi)發(fā)應(yīng)用............... 154
10.1 HTTP 協(xié)議介紹..... 155
10.1.1 HTTP 協(xié)議的URL .......... 155
10.1.2 HTTP 請(qǐng)求消息(HttpRequest).............. 155
10.1.3 HTTP 響應(yīng)消息(HttpResponse)........... 158
10.2 Netty HTTP 服務(wù)端入門開(kāi)發(fā)....... 159
10.2.1 HTTP 服務(wù)端例程場(chǎng)景描述..................... 160
10.2.2 HTTP 服務(wù)端開(kāi)發(fā)........... 160
10.2.3 Netty HTTP 文件服務(wù)器例程運(yùn)行結(jié)果.... 166
10.3 Netty HTTP XML 協(xié)議棧開(kāi)發(fā)....................... 170
10.3.1 開(kāi)發(fā)場(chǎng)景介紹................. 171
10.3.2 HTTP XML 協(xié)議棧設(shè)計(jì).......174
10.3.3 高效的XML 綁定框架JiBx ..................... 175
10.3.4 HTTP XML 編解碼框架開(kāi)發(fā).................. 183
10.3.5 HTTP XML 協(xié)議棧測(cè)試....... 199
10.3.6 小結(jié)............. 201
10.4 總結(jié)........................ 202
第11 章WebSocket 協(xié)議開(kāi)發(fā)............. 203
11.1 HTTP 協(xié)議的弊端....... 204
11.2 WebSocket 入門..... 204
11.2.1 WebSocket 背景............... 205
11.2.2 WebSocket 連接建立....... 206
11.2.3 WebSocket 生命周期....... 207
11.2.4 WebSocket 連接關(guān)閉....... 208
11.3 Netty WebSocket 協(xié)議開(kāi)發(fā)..... 209
11.3.1 WebSocket 服務(wù)端功能介紹..................... 209
11.3.2 WebSocket 服務(wù)端開(kāi)發(fā).... 210
11.3.3 運(yùn)行WebSocket 服務(wù)端... 218
11.4 總結(jié)........................ 219
第12 章私有協(xié)議棧開(kāi)發(fā).... 221
12.1 私有協(xié)議介紹........ 221
12.2 Netty 協(xié)議棧功能設(shè)計(jì)............ 223
12.2.1 網(wǎng)絡(luò)拓?fù)鋱D.. 223
12.2.2 協(xié)議棧功能描述.............. 224
12.2.3 通信模型...... 224
12.2.4 消息定義...... 225
12.2.5 Netty 協(xié)議支持的字段類型...................... 226
12.2.6 Netty 協(xié)議的編解碼規(guī)范. 227
12.2.7 鏈路的建立.. 229
12.2.8 鏈路的關(guān)閉.. 230
12.2.9 性設(shè)計(jì).. 230
12.2.10 安全性設(shè)計(jì) 232
12.2.11 可擴(kuò)展性設(shè)計(jì)................ 232
12.3 Netty 協(xié)議棧開(kāi)發(fā).. 233
12.3.1 數(shù)據(jù)結(jié)構(gòu)定義................. 233
12.3.2 消息編解碼.. 237
12.3.3 握手和安全認(rèn)證.............. 241
12.3.4 心跳檢測(cè)機(jī)制................. 245
12.3.5 斷連重連...... 248
12.3.6 客戶端代碼.. 249
12.3.7 服務(wù)端代碼.. 251
12.4 運(yùn)行協(xié)議棧............ 252
12.4.1 正常場(chǎng)景...... 252
12.4.2 異常場(chǎng)景:服務(wù)端宕機(jī)重啟.................... 253
12.4.3 異常場(chǎng)景:客戶端宕機(jī)重啟.................... 256
12.5 總結(jié)........................ 256
第13 章服務(wù)端創(chuàng)建............ 258
13.1 原生NIO 類庫(kù)的復(fù)雜性......... 259
13.2 Netty 服務(wù)端創(chuàng)建源碼分析.... 259
13.2.1 Netty 服務(wù)端創(chuàng)建時(shí)序圖. 260
13.2.2 Netty 服務(wù)端創(chuàng)建源碼分析...................... 263
13.3 客戶端接入源碼分析.............. 272
13.4 總結(jié)........................ 275
第14 章客戶端創(chuàng)建............ 276
14.1 Netty 客戶端創(chuàng)建流程分析.... 276
14.2.1 Netty 客戶端創(chuàng)建時(shí)序圖. 276
14.2.2 Netty 客戶端創(chuàng)建流程分析...................... 277
14.2 Netty 客戶端創(chuàng)建源碼分析.... 278
14.2.1 客戶端連接輔助類Bootstrap.................... 278
14.2.2 客戶端連接操作.............. 281
14.2.3 異步連接結(jié)果通知.......... 283
14.2.4 客戶端連接超時(shí)機(jī)制...... 284
14.3 總結(jié)........................ 286
源碼分析篇 Netty 功能介紹和源碼分析
第15 章ByteBuf 和相關(guān)輔助類........... 288
15.1 ByteBuf 功能說(shuō)明. 288
15.1.1 ByteBuf 的工作原理........ 289
15.1.2 ByteBuf 的功能介紹........ 294
15.2 ByteBuf 源碼分析. 308
15.2.1 ByteBuf 的主要類繼承關(guān)系..................... 309
15.2.2 AbstractByteBuf 源碼分析........................ 310
15.2.3 AbstractReferenceCountedByteBuf 源碼分析.................. 319
15.2.4 UnpooledHeapByteBuf 源碼分析.............. 321
15.2.5 PooledByteBuf 內(nèi)存池原理分析............... 326
15.2.6 PooledDirectByteBuf 源碼分析................. 329
15.3 ByteBuf 相關(guān)的輔助類功能介紹.................... 332
15.3.1 ByteBufHolder................. 332
15.3.2 ByteBufAllocator ............. 333
15.3.3 CompositeByteBuf ........... 334
15.3.4 ByteBufUtil .. 336
15.4 總結(jié)........................ 337
第16 章Channel 和Unsafe ................. 338
16.1 Channel 功能說(shuō)明. 338
16.1.1 Channel 的工作原理........ 339
16.1.2 Channel 的功能介紹........ 340
16.2 Channel 源碼分析. 343
16.2.1 Channel 的主要繼承關(guān)系類圖.................. 343
16.2.2 AbstractChannel 源碼分析........................ 344
16.2.3 AbstractNioChannel 源碼分析.................. 347
16.2.4 AbstractNioByteChannel 源碼分析........... 350
16.2.5 AbstractNioMessageChannel 源碼分析..... 353
16.2.6 AbstractNioMessageServerChannel 源碼分析.............. 354
16.2.7 NioServerSocketChannel 源碼分析........... 355
16.2.8 NioSocketChannel 源碼分析..................... 358
16.3 Unsafe 功能說(shuō)明... 364
16.4 Unsafe 源碼分析... 365
16.4.1 Unsafe 繼承關(guān)系類圖...... 365
16.4.2 AbstractUnsafe 源碼分析. 366
16.4.3 AbstractNioUnsafe 源碼分析.................... 375
16.4.4 NioByteUnsafe 源碼分析. 379
16.5 總結(jié)........................ 387
第17 章ChannelPipeline 和ChannelHandler........... 388
17.1 ChannelPipeline 功能說(shuō)明....... 389
17.1.1 ChannelPipeline 的事件處理.................... 389
17.1.2 自定義攔截器................. 391
17.1.3 構(gòu)建pipeline 392
17.1.4 ChannelPipeline 的主要特性.................... 393
17.2 ChannelPipeline 源碼分析....... 393
17.2.1 ChannelPipeline 的類繼承關(guān)系圖............. 393
17.2.2 ChannelPipeline 對(duì)ChannelHandler 的管理........... 393
17.2.3 ChannelPipeline 的inbound 事件.............. 396
17.2.4 ChannelPipeline 的outbound 事件............ 397
17.3 ChannelHandler 功能說(shuō)明....... 398
17.3.1 ChannelHandlerAdapter 功能說(shuō)明............ 399
17.3.2 ByteToMessageDecoder 功能說(shuō)明............ 399
17.3.3 MessageToMessageDecoder 功能說(shuō)明...... 400
17.3.4 LengthFieldBasedFrameDecoder 功能說(shuō)明............... 400
17.3.5 MessageToByteEncoder 功能說(shuō)明............. 404
17.3.6 MessageToMess
13.2.1Netty服務(wù)端創(chuàng)建時(shí)序圖
下面我們對(duì)Netty服務(wù)端創(chuàng)建的關(guān)鍵步驟和原理進(jìn)行講解。
步驟1:創(chuàng)建ServerBootstrap實(shí)例。ServerBootstrap是Netty服務(wù)端的啟動(dòng)輔助類,它提供了一系列的方法用于設(shè)置服務(wù)端啟動(dòng)相關(guān)的參數(shù)。底層通過(guò)門面模式對(duì)各種能力進(jìn)行抽象和封裝,盡量不需要用戶跟過(guò)多的底層API打交道,降低用戶的開(kāi)發(fā)難度。
我們?cè)趧?chuàng)建ServerBootstrap實(shí)例時(shí),會(huì)驚訝地發(fā)現(xiàn)ServerBootstrap只有一個(gè)無(wú)參的構(gòu)造函數(shù),作為啟動(dòng)輔助類這讓人不可思議,因?yàn)樗枰c多個(gè)其他組件或者類交互。ServerBootstrap構(gòu)造函數(shù)沒(méi)有參數(shù)的根本原因是因?yàn)樗膮?shù)太多了,而且未來(lái)也可能會(huì)發(fā)生變化,為了解決這個(gè)問(wèn)題,就需要引入Builder模式。《Effective Java》第二版第2條建議遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮用構(gòu)建器,關(guān)于多個(gè)參數(shù)構(gòu)造函數(shù)的缺點(diǎn)和使用構(gòu)建器的優(yōu)點(diǎn)大家可以查閱《Effective Java》,在此不再詳述。
步驟2:設(shè)置并綁定Reactor線程池。Netty的Reactor線程池是EventLoopGroup,它實(shí)際就是EventLoop的數(shù)組。EventLoop的職責(zé)是處理所有注冊(cè)到本線程多路復(fù)用器Selector上的Channel,Selector的輪詢操作由綁定的EventLoop線程run方法驅(qū)動(dòng),在一個(gè)循環(huán)體內(nèi)循環(huán)執(zhí)行。值得說(shuō)明的是,EventLoop的職責(zé)不僅僅是處理網(wǎng)絡(luò)I/O事件,用戶自定義的Task和定時(shí)任務(wù)Task也統(tǒng)一由EventLoop負(fù)責(zé)處理,這樣線程模型就實(shí)現(xiàn)了統(tǒng)一。從調(diào)度層面看,也不存在在EventLoop線程中再啟動(dòng)其他類型的線程用于異步執(zhí)行另外的任務(wù),這樣就避免了多線程并發(fā)操作和鎖競(jìng)爭(zhēng),提升了I/O線程的處理和調(diào)度性能。
步驟3:設(shè)置并綁定服務(wù)端Channel。作為NIO服務(wù)端,需要?jiǎng)?chuàng)建ServerSocketChannel,Netty對(duì)原生的NIO類庫(kù)進(jìn)行了封裝,對(duì)應(yīng)實(shí)現(xiàn)是NioServerSocketChannel。對(duì)于用戶而言,不需要關(guān)心服務(wù)端Channel的底層實(shí)現(xiàn)細(xì)節(jié)和工作原理,只需要指定具體使用哪種服務(wù)端Channel即可。因此,Netty的ServerBootstrap方法提供了channel方法用于指定服務(wù)端Channel的類型。Netty通過(guò)工廠類,利用反射創(chuàng)建NioServerSocketChannel對(duì)象。由于服務(wù)端監(jiān)聽(tīng)端口往往只需要在系統(tǒng)啟動(dòng)時(shí)才會(huì)調(diào)用,因此反射對(duì)性能的影響并不大。相關(guān)代碼如下。
public ServerBootstrap channel(Class channelClass) {
if (channelClass == null) {
throw new NullPointerException("channelClass");
}
return channelFactory(new ServerBootstrapChannelFactory(channelClass));
}
步驟4:鏈路建立的時(shí)候創(chuàng)建并初始化ChannelPipeline。ChannelPipeline并不是NIO服務(wù)端必需的,它本質(zhì)就是一個(gè)負(fù)責(zé)處理網(wǎng)絡(luò)事件的職責(zé)鏈,負(fù)責(zé)管理和執(zhí)行ChannelHandler。網(wǎng)絡(luò)事件以事件流的形式在ChannelPipeline中流轉(zhuǎn),由ChannelPipeline根據(jù)ChannelHandler的執(zhí)行策略調(diào)度ChannelHandler的執(zhí)行。典型的網(wǎng)絡(luò)事件如下。
(1)鏈路注冊(cè);
(2)鏈路激活;
(3)鏈路斷開(kāi);
(4)接收到請(qǐng)求消息;
(5)請(qǐng)求消息接收并處理完畢;
(6)發(fā)送應(yīng)答消息;
(7)鏈路發(fā)生異常;
(8)發(fā)生用戶自定義事件。
步驟5:初始化ChannelPipeline完成之后,添加并設(shè)置ChannelHandler。ChannelHandler是Netty提供給用戶定制和擴(kuò)展的關(guān)鍵接口。利用ChannelHandler用戶可以完成大多數(shù)的功能定制,例如消息編解碼、心跳、安全認(rèn)證、TSL/SSL認(rèn)證、流量控制和流量整形等。Netty同時(shí)也提供了大量的系統(tǒng)ChannelHandler供用戶使用,比較實(shí)用的系統(tǒng)ChannelHandler總結(jié)如下。
(1)系統(tǒng)編解碼框架——ByteToMessageCodec;
(2)通用基于長(zhǎng)度的半包解碼器——LengthFieldBasedFrameDecoder;
(3)碼流日志打印Handler——LoggingHandler;
(4)SSL安全認(rèn)證Handler——SslHandler;
(5)鏈路空閑檢測(cè)Handler——IdleStateHandler;
(6)流量整形Handler——ChannelTrafficShapingHandler;
(7)Base64編解碼——Base64Decoder和Base64Encoder。
創(chuàng)建和添加ChannelHandler的代碼示例如下。
.childHandler(new ChannelInitializer() {
@Override
public void initChannel(SocketChannel ch
throws Exception {
ch.pipeline().addLast
new EchoServerHandler());
}
});
步驟6:綁定并啟動(dòng)監(jiān)聽(tīng)端口。在綁定監(jiān)聽(tīng)端口之前系統(tǒng)會(huì)做一系列的初始化和檢測(cè)工作,完成之后,會(huì)啟動(dòng)監(jiān)聽(tīng)端口,并將ServerSocketChannel注冊(cè)到Selector上監(jiān)聽(tīng)客戶端連接,相關(guān)代碼如下。
protected void doBind(SocketAddress localAddress) throws Exception {
javaChannel().socket().bind(localAddress, config.getBacklog());
}
步驟7:Selector輪詢。由Reactor線程N(yùn)ioEventLoop負(fù)責(zé)調(diào)度和執(zhí)行Selector輪詢操作,選擇準(zhǔn)備就緒的Channel集合,相關(guān)代碼如下。
private void select() throws IOException {
Selector selector = this.selector;
try {
//此處代碼省略......
int selectedKeys = selector.select(timeoutMillis);
selectCnt ;
//此處代碼省略......
}
步驟8:當(dāng)輪詢到準(zhǔn)備就緒的Channel之后,就由Reactor線程N(yùn)ioEventLoop執(zhí)行ChannelPipeline的相應(yīng)方法,最終調(diào)度并執(zhí)行ChannelHandler,接口如圖13-2所示。
步驟9:執(zhí)行Netty系統(tǒng)ChannelHandler和用戶添加定制的ChannelHandler。ChannelPipeline根據(jù)網(wǎng)絡(luò)事件的類型,調(diào)度并執(zhí)行ChannelHandler,相關(guān)代碼如下。
public ChannelHandlerContext fireChannelRead(Object msg) {
DefaultChannelHandlerContext next = findContextInbound(MASK_CHANNEL_READ);
next.invoker.invokeChannelRead(next, msg);
return this;
}
林鋒讓我給這本新書寫個(gè)推薦,不勝榮幸。我和林鋒接觸時(shí)間不長(zhǎng),已經(jīng)感受到了他對(duì)技術(shù)的熱愛(ài)和不盡探索。這種熱愛(ài)來(lái)自于內(nèi)心的驅(qū)動(dòng),不摻雜任何雜質(zhì),我認(rèn)為他是我見(jiàn)到的為數(shù)不多的技術(shù)熱愛(ài)者。也正是因?yàn)檫@種熱愛(ài),促使林鋒花費(fèi)了很多業(yè)余時(shí)間,完成了這樣一本對(duì)Netty的編程指南。相信讀者在閱讀此書時(shí),在感嘆內(nèi)容之豐富詳實(shí)的同時(shí),也會(huì)深深感受到林鋒對(duì)所著技術(shù)的熱愛(ài)。我想這就是我們通過(guò)書中文字相遇的初衷吧。當(dāng)我們的技術(shù)能夠日益精進(jìn),達(dá)到專業(yè)的水準(zhǔn),生產(chǎn)力會(huì)成倍甚至指數(shù)級(jí)地增長(zhǎng)。希望讀者能夠通過(guò)閱讀此書獲取這種精進(jìn)的力量。
——IBM中國(guó)開(kāi)發(fā)實(shí)驗(yàn)室開(kāi)發(fā)總監(jiān) 黃省江
Netty的之處在于它是一個(gè)高性能、異步事件驅(qū)動(dòng)的NIO框架,目前很多著名的開(kāi)源框架開(kāi)始將底層的通信框架切換到Netty,如Hadoop、Storm等,F(xiàn)acebook的后臺(tái)也即將啟用這一框架。希望這本書的面市能夠?qū)etty在國(guó)內(nèi)的發(fā)展起到推動(dòng)作用。
——Facebook博學(xué)工程師 覃超
中國(guó)的閱讀類應(yīng)用——中國(guó)移動(dòng)手機(jī)閱讀基地,每天承受著5~7.5億PV的訪問(wèn)量,為了實(shí)現(xiàn)業(yè)務(wù)的彈性,華為Digital SDP產(chǎn)品承接了對(duì)其后臺(tái)進(jìn)行微服務(wù)重構(gòu)的工作,一個(gè)PV背后的后臺(tái)原子接口訪問(wèn)達(dá)到幾十乃至上百次,還要保障90%的頁(yè)面訪問(wèn)在500ms內(nèi)響應(yīng),在這樣的壓力下,高效的通信機(jī)制尤其重要,林鋒基于Netty構(gòu)建的對(duì)等通信虛擬總線很好地承載了這一需求。平均通信時(shí)延0.71ms,80%以上的通信時(shí)延都保持在1ms以下,其余通信時(shí)延都低于3ms,在響應(yīng)速度這一重要指標(biāo)上不僅滿足了客戶的要求,而且還帶來(lái)了系統(tǒng)可伸縮性和彈性上的巨大提升,林鋒在本書中闡釋的Netty應(yīng)用上的經(jīng)驗(yàn)和技巧值得期待。
——華為Digital SDP首席架構(gòu)師 王慷
最近幾年,Netty社區(qū)的發(fā)展如火如荼,無(wú)論是大數(shù)據(jù)領(lǐng)域的演進(jìn),還是微服務(wù)架構(gòu)的流行,都需要高效的分布式通信機(jī)制作為基本支撐,Netty憑借優(yōu)異的性能、靈活的擴(kuò)展性得到了廣泛的應(yīng)用。林鋒兄曾將自己在NIO領(lǐng)域的積累以博文的形式共享,得到了Java社區(qū)的熱烈響應(yīng),他對(duì)NIO領(lǐng)域的積累和見(jiàn)解令人敬佩。本次升級(jí)更新后的第2版,相信會(huì)有更多新鮮和實(shí)用的知識(shí)增加進(jìn)來(lái),毫無(wú)疑問(wèn),它會(huì)成為學(xué)習(xí)高性能NIO的必備圖書。
——IT圖書譯者、InfoQ編輯 張衛(wèi)濱
設(shè)計(jì)開(kāi)發(fā)基于異步編程模型的高性能服務(wù)器,除了理解和熟練應(yīng)用NIO等這些Java層面的基礎(chǔ)知識(shí)之外,能夠駕馭的異步通信框架也是非常重要的,Netty無(wú)疑是Java領(lǐng)域最值得學(xué)習(xí)和研究的異步事件驅(qū)動(dòng)的NIO框架。作者有著多年的NIO開(kāi)發(fā)和運(yùn)維經(jīng)驗(yàn),本書濃縮了作者多年實(shí)戰(zhàn)經(jīng)驗(yàn),推薦給對(duì)Netty技術(shù)感興趣、想研究的攻城獅閱讀!
——螞蟻金服基礎(chǔ)技術(shù)部JVM Architect 李三紅
Netty是一個(gè)令人驚訝的項(xiàng)目,在短短幾年內(nèi)成為眾多Java高并發(fā)異步通信的框架。但目前國(guó)內(nèi)資料極少并缺乏系統(tǒng)性,而李兄的這本系統(tǒng)介紹Netty開(kāi)發(fā)和原理的書籍,很地填補(bǔ)了這個(gè)空白。國(guó)內(nèi)的技術(shù)人員對(duì)Java NIO和Netty的理解多一些,也就意味著國(guó)內(nèi)整體網(wǎng)絡(luò)編程技術(shù)的進(jìn)步。本書條理清晰,對(duì)技術(shù)的闡述循序漸進(jìn),是一本難得的Netty學(xué)習(xí)教材,推薦有志青年仔細(xì)學(xué)習(xí)研究本書,共同把NIO異步通信編程推向一個(gè)新高度。
——JBoss應(yīng)用服務(wù)器核心開(kāi)發(fā)組成員 張建鋒
寫的非常好,比較有深度,感覺(jué)比netty in action 要好,要神
真的不錯(cuò)啊
萬(wàn)象快遞,當(dāng)當(dāng)自營(yíng)
當(dāng)當(dāng)不是以前的當(dāng)當(dāng)了
價(jià)格相當(dāng)實(shí)惠
也是值得研究的一本書
介紹的很詳細(xì),很有幫助
有折很,包裝也很一般
感覺(jué)書中有很多瑕疵,不夠嚴(yán)謹(jǐn),部分代碼好像還有缺陷?;A(chǔ)不好的建議不要買,因?yàn)橛械拇a會(huì)卡你半天,因?yàn)楦揪幾g通不過(guò)。
書沒(méi)什么問(wèn)題,就是快遞員打電話說(shuō)包裹不小心開(kāi)了個(gè)口子,我認(rèn)為是沒(méi)問(wèn)題就行也沒(méi)在意,結(jié)果拿到快遞的時(shí)候發(fā)現(xiàn)開(kāi)口很齊整小核最重要的是發(fā)票沒(méi)有了,不知道是快遞員拿走了還是根本沒(méi)發(fā)
非常的不錯(cuò)
印刷很好,字跡清晰,是正版,輸?shù)膬?nèi)容講解很完美
很好,非常不錯(cuò)!很好,非常不錯(cuò)!
很好,非常不錯(cuò)!很好,非常不錯(cuò)!
還沒(méi)有看,看完再評(píng)論
不錯(cuò) 正品 值得買
品質(zhì)不錯(cuò) 可讀性強(qiáng)
能夠深入了解,底層原理
拿到了,還沒(méi)有開(kāi)始看,用到了再回來(lái)追加
部分內(nèi)容有些過(guò)時(shí),但總體不錯(cuò)
還沒(méi)看,想深入了解NIO的話,就看看這本
很詳細(xì),NIO必讀
好書,好內(nèi)容。在大數(shù)據(jù)時(shí)代尤其對(duì)我有幫助
看了第一章,及大綱。真的是本不錯(cuò)的書!
其他都不錯(cuò),唯一不爽就是沒(méi)有紙箱包裝,書很容易弄皺。。
非常好,我喜歡這種看不懂,但是可以放在電腦旁裝逼的書。
拿到書的時(shí)候書就沒(méi)有塑料封皮,紙質(zhì)還行,印刷也還不錯(cuò)
非常好的一本書,實(shí)用,java并發(fā)編程的神器!
還挺不錯(cuò)的,只是買了過(guò)后遇到讀書節(jié)搞活動(dòng),有點(diǎn)后悔。
程序員必看,沒(méi)事買來(lái)拓展下知識(shí),懂得多才值錢!
書的內(nèi)容很好,很實(shí)用。不過(guò),我收到的這本書裝訂上有瑕疵,334頁(yè)的下一頁(yè)不是335,一下了跳到了431。這個(gè)跨越斷篇,我也是無(wú)語(yǔ)了。
***TY權(quán)威指南(第2版)***TY權(quán)威指南(第2版)N10ETTY權(quán)威指南(第2版)發(fā)6實(shí)驗(yàn)室開(kāi)發(fā)總監(jiān)黃省江的之處在于它是一個(gè)高性能、異步事件驅(qū)動(dòng)的框架,目前很多著名的開(kāi)源框架開(kāi)始將樣的?本書都會(huì)一一解答。推薦購(gòu)買:《云