Netty關鍵組件ByteBuf、BootStrap

一、ByteBuf

1.內存結構

ByteBuf本質上引用了一段內存,這段內存可以是堆內也可以是堆外的,然後用引用計數來控制這段內存是否需要被釋放,分別使用讀寫指針來控制對 ByteBuf 的讀寫,可以理解爲是外觀模式的一種使用。

2.ByteBuf的字節數組的三種模式:

  • 堆緩衝區模式(Heap Buffer)
  • 直接緩衝區模式(Direct Buffer)
  • 複合緩衝區模式(Composite Buffer)

3.ByteBuf的釋放

  1. InBound,每個Handler對ByteBuf的處理有以下三種方式:
  • 對原消息不做處理,調用 ctx.fireChannelRead(msg)把原消息往下傳,此時不做釋放;
  • 將原消息轉化爲新的消息並調用 ctx.fireChannelRead(newMsg)往下傳,那必須把原消息release掉;
  • 如果已經不再調用ctx.fireChannelRead(msg)傳遞任何消息,那更要把原消息release掉;
  1. OutBound
    要發送的消息通常由應用所創建,並調用 ctx.writeAndFlush(msg) 進入Handler鏈。在每一個Handler中的處理類似InBound Message,最後消息會來到HeadHandler,再經過一輪複雜的調用,在flush完成後終將被release掉。

  2. Exception
    多層的異常處理機制,有些異常處理的地方不一定準確知道ByteBuf之前釋放了沒有,可以在釋放前加上引用計數大於0的判斷避免異常; 有時候不清楚ByteBuf被引用了多少次,但又必須在此進行徹底的釋放,可以循環調用reelase()直到返回true。

source: Netty之ByteBuf的創建和釋放

二、BootStrap

Bootstrap是用來組織Netty的各個結構(pipeline,handler,eventloop),並使他們運行起來的類結構。分成兩塊,一個是客戶端引導類Bootstrap,只用1個channel來處理所有的網絡交互,另一個是服務端的ServerBootstrap,它提供一個父channel來接受客戶端的請求,然後父channel創建多個子channel來用於的通信。

Bootstrap是開發netty客戶端的基礎,通過Bootstrap的connect方法來連接服務器端。該方法返回的也是ChannelFuture,通過這個我們可以判斷客戶端是否連接成功,以便我們在連接成功之後,做一些其他的事情。但是在調用connect方法前,我們需要指定EventLoopGroup,channelFactory(不指定這個,就會使用netty默認的channelFactory,但是需要指定channel,初始channel時,同時會初始化channelFactory),ChannelHandler。這些都是必須指定的,不指定就會報異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章