今天是猿燈塔365篇**原創計劃」第一篇。面試
接下來的時間燈塔君持續更新Netty系列一共九篇spring
當前:Netty 源碼解析(一)開始編程
Netty 源碼解析(二): Netty 的 Channel微信
Netty 源碼解析(三): Netty 的 Future 和 Promise併發
Netty 源碼解析(四): Netty 的 ChannelPipeline框架
Netty 源碼解析(五): Netty 的線程池分析異步
Netty 源碼解析(六): Channel 的 register 操做maven
Netty 源碼解析(七): NioEventLoop 工做流程異步編程
Netty 源碼解析(八): 回到 Channel 的 register 操做oop
Netty 源碼解析(九): connect 過程和 bind 過程分析
今天呢!燈塔君跟你們講:
Netty 源碼解析(一)
前言:本文將介紹Netty,Java平臺上使用最普遍的 NIO 包,它是對JDK中的NIO實現的一層封裝,讓咱們能更方便地開發NIO程序。其實,Netty 不只僅是NIO吧,可是基本上你們都衝着NIO來的。
燈塔君感受國內對於Netty的吹噓是有點過了,主要是不少人靠它吃飯,要麼是搞培訓的,要麼是出書的,巴不得把 Netty 吹上天去,這種現象也是挺很差的,反而使得初學者以爲Netty是什麼高深的技術同樣。
Netty的源碼不是很簡單,由於它比較多,並且各個類之間的關係錯綜複雜,不少人說它的源碼很好,這點燈塔君以爲通常,真要說好代碼,還得Doug Lea的併發源碼比較漂亮,一行行都是精華,不過它們是不一樣類型的,也沒什麼好對比的。
Netty源碼好就好在它的接口使用比較靈活,每每接口好用的框架,源碼都不會太簡單。
本文將立足於源碼分析,若是讀者已經對Netty有些瞭解,或者使用過,那就更好了。
建議初學者在看完本文之後,能夠去翻翻《Netty In Action》,網上也能夠找到中文文字版的。
一.準備
學習源碼,一開始確定是準備環境。
燈塔君喜歡用maven,也喜歡Spring Boot,因此我通常先到https://start.spring.io/準備...。
10秒搞定腳手架,而後就是導入到Intellij 中,若是用新版本的Spring Boot,可能還須要等待下載依賴,期間打開https://mvnrepository.com/搜...。
Netty分爲好些模塊,有netty-handler,netty-buffer、netty-transport、netty-common 等等也有一個netty-all,它包含了全部的模塊。
既然咱們是源碼分析,那麼天然是用一個最簡單的。netty-all不是最好的選擇,netty-example纔是:
> 1<dependency\> > 2 <groupId\>io.netty</groupId\> > 3 <artifactId\>netty-example</artifactId\> > 4 <version\>4.1.25.Final</version\> > 5</dependency\>
它不只能夠解決咱們的依賴,並且example裏面的示例很是適合咱們學習使用。
二.Echo例子
Netty做爲NIO的庫,天然既能夠做爲服務端接受請求,也能夠做爲客戶端發起請求.使用Netty開發客戶端或服務端都是很是簡單的,Netty作了很好的封裝,咱們一般只要開發一個或多個handler用來處理咱們的自定義邏輯就能夠了。
下面,咱們來看一個常常會見到的例子,它叫Echo,也就是回聲,客戶端傳過去什麼值,服務端原樣返回什麼值。
開netty-example的源碼把echo包下面的代碼複製出來玩一玩。
左邊是服務端代碼,右邊是客戶端代碼。
上面的代碼基本就是模板代碼,每次使用都是這一個套路,惟一須要咱們開發的部分是handler(...)和childHandler(...)方法中指定的各個handler,如EchoServerHandler和EchoClientHandler,固然Netty源碼也給咱們提供了不少的handler,好比上面的 LoggingHandler,它就是Netty源碼中爲咱們提供的,須要的時候直接拿過來用就行了。
咱們先來看一下上述代碼中涉及到的一些內容:
固然,也有對其餘協議的支持,如支持UDP協議的 NioDatagramChannel本文只關心TCP相關的。
若是你想在EchoServer中也指定多個handler也能夠像右邊的EchoClient同樣使用ChannelInitializer
對於不瞭解Netty的讀者,也不要有什麼壓力,燈塔君會一一介紹它們,本文主要面向新手,燈塔君以爲比較難理解或比較重要的部分,會花比較大的篇幅來介紹清楚。
上面的源碼中沒有展現消息發送和消息接收的處理,此部分燈塔君會在介紹完上面的這些內容之後再進行介紹。
下面,將分塊來介紹這些內容。鑑於讀者對NIO或Netty的瞭解程度可能良莠不齊,燈塔君爲了照顧初學者不少地方須要囉嗦一些,因此但願讀者一節一節往下看,對於本身熟悉的內容能夠適當看快一些,敬請期待!
365天干貨不斷,能夠微信搜索「 猿燈塔」第一時間閱讀,回覆【資料】【面試】【簡歷】有我準備的一線大廠面試資料和簡歷模板