主頁 > 軟體設計 > Java首席技術官:什么!你連Netty還不會,還高性能開發?還拿著20k?厚顏無恥!

Java首席技術官:什么!你連Netty還不會,還高性能開發?還拿著20k?厚顏無恥!

2020-11-25 12:24:15 軟體設計

主管:這個版塊用Netty框架就可以了呀,不會嗎?

(此時,公司CTO路過)

某程式員:這個我真不會...

主管:好了好了,那這一塊我交給別人去做,這個也不難啊?!

某程式員:大佬,我一定會好好學習,早日把這一塊弄懂!

主管:行了,你先去忙吧!

CTO:慢著!這是什么情況?專案分配下去了,怎么能又安排其他同事來加班做呢?

主管:總監,專案這個版塊涉及到高性能的開發,這個同事可能搞不定,眼看著專案要上線了,還是讓經驗豐富的工程師來做吧!

CTO(兇狠的對著程式員):那也不行,拿著這么高的工資,這都做不了,Netty都不會用,你怎么好意思拿20K的?

某程式員(委屈地):大佬,我每個月只有8K...

CTO:...哦,算了,當我沒來

公司CTO:高性能開發,你不會Netty,怎么好意思拿20K?


我不記得是誰跟我說過,“十個高性能,九個用Netty”,我也不知道是騙我的還是咋的...

Netty到底有這么重要嗎?

我翻閱了一下我手中的各大廠面試真題,問BIO、NIO、異步這一塊的也有,Netty出現的頻次不算很高,也許我看的是初中級的面試題吧,

無論怎么說,想要漲薪升職,高性能、高并發、高可用你就不得不會,

這里,我就來分享一些Netty相關的核心技術點:

注:由于篇幅原因,我就簡單的提取其中部分,獲取完整內容及高清導圖,加威信 mxj94670 來免費領取!

Netty 原理

Netty 是一個高性能、異步事件驅動的 NIO 框架,基于 JAVA NIO 提供的 API 實作,它提供了對TCP、UDP 和檔案傳輸的支持,作為一個異步 NIO 框架,Netty 的所有 IO 操作都是異步非阻塞的,通過 Future-Listener 機制,用戶可以方便的主動獲取或者通過通知機制獲得 IO 操作結果,

Netty 高性能

在 IO 編程程序中,當需要同時處理多個客戶端接入請求時,可以利用多執行緒或者 IO 多路復用技術進行處理,IO 多路復用技術通過把多個 IO 的阻塞復用到同一個 select 的阻塞上,從而使得系統在單執行緒的情況下可以同時處理多個客戶端請求,與傳統的多執行緒/多行程模型比,I/O 多路復用的最大優勢是系統開銷小,系統不需要創建新的額外行程或者執行緒,也不需要維護這些行程和執行緒的運行,降低了系統的維護作業量,節省了系統資源,

與 Socket 類和 ServerSocket 類相對應,NIO 也提供了 SocketChannel 和 ServerSocketChannel兩種不同的套接字通道實作,

1、多路復用通訊方式

Netty 架構按照 Reactor 模式設計和實作,它的服務端通信序列圖如下:

客戶端通信序列圖如下:

Netty 的 IO 執行緒 NioEventLoop 由于聚合了多路復用器 Selector,可以同時并發處理成百上千個客戶端 Channel,由于讀寫操作都是非阻塞的,這就可以充分提升 IO 執行緒的運行效率,避免由于頻繁 IO 阻塞導致的執行緒掛起,

  • 異步通訊 NIO

由于 Netty 采用了異步通信模式,一個 IO 執行緒可以并發處理 N 個客戶端連接和讀寫操作,這從根本上解決了傳統同步阻塞 IO 一連接一執行緒模型,架構的性能、彈性伸縮能力和可靠性都得到了極大的提升,

  • 零拷貝(DIRECT BUFFERS 使用堆外直接記憶體)

1、Netty 的接收和發送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接記憶體進行 Socket 讀寫,不需要進行位元組緩沖區的二次拷貝,如果使用傳統的堆記憶體(HEAP BUFFERS)進行 Socket 讀寫,JVM 會將堆記憶體 Buffer 拷貝一份到直接記憶體中,然后才寫入 Socket 中,相比于堆外直接記憶體,訊息在發送程序中多了一次緩沖區的記憶體拷貝,

2、Netty 提供了組合 Buffer 物件,可以聚合多個 ByteBuffer 物件,用戶可以像操作一個 Buffer 那樣方便的對組合 Buffer 進行操作,避免了傳統通過記憶體拷貝的方式將幾個小 Buffer 合并成一個大的Buffer,

3、Netty的檔案傳輸采用了transferTo方法,它可以直接將檔案緩沖區的資料發送到目標Channel,避免了傳統通過回圈 write 方式導致的記憶體拷貝問題,

  • 記憶體池(基于記憶體池的緩沖區重用機制)

隨著 JVM 虛擬機和 JIT 即時編譯技術的發展,物件的分配和回收是個非常輕量級的作業,但是對于緩沖區 Buffer,情況卻稍有不同,特別是對于堆外直接記憶體的分配和回收,是一件耗時的操作,為了盡量重用緩沖區,Netty 提供了基于記憶體池的緩沖區重用機制,

  • 高效的 Reactor 執行緒模型

常用的 Reactor 執行緒模型有三種,Reactor 單執行緒模型, Reactor 多執行緒模型, 主從 Reactor 多執行緒模型,

Reactor 單執行緒模型

指的是所有的 IO 操作都在同一個 NIO 執行緒上面完成,NIO 執行緒的職責如下:

1) 作為 NIO 服務端,接收客戶端的 TCP 連接;

2) 作為 NIO 客戶端,向服務端發起 TCP 連接;

3) 讀取通信對端的請求或者應答訊息;

4) 向通信對端發送訊息請求或者應答訊息,

由于 Reactor 模式使用的是異步非阻塞 IO,所有的 IO 操作都不會導致阻塞,理論上一個執行緒可以獨立處理所有 IO 相關的操作,從架構層面看,一個 NIO 執行緒確實可以完成其承擔的職責,例如,通過Acceptor 接收客戶端的 TCP 連接請求訊息,鏈路建立成功之后,通過 Dispatch 將對應的 ByteBuffer派發到指定的 Handler 上進行訊息解碼,用戶 Handler 可以通過 NIO 執行緒將訊息發送給客戶端,

Reactor 多執行緒模型

Reactor 多執行緒模型與單執行緒模型最大的區別就是有一組 NIO 執行緒處理 IO 操作, 有專門一個NIO 執行緒-Acceptor 執行緒用于監聽服務端,接收客戶端的 TCP 連接請求; 網路 IO 操作-讀、寫等由一個 NIO 執行緒池負責,執行緒池可以采用標準的 JDK 執行緒池實作,它包含一個任務佇列和 N個可用的執行緒,由這些 NIO 執行緒負責訊息的讀取、解碼、編碼和發送;

主從 Reactor 多執行緒模型

服務端用于接收客戶端連接的不再是個 1 個單獨的 NIO 執行緒,而是一個獨立的 NIO 執行緒池,Acceptor 接收到客戶端 TCP 連接請求處理完成后(可能包含接入認證等),將新創建的SocketChannel 注冊到 IO 執行緒池(sub reactor 執行緒池)的某個 IO 執行緒上,由它負責SocketChannel 的讀寫和編解碼作業,Acceptor 執行緒池僅僅只用于客戶端的登陸、握手和安全認證,一旦鏈路建立成功,就將鏈路注冊到后端 subReactor 執行緒池的 IO 執行緒上,由 IO 執行緒負責后續的 IO 操作,

等等...

Netty RPC 實作

概念

RPC,即 Remote Procedure Call(遠程程序呼叫),呼叫遠程計算機上的服務,就像呼叫本地服務一樣,RPC 可以很好的解耦系統,如 WebService 就是一種基于 Http 協議的 RPC,這個 RPC 整體框架如下:

等等...

以上資料或者檔案 面試資料 有需要的朋友掃描下方直接免費獲取!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/227569.html

標籤:其他

上一篇:《零基礎看得懂的C++入門教程 》——(1)第一個C++程式就讓你知其所以然

下一篇:年輕人你不講武德,自己偷著學習!Spring Security五套「原始碼級」筆記哪里來的?我也要!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more