前言
前幾日有個小老弟找我哭訴,擠破腦袋進Alibaba,三輪技術下來倒在了**緩存技術(Redis+MongDB)**上。聽完我這小老弟的一番肺腑之言,這…緩存架構技術:Redis+MongDB,不就是阿裡P7面試必跳的坑?跳不過去那就隻能say godbye了,在坑裡“等死”呀…緊接着…吾日三省吾身,突然發現自己掌握的好像也不咋滴,不得不回家好好“補一補”。

熬了三天三夜,四處收集緩存架構相關的:Redis+MongDB面試、實戰等等筆記資料,完事之後感覺還不錯呢,今天特地拿出來獻寶~~
流程描述
我們從bind函數開始:
1、首先建立了兩個NioEventLoopGroup,這是初始化了兩個線程組,這兩個線程組根據命名可以知道一個是bossGroup,是伺服器用來接收用戶端的請求的,另一個是workGroup是用來處理NioServerSocketChannel的網絡讀寫的。這兩個線程組實際承擔的是一個Reactor的角色。
2、第二步就是初始化一個ServerBootstrap,這是Netty用于啟動NIO服務端的輔助啟動類,目的是降低伺服器開發的複雜度。ServerBootstrap的初始化首先是調用group方法,将兩個線程組作為參數傳到ServerBootstrap中。接着建立channel為NioServerSocketChannel。然後調用option配置channel的TCP參數,其中SO_BACKLOG設定為1024的意思是伺服器監聽隊列的大小是1024,最後設定處理IO事件的處理器ChildChannelHandler,它的作用類似于Rector模式中的handler用來處理IO事件。
3、啟動類初始化完成後調用ServerBootstrap的bind方法綁定端口,監聽請求,在調用sync等待綁定完成。完成之後傳回一個ChannelFuture作用是用于異步操作的通知回調。
4、調用 future.channel().closeFuture().sync進行阻塞,等待服務端鍊路關閉main函數退出。
5、調用EventLoopGroup的shutdownGracefully方法,釋放相關的資源。
Netty的線程模型
netty是一個高可用的基于事件驅動的異步的NIO架構,核心的線程模型是Reactor,Reactor線程模型有單線程Reactor,多線程Reactor和多線程主從複制的Reactor,這裡我們就用最簡單的單線程Reactor來分析下Netty的線程模型,進而來看Netty的相關核心類在此模型下扮演的角色和作用。
在網絡互動中,無論你是建立連接配接進行通信還是資料的讀寫都是繼續網絡通信協定的,底層就是TCP/IP協定棧,協定棧是作業系統層的,我們無法修改他的協定棧,但是作業系統給了我們可以操作和使用協定棧的接口,比如我們經常使用的bind、accept、connect等,而這寫操作的本身,我們都是對socket的操作,是以我們可以任務一個socket,就是使用者跟TCP/IP協定棧進行互動的門戶。
傳統的IO
一請求一應答,這是BIO。每次讀寫都需要生成新的線程,請求多的時候占用大量的線程資源。高并發的情況下很可能造成巨大的線上故障。
NIO Reactor模型
socket注冊到Selector中,由Selector決策哪個事件可以執行。
Netty的線程模型
伺服器的線程模型為例:
抽象出NioEventLoop來表示一個不斷循環執行處理任務的線程,每個NioEventLoop有一個selector,用于監聽綁定在其上的socket鍊路。服務端維護了兩個EventLoopGroup,一個bossGroup,一個workGroup,bossGroup用來處理用戶端的連接配接請求,然後打開Channel,把這個Channel交給workGroup中的一個EventLoop被注冊來處理該Channel上的所有請求。一個Channel隻會被一個workGroup處理,一個workGroup可以同時被多個Channel使用。
簡單了解了Netty的一個線程模型,我們來看看netty程式設計中那些核心類的作用。
Netty架構
核心類分析
EventLoop
EventLoop是Netty中極其重要的元件,翻譯為時間循環,一個EventLoop被配置設定給Channel來負責這個Cahnnel上的所有事件。EventLoop你可以了解為一個線程,EventLoopGroup是一個線程池,EventLoopGroup繼承ScheduledExecutorService,也就是排程線程池,理論上EventLoopGroup應該具有ScheduledExecutorService的所有的功能,之是以叫做事件循環,我猜想它必然有一個循環把Cahnnel上面準備就緒的事件送出給一個Thread來處理。這個實作在SingleThreadEventLoop的一個繼承類EpollEventLoop中的run方法實作
最後
做任何事情都要用心,要非常關注細節。看起來不起眼的、繁瑣的工作做透了會有意想不到的價值。
當然要想成為一個技術大牛也需要一定的思想格局,思想決定未來你要往哪個方向去走, 建議多看一些人生規劃方面的書籍,多學習名人的思想格局,未來你的路會走的更遠。
更多的技術點思維導圖我已經做了一個整理,涵蓋了當下網際網路最流行99%的技術點,在這裡我将這份導圖分享出來,以及為金九銀十準備的一整套面試體系,上到集合,下到分布式微服務
如何獲得這套優質的資料呢?
621415445740)]
[外鍊圖檔轉存中…(img-ozY09apK-1621415445741)]
如何獲得這套優質的資料呢?
Java面試精選題、架構實戰文檔傳送門:戳這裡免費領取