Netty系列之源碼解析(一)

今天是猿燈塔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有些瞭解,或者使用過,那就更好了。

  • 本文只介紹TCP相關的內容,Netty對於其餘協議的支持,不在本文的討論範圍內。
  • 和併發包的源碼分析不同,我不可能一行一行源碼說,因此有些異常分支是會直接略過,除非我以爲須要介紹。
  • Netty源碼一直在更新,各版本之間有些差別,我是按照2018-09-06的最新版本 4.1.25.Final 來進行介紹的。

建議初學者在看完本文之後,能夠去翻翻《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包下面的代碼複製出來玩一玩。
1588124795(1).jpg

左邊是服務端代碼,右邊是客戶端代碼。

上面的代碼基本就是模板代碼,每次使用都是這一個套路,惟一須要咱們開發的部分是handler(...)和childHandler(...)方法中指定的各個handler,如EchoServerHandlerEchoClientHandler,固然Netty源碼也給咱們提供了不少的handler,好比上面的 LoggingHandler,它就是Netty源碼中爲咱們提供的,須要的時候直接拿過來用就行了。

咱們先來看一下上述代碼中涉及到的一些內容:

  • ServerBootstrap類用於建立服務端實例,Bootstrap用於建立客戶端實例。
  • 兩個EventLoopGroup:bossGroup和workerGroup,它們涉及的是Netty的線程模型,能夠看到服務端有兩個group而客戶端只有一個,它們就是Netty中的線程池。
  • Netty中Channel,沒有直接使用Java原生的ServerSocketChannel和SocketChannel,而是包裝了NioServerSocketChannel和NioSocketChannel與之對應。

 固然,也有對其餘協議的支持,如支持UDP協議的 NioDatagramChannel本文只關心TCP相關的。

  • 左邊handler(...)方法指定了一個handler(LoggingHandler),這個handler是給服務端收到新的請求的時候處理用的,右邊handler(...)方法指定了客戶端處理請求過程當中須要使用的handlers。

若是你想在EchoServer中也指定多個handler也能夠像右邊的EchoClient同樣使用ChannelInitializer

  • 左邊childHandler(…) 指定了childHandler,這邊的handlers是給新建立的鏈接用的,咱們知道服務端ServerSocketChannel在accept一個鏈接之後,須要建立SocketChannel的實例,childHandler(…)中設置的handler就是用於處理新建立的SocketChannel的,而不是用來處理ServerSocketChannel實例的。
  • pipeline:handler能夠指定多個(須要上面的ChannelInitializer類輔助),它們會組成了一個 pipeline,它們其實就相似攔截器的概念,如今只要記住一點每一個NioSocketChannel或NioServerSocketChannel實例內部都會有一個pipeline實例pipeline中還涉及到handler 的執行順序。
  • ChannelFuture:這個涉及到Netty中的異步編程,和JDK中的Future接口相似。

對於不瞭解Netty的讀者,也不要有什麼壓力,燈塔君會一一介紹它們,本文主要面向新手,燈塔君以爲比較難理解或比較重要的部分,會花比較大的篇幅來介紹清楚。

上面的源碼中沒有展現消息發送和消息接收的處理,此部分燈塔君會在介紹完上面的這些內容之後再進行介紹。

下面,將分塊來介紹這些內容。鑑於讀者對NIO或Netty的瞭解程度可能良莠不齊,燈塔君爲了照顧初學者不少地方須要囉嗦一些,因此但願讀者一節一節往下看,對於本身熟悉的內容能夠適當看快一些,敬請期待!

365天干貨不斷,能夠微信搜索「 猿燈塔」第一時間閱讀,回覆【資料】【面試】【簡歷】有我準備的一線大廠面試資料和簡歷模板
相關文章
相關標籤/搜索