序
之前開過品味性能系列、Mysql學習系列,頗為曲高和寡。都是講理論,很少有手把手深入淺出的文章。不過確實我就這脾氣,文雅點的說法叫做“偽雅”,下里巴人叫做“裝逼”。
學習資料
本篇文章,打算總結下學習過程,分析學習要點。
關於netty的資料頗多,學習起來未免雜亂。對於初學者麻煩點在於難以找到重點,再此則推薦一個學習路線。
- Netty 實戰(精髓)
- Netty權威指南
- 通信理論學習,akka bio nio aio(可以繞過)
第一步 上手練習
Telnet示例(15分鍾)
使用Netty創建Telnet服務
官方示例TelnetClient
推薦這個示例是因為它足夠簡單,簡單到客戶端也沒有。
進階示例(30分鍾)
《Netty 實戰(精髓》->第一個netty應用)
在這一章能夠學習到更多細節。
- 服務端 (serverChannel)
- EchoServerHandler 簡單的接收打印,將所接收的消息返回給發送者
- 沖刷所有待審消息到遠程節點
- 關閉通道后,操作完成
通過這幾步代碼,學習 Netty 組件模型的基礎 -> ChannelHandler ,它是重中之重。在稍后的第二步將會深入講解。
- 服務端 (server)
- EchoServer 創建EventLoopGroup、ServerBootstrap
- 指定 Channel
- 設置 socket 地址使用所選的端口
- 添加 EchoServerHandler 到 Channel 的 ChannelPipeline
- 綁定的服務器;sync 等待服務器關閉
- 關閉 channel 和 塊,直到它被關閉
- 關機的 EventLoopGroup,釋放所有資源
- 客戶端 (client) -> Bootstrap的構建過程
http://www.jianshu.com/p/5dcbc0456376
第二步 熟悉組件
對於從零開始,想要快速上手的同學來說。只想說直接給一份代碼,從安全角度出發也不敢用到生產環境。出了問題也無從下手修改。
一些實用組件推薦,請務必熟悉它們的作用。
跟着Netty 實戰(精髓),看《Netty 總覽》
- 學習步驟如下:
-
Channel、ChannelHandler
-
Encode、Decode、ByteBuf
-
ChannelHandlerContext
-
ReferenceCountUtil
-
ChannelFuture、Promise
-
ChannelPipeline、ChannelInitializer
-
EventLoop、EventLoopGroup
-
Attributekey
-
CharsetUtil
盡量,按照其在整個通信過程中所屬順位,講解所有 Netty 主要組件。大致結構圖如下:

1.Channel、ChannelHandler
熟悉ChannelInboundHandlerAdapter 抽象類里面每個方法的用處。
利用責任單一原則,把消息
2.Encode、Decode、ByteBuf
-
Encode、Decode
-
ByteBuf
(ByteBuf和相關輔助類)[http://www.cnblogs.com/wade-luffy/p/6196481.html]
(WroldClock)[https://netty.io/4.0/xref/io/netty/example/worldclock/WorldClockServerHandler.html]
第三步 難點、要點
- EventLoop 數量、名稱
- 粘包、半包
- 心跳 3次
- 重連
- session
- 不想轉關鍵字
- 內存保護、溢出oom
- 連接數與釋放
- 拒絕連接、黑名單、白名單
- Nginx
- fail over重試與冪等性
第四步 高階原理
對於已經在項目中應用了 netty 的同學,更多的想學習源碼,但是並不推薦直接看源碼。
因為常常在沒有一定設計功底的情況下,會看的不明所以。
- ByteBuf
- Channel 和Unsafe
- ChannelPipeline 和ChannelHandler
- EventLoop 和EventLoopGroup
- Future 和Promise
總結
更多協議類型支持,請自行根據需求搜索相應資料。
在通過github搜索相應源碼參考學習時,切記分辨出事netty3.x與netty4.+版本。因為改動很大,很多資料已經沒有參考價值。
分布式服務
- 冪等性
- fail over、fail fast、fail safe、fail back
- 分布式事務
- cas原子鎖
- zookeeper與paxos算法
