Java程式設計師進化必知:Netty

Java程序員進化必知:Netty

作為一個已經有了幾年工作經驗的JAVA程序員,網絡編程是一個必須接觸的一個領域.如果你還只是停留在會用MVC框架,優化只會用用緩存,平常寫寫CRUD的水平,那麼你對編程的理解還停留在一個非常表層的階段!

如果想要深入理解各種服務器,Netty就是我們要過的第一道坎

Netty是什麼

我在NIO的文章中簡單學習了NIO的使用,現在回想一下,可以發現NIO的API設計過於複雜,代碼量比較大,使用中需要考慮的細節也很多,如果對底層瞭解不深的同學寫出來的代碼可能會有各種各樣的BUG導致服務不夠穩定.

Netty就是為了解決這個問題而開發的一套簡單易用封裝良好的NIO框架,使用Netty可以快速輕鬆地開發協議服務器和客戶端等網絡應用程序。它極大地降低了網絡編程的開發難度,極大簡化了開發過程。

Netty可以用來幹什麼?

  • 開發自定義的HTTP服務器
  • 開發自定義的FTP服務器
  • 開發自定義的UDP服務器
  • 開發自定義的RPC服務器,例如Dubbo就是基於Netty
  • 開發自定義的WebSocket服務器
  • 開發自定義的Proxy服務器,例如MySQL的Proxy服務器等
  • 總之就是可以開發定製符合自己需求的各種自定義協議和服務器

為什麼選擇Netty?

NIO框架有Netty , Mina , xSocket , Grizzly等,為什麼選擇Netty呢?

雖然NIO框架有很多,但是使用比較廣泛的就是Netty和Mina,從學習成本和後期維護難度上來考慮選擇流行的框架可以降低開發維護難度和風險.

Netty 和Mina的作者其實都是同一個人Trustin Lee (韓國人),但是Netty出生的更晚, 作者在寫出了Mina之後又搞出了Netty, 所以從這方面來說Netty應該更加完善.

從使用上來講目前很多著名的開源項目比如阿里的Dubbo,Apache Spark , FaceBook Nifty , Google gRPC 等都是基於Netty.

其實最根本的還是超高的性能和簡單的API

Netty架構

這是Netty4.1官方架構圖,我們先大概瞭解一下

Java程序員進化必知:Netty

Netty中幾個重要概念

Channel

Channel是Netty最核心的接口,一個Channel就是一個聯絡Socket的通道,通過Channel,你可以對Socket進行各種操作。

ChannelHandler

ChannelHandler:每一個ChannelHandler都用來處理一些邏輯,所有的handler形成一個鏈表結構,作用類似於springMVC中的攔截棧或者一個個的過濾器

ChannelHandlerContext

ChannelHandlerContext是ChannelPipeline的上下文,負責傳遞上下文數據. ChannelHandlerContext.channel()方法可以得到和Context綁定的Channel,調用ChannelHandlerContext.handler()方法可以得到和Context綁定的Handler。

ChannelPipeline

ChannelPipeline:可以把ChannelPipeline看成是一個ChandlerHandler的鏈表,當需要對Channel進行某種處理的時候,Pipeline負責依次調用每一個Handler進行處理。每個Channel都有一個屬於自己的Pipeline,調用XXChannel.pipeline()方法可以獲得Channel的Pipeline,調用XXPipeline.channel()方法可以獲得Pipeline的Channel。

他們的關係圖如下:

Java程序員進化必知:Netty

簡單瞭解完這些概念之後我們就可以寫個helloworld來體驗一把Netty了

要求JDK1.6或以上

Netty5.0官方已經不再支持了,不建議大家使用

目前最新穩定版是4.1

添加依賴

Java程序員進化必知:Netty

編寫Server端

Java程序員進化必知:Netty

服務端涉及到了一個自定義的Handler用來處理接受到的數據

Java程序員進化必知:Netty

編寫Client端

Java程序員進化必知:Netty

Client端負責數據處理的Handler

Java程序員進化必知:Netty

啟動Server—>啟動Client—>查看日誌

# server端日誌:這裡給大家展示覆蓋了ChannelInboundHandlerAdapter 中所有方法打印的日誌,方便大家理解整個處理流程
handlerAdded
channelRegistered
channelActive
18:13:27.672 [nioEventLoopGroup-3-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxCapacityPerThread: 32768
18:13:27.672 [nioEventLoopGroup-3-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxSharedCapacityFactor: 2
18:13:27.672 [nioEventLoopGroup-3-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.linkCapacity: 16
18:13:27.672 [nioEventLoopGroup-3-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.ratio: 8
18:13:27.683 [nioEventLoopGroup-3-1] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.bytebuf.checkAccessible: true
18:13:27.685 [nioEventLoopGroup-3-1] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@125622c7
server收到數據:Hello I am Client
channelReadComplete
channelInactive
channelUnregistered
handlerRemoved
# Client端日誌:
Client 收到數據:你好,我是Server
18:13:29.903 [nioEventLoopGroup-2-1] DEBUG io.netty.buffer.PoolThreadCache - Freed 2 thread-local buffer(s) from thread: nioEventLoopGroup-2-1

單從代碼量來看用過NIO的同學應該就可以感受到使用Netty比直接使用NIO要簡單了太多了吧,但是Netty更大的好處其實是進行了完好的封裝,我們可以少關注很多繁瑣的細節的處理。

Netty4.0文檔(官方推薦使用4.x版本):http://netty.io/4.0/api/index.html

w3cSchool的Netty手冊:https://www.w3cschool.cn/netty4userguide/

http://ifeve.com/netty-home/

http://www.cnblogs.com/shanyou/p/4085802.html


分享到:


相關文章: