<noframes id="vddlx"><form id="vddlx"><nobr id="vddlx"></nobr></form>

    <noframes id="vddlx">
    <listing id="vddlx"><nobr id="vddlx"><meter id="vddlx"></meter></nobr></listing>
    <form id="vddlx"><th id="vddlx"><progress id="vddlx"></progress></th></form><em id="vddlx"></em>

      
      

      <listing id="vddlx"><listing id="vddlx"><menuitem id="vddlx"></menuitem></listing></listing>

        <span id="vddlx"></span>

          netty學習筆記整理一基礎篇

          技術標簽: 讀后感  netty  java

           
          一:.netty組件:
           服務端啟動過程:通過jdk創建channel并包裝為自己的channel -> init初始化channel->注冊selector ->dobind()往jdk注冊一個op-accept實現就可以開始接受消息了
               1. NioEventLoopGroup
              相當于serversocket接受連接bossgroup,傳輸消息的功能workgroup,
              其實就是線程池管理 NioEventLoop
             2. NioEventLoop
              真正接受鏈接,處理數據的組件,netty通過select來完成socket的接受和處理
            3.channel 
              相當于socket,通過 .channel ( NioServerSocketChannel. class )反射設置channel類型
              channel過程: jdk底層channel創建 -> channel TCP相關配置 -> 設置非阻塞模式 ->把channel注冊到pipline中執行
          4.handle
              進行數據業務處理的組件
          5.selector
             channel 綁定eventloop 注冊到jdk的selector,然后 回調注冊的 ChannelInboundHandlerAdapter子類的 channelRead等 方法
           
           
          二.NioEventLoop詳解
           
          問題引入:
            1.netty服務端啟動多少個線程(默認2*cpu),什么時候啟動
            2.jdk空轉輪詢的bug(主要是selector本來是阻塞的,但是當連接異常了,selector被喚醒了):通過時間判斷selctor次數,超過512創建新的selector,把舊的key注冊到新的selector
            3.netty怎么實現異步串行無鎖化的:handle是線程安全的,會把線程執行封裝成task放到taskQueue中順序執行
           
          1.nioeventloop創建過程(構造創建selector和定時任務隊列):
          默認先創建2*cpu個線程(線程前綴:nioeventloop-'i'- j):'i 第幾個group組'- j(第幾個線程)
          每一個線程就是一個EventExecutor,也就是 nioeventloop。然后創建EventExecutorChooser ,這個東西就是為了當有鏈接進來的時候進行loop線程綁定,這邊有做性能優化,如果線程數是2的冪等就做位運算來提高綁定效率
          public EventExecutorChooser newChooser ( EventExecutor [] executors ) {
          if ( isPowerOfTwo ( executors. length )) {
          return new PowerOfTwoEventExecutorChooser ( executors ) ;
          } else {
          return new GenericEventExecutorChooser ( executors ) ;
          }
          }
           
          2.nioeventloop啟動
          1.綁定端口
          2.主線程使用 nioeventloop創建過程 構造函數 創建的線程task->存在 taskQueue里面-> 啟動run方法
           
          3.nioeventloop執行(run方法)
            for ( ;; ) 判斷selector類型即檢測io事件 -> select方法調用-> taskQueue中取任務進行執行
           select方法:判斷selctor是否被喚醒/taskQueue是否被其他線程添加任務/是否有定時任務  滿足條件執行,否則阻塞1s
           執行任務: runAllTasks:會把定時任務和普通任務合并一起執行
          (通過debug發現,一次selector事件可以執行多次任務,比如client沒10s發一次消息,如果debug阻塞10次,然后10次會循環輸出)
          然后client發送消息會繼續走nioEventLoop.run() ->  runAllTasks()方法   就是有兩個for循環
           
          client執行任務調用的是: runAllTasks()方法,  server接受讀寫任務是: processSelectedKeys ()  方法
           
           
          三.netty 連接處理
           1.新連接接入控制速率一次16個 
           2.新連接處理的channel:niosocketChannel
           3.niosocketChannel 客戶端channel構造函數注冊的是op_read事件,nioserversocketchannel 服務端channel注冊的是accept事件
           
           
          4.新連接NioEventLoop的分配和selector注冊
          添加childHandler->設置options和attrs(主要設置用戶設置的一些tcp參數)->選擇nioeventloop并注冊selector
           
          新鏈接處理邏輯總結:服務端檢測到新連接 ->創建nioSocketChannel->綁定nioeventloop,注冊selector,注冊讀事件
           
          四. pipeline和channelHandle
           
           
          inBound事件的傳播:
             
             添加channelHandle:封裝為channelHandleContext 放入到pipline鏈表中,然后觸發回調通知用戶已經添加
          inBound是從pipline鏈表從頭到尾執行,如果執行到最后節點,tailContext :處理未捕獲的異常/未處理的消息會debug輸出建議你去處理并釋放消息
           
           
          outBound 事件的傳播:  wirte()進行回寫,給client響應
          outBound是從pipline鏈表從尾到頭執行,如果中間節點不傳播繼續write()則結束
           
          異常的傳播:
          如果當前handleA報錯,會把錯誤繼續向下個節點順序傳播,直到被處理,通過復寫exceptionCaught處理異常
           
          異常處理最佳實踐:hadle鏈增加一個exceptionhandle。處理
           
          版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
          本文鏈接:https://blog.csdn.net/qq1076472549/article/details/109777970

          智能推薦

          JavaScript基礎篇學習筆記

          JavaScript基礎篇學習筆記   第一章 問候JavaScript 他大爺 第一節:JavaScript 簡介 百度百科: JavaScript一種直譯式腳本語言,是一種動態類型、弱類型、基于原型的語言,內置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的腳本語言,最早是在HTML(標準通用標記語言下的一個應用)網頁上使用,用來給HTML網頁增...

          Netty基礎入門學習

          【1】Netty是什么 Netty官網:https://netty.io/ 4.x用戶指南:https://netty.io/wiki/user-guide-for-4.x.html GitHub地址:https://github.com/netty/netty Netty官網推薦使用4.x版本。這里使用的是依賴如下: ① 有這樣幾個描述: Netty是一個異步事件驅動的網絡應用程序框架, 用于快...

          學習netty基礎

          開始學習netty 之前,希望我們知道傳統的IO編程。  IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。 NIO和BIO的主要區別 BIO是面向流的,NIO是面向緩沖區. NIO的三個核心組件: .Channel  . Buffer .Selector,其它組件,如Pipe和FileLock,只不過是與三個核心組件共同使用的工具類 ...

          通過pytorch建立神經網絡模型 分析遺傳基因數據

          DNA雙螺旋(已對齊)合并神經網絡(黃色) 我最近進行了有關基因序列的研究工作。我想到的主要問題是:“哪一種最簡單的神經網絡能與遺傳數據最匹配”。經過大量文獻回顧,我發現與該主題相關的最接地氣卻非常有趣的工作是在Yoshua Bengio 教授的實驗室中進行的。這篇論文的題目是:“飲食網絡:脂肪基因組學的瘦參數”,它的主要目標是將基因序列劃分為26個...

          在cmd下運行javac報告javac不是內部或外部命令,但是運行java、java-version正常

          首先在環境變量配置都沒有問題的情況下還出現了“javac不是內部或外部命令”的情況下,是因為安裝的jdk的bin目錄下丟失了ava.exe文件。 那么它到底丟哪去了呢?回答:被覆蓋了。 當下載jdk并安裝的時候,你會發現安裝是要分兩次進行的,過程要選兩次安裝路徑。 第一次提示安裝的是jdk,第二次安裝的是jre,兩個安裝路徑不能放在同一個路徑里,要分別安裝到不同的路徑。 最...

          猜你喜歡

          Hyper-V 3.0功能部署PART 5:秒級實時遷移

          在前面的一些文章中我們已經逐漸的看到Hyper-V 3.0的強大之處,今天我們將繼續來部署配置Hyper-V 3.0的功能。在前面的文章中我們已經將虛擬機的文件或者說虛擬機的虛擬磁盤放在了SMB共享存儲中,實現了基本的虛擬機磁盤放SMB共享存儲服務器-虛擬機運行放Hyper-V主機服務器的局面。那么在此基礎上,我們就可以實現秒級的虛擬機實時移動功能了。 要實現秒級的移動功能。我...

          Apache再次接受阿里開源產品捐贈:移動開發框架Weex進入孵化

          12月15日,阿里巴巴宣布將移動開源項目Weex捐贈給Apache基金會開始孵化,Weex有望成為中國移動領域的首個Apache頂級項目,這意味著中國移動技術開始反哺世界。據悉,這也是繼JStorm、RocketMQ之后,阿里向Apache捐贈的第三個項目。   2016年12月15日,阿里巴巴宣布將移動開源項目Weex捐贈給Apache基金會開始孵化 Weex是阿里自研的高性能跨平臺移...

          Charles連接安卓移動端操作

          首先打開Charles調試,如果關閉web端,如圖所示,前面什么也沒有 查看端口號 下載移動端的證書 打開模擬器進行調試(本人用的是夜神模擬器) 打開模擬器,設置-WLAN-你的連接設備-長摁-出現此頁面如下(點擊修改網絡) 按照你的ip和port進行填寫,之后保存 在瀏覽器窗口輸入,進行下載證書,(有的設備有可能不用下載,直接連接成功),連接成功的前提下還要讓你設置你的密碼 按照以上步驟進行,你...

          [python爬蟲] Selenium常見元素定位方法和操作的學習介紹

          [python爬蟲] Selenium常見元素定位方法和操作的學習介紹         這篇文章主要Selenium+Python自動測試或爬蟲中的常見定位方法、鼠標操作、鍵盤操作介紹,希望該篇基礎性文章對你有所幫助,如果有錯誤或不足之處,請海涵~同時CSDN總是屏蔽這篇文章,再加上最近只能專家和伯樂發表文章至首頁(why),這嚴重影響別人閱讀新人...

          筆記本 重啟 自動修失敗 C:WindowsSystem32LogfilesSrtSrtTrail.txt 的 若干解決方法

          類似于這個情況    電腦自己 自動重啟  然后就是這個界面   一直重啟  反復        首先說 出現這種問題的原因有很多  不一定能解決     下面是我自己總結的 一些解決方法  希望能到幫助到大家   &n...

          贊助商廣告

          相關文章

          熱門文章

          推薦文章

          相關標簽

          亚洲中文字幕A∨在线

          <noframes id="vddlx"><form id="vddlx"><nobr id="vddlx"></nobr></form>

            <noframes id="vddlx">
            <listing id="vddlx"><nobr id="vddlx"><meter id="vddlx"></meter></nobr></listing>
            <form id="vddlx"><th id="vddlx"><progress id="vddlx"></progress></th></form><em id="vddlx"></em>

              
              

              <listing id="vddlx"><listing id="vddlx"><menuitem id="vddlx"></menuitem></listing></listing>

                <span id="vddlx"></span>