netty框架概述

来源:https://www.cnblogs.com/zhuge134/archive/2019/06/21/11062266.html
-Advertisement-
Play Games

概述 最近在學習netty的相關知識,也在看netty的源碼,光看不練假把式,所以也正好利用自己學習的機會寫幾篇netty的分析文章,主要還是一些源碼解析的文章,一方面有輸出會促使自己在看源碼,學習原理的過程中更系統,更深入,同時也能加強記憶,鞏固對知識的理解。 關於netty的簡介和應用我就不做介 ...


概述

最近在學習netty的相關知識,也在看netty的源碼,光看不練假把式,所以也正好利用自己學習的機會寫幾篇netty的分析文章,主要還是一些源碼解析的文章,一方面有輸出會促使自己在看源碼,學習原理的過程中更系統,更深入,同時也能加強記憶,鞏固對知識的理解。

關於netty的簡介和應用我就不做介紹了,在網路上都能搜索到相關的資料。

netty是一個性能非常優秀的網路框架,採用reactor模式,使用非常高效的基於事件驅動的io線程模型,即經典的多路復用的io模式。關於io線程模型其實又是一個很大的話題,涉及到操作系統的底層原理,後面有時間我也打算深入學習一下這方面的知識,並寫一些相關的分析文章。

我的整體思路是這樣的:首先,以netty提供給用戶的常用的介面為切入點,一步步地深入netty內核進行分析,因為netty的模塊眾多,而且某一個層級往往有很多種平級的模塊,這些不同的模塊一般代表了不同的實現機制或不同的功能,如根據多路復用系統調用的不同就分為EpollEventLoop,NioEventloop,KQueueEventLoop等;根據不同的應用層協議把編解碼器分為不同種類,如http,smtp, http2, xml等等。所以,我們只需要分析其中的一套,其他類型的在實際用到時在深入瞭解,這樣既能整體上掌握框架,也能深入實現的細節。

 

netty應用示例

之前對spark-core的源碼進行過一些講解,分析了spark-core中的大部分模塊,但是其中有一個很重要的模塊卻沒有分析,那就是spark的rpc模塊,spark的rpc模塊是基於netty實現的,也是對netty的一個很典型的應用,所以這裡我還是以spark中的rpc模塊為示例,切入netty的源碼分析。

 1 // 初始化netty服務端
 2   private void init(String hostToBind, int portToBind) {
 3 
 4     // io模式,有兩種選項NIO, EPOLL
 5     IOMode ioMode = IOMode.valueOf(conf.ioMode());
 6     // 創建bossGroup和workerGroup,即主線程組合子線程組
 7     EventLoopGroup bossGroup =
 8       NettyUtils.createEventLoop(ioMode, conf.serverThreads(), conf.getModuleName() + "-server");
 9     EventLoopGroup workerGroup = bossGroup;
10 
11     // 緩衝分配器,分為堆記憶體和直接記憶體
12     PooledByteBufAllocator allocator = NettyUtils.createPooledByteBufAllocator(
13       conf.preferDirectBufs(), true /* allowCache */, conf.serverThreads());
14 
15     // 創建一個netty服務端引導對象,並設置相關參數
16     bootstrap = new ServerBootstrap()
17       .group(bossGroup, workerGroup)
18       .channel(NettyUtils.getServerChannelClass(ioMode))
19       .option(ChannelOption.ALLOCATOR, allocator)
20       .childOption(ChannelOption.ALLOCATOR, allocator);
21 
22     // 記憶體使用的度量對象
23     this.metrics = new NettyMemoryMetrics(
24       allocator, conf.getModuleName() + "-server", conf);
25 
26     // 排隊的連接數
27     if (conf.backLog() > 0) {
28       bootstrap.option(ChannelOption.SO_BACKLOG, conf.backLog());
29     }
30 
31     // socket接收緩衝區大小
32     if (conf.receiveBuf() > 0) {
33       bootstrap.childOption(ChannelOption.SO_RCVBUF, conf.receiveBuf());
34     }
35 
36     // socket發送緩衝區大小
37     if (conf.sendBuf() > 0) {
38       bootstrap.childOption(ChannelOption.SO_SNDBUF, conf.sendBuf());
39     }
40 
41     // 子channel處理器
42     bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
43       @Override
44       protected void initChannel(SocketChannel ch) {
45         RpcHandler rpcHandler = appRpcHandler;
46         for (TransportServerBootstrap bootstrap : bootstraps) {
47           rpcHandler = bootstrap.doBootstrap(ch, rpcHandler);
48         }
49         context.initializePipeline(ch, rpcHandler);
50       }
51     });
52 
53     InetSocketAddress address = hostToBind == null ?
54         new InetSocketAddress(portToBind): new InetSocketAddress(hostToBind, portToBind);
55     // 綁定到ip地址和埠
56     channelFuture = bootstrap.bind(address);
57     // 同步等待綁定成功
58     channelFuture.syncUninterruptibly();
59 
60     port = ((InetSocketAddress) channelFuture.channel().localAddress()).getPort();
61     logger.debug("Shuffle server started on port: {}", port);
62   }

netty使用一個引導對象ServerBootstrap來引導服務端的啟動,最後的bootstrap.bind(address)實際出發了一系列的初始化機制。

總結

本節,我主要是開了一個頭,以spark中rpc服務端的初始化為例子切入netty的源碼。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說到Tab切換,你可能首先想到的就是使用jQuery,短短幾行代碼就可以輕鬆搞定一個Tab切換。 而今天所要分享的,是使用 0 行JS代碼來實現Tab切換! 具體效果如下: Tab切換 方法一:模擬單選框原理 關於模擬單選框,在我之前文章中有講到,詳情請戳→純CSS模擬單選框和覆選框 該方法大致原理 ...
  • css等比例分割父級容器(完美三等分) 父級容器的寬度一定,要實現子元素等比例完美均分父級寬度,實現方式有哪些? html部分代碼: 方法一: 浮動佈局+百分比 (將子元素依次左浮動,根據子元素的個數,設定每個子元素的寬度百分比) 方法二:行內元素(inline-block)+百分比 方法三: 父元 ...
  • 基本打包機制 本質上,webpack 是一個現代 JavaScript 應用程式的靜態模塊打包器(module bundler)。當 webpack 處理應用程式時,它會遞歸地構建一個依賴關係圖(dependency graph),其中包含應用程式需要的每個模塊,然後將所有這些模塊打包成一個或多個 ...
  • 將多個*.ts文件打包成一個*.min.js文件的開發配置 1、初始化 新建以下文件目錄: 2、安裝依賴: 3、tsconfig.json 參數含義參考https://www.tslang.cn/docs/handbook/compiler-options.html 4、babelrc useBui ...
  • 一. 現狀 由於之前採用Lodop列印控制項(商業版付費,可以使用免費版 但是會有水印)去列印小票,是一行一行的列印,但是不滿足UI給到複雜佈局的小票樣式,所以得重新考慮如何來實現。 二. 介紹 art template介紹 art template 是一個簡約、超快的模板引擎。 它採用作用域預聲明的 ...
  • 主要記錄在ios瀏覽器出現觸摸無限載入的情況 使用vue-scroller和mescroll.js/mescroll.vue先踩ios瀏覽器預設滑動會影響mescroll的方法調用。 首先給公共js加入以下代碼禁用我們的頁面在ios瀏覽器下會滑動上下頁面。 下麵給body設置樣式: html, bo ...
  • 父組件主動獲取子組件的數據和方法 1.調用子組件的時候 定義一個ref <headerchild ref="headerChild"></headerchild> 2.在父組件裡面通過 this.$refs.headerChild.屬性 t his.$refs.headerChild.方法 子組件主 ...
  • 1、安裝charles,點擊幫助——ssl代理——在移動設備或遠程瀏覽器上安裝charles root證書,看到如下界面: 2、在手機保證和電腦連接同一個wifi的前提下,開啟手機代理,輸入伺服器地址:192.168.5.252,埠號為:8888,有時候新手機連接代理,charles會提示是否允許 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...