1. 程式人生 > >Netty 之 netty原始碼學習之大話java NIO

Netty 之 netty原始碼學習之大話java NIO

沉澱了一個月安安心心地學習了家純大神的Jupiter(https://github.com/fengjiachun/Jupiter),感覺受益良多,感覺自己學習了這裡面的精華的50%,不是謙虛,而是無知,因為我不知道著裡面還有多少是我沒有理解的,也許我看懂了他的程式碼,但我現在還不知道他那樣做的好處吧

廢話不多說,聽了大神的意見,開始慢慢看netty的原始碼,在學習netty原始碼之前,我們還是初步瞭解一下NIO

我也不想重複造輪子,而且我覺得我造的輪子並不比別人家的好,初識NIO,還是推薦去http://ifeve.com/java-nio-all/講的還是很不錯的~

看完之後,我想講一個故事,一起理解一下NIO和BIO之間的區別,還有NIO的selector這個元件的理解

阻塞IO就是客戶端傳送請求的時候,需要根據服務端的臉色來看,當服務端有執行緒空閒的時候才會勉強幫助處理這個請求,就很像我們在工作日請假去銀行辦理業務,如果銀行客服比較空閒的話,會立即給你處理, 如果此時所有的人都在排隊的話,不好意思,你啥也不能坐,坐著吧,看看手機,取號排隊吧。

蛋疼的是,假如所有的銀行客戶都在忙,且忙的業務都很大的話,比如排在你前面那個客服(執行緒)處理一個億的定期存款業務,各種複雜的流程,初步一算,前面一個業務操作沒有2個小時下不來,好吧,你接著等吧,等著飯點了,銀行可不管飯,不好意思,您下次請早,今天服務到此結束了,尼瑪,銀行拒絕處理,好了,今天排隊白搭了,更重要的事就是今天假白請了,工作量也在那阻塞了,完了,一切都完了

這就是阻塞,兩端都在阻塞,你在服務端的請求阻塞了,客戶端的工作量也阻塞了,這就是阻塞的悲劇

NIO就比較高大上了,故事繼續:

晚上加班到11點把白天阻塞的工作量加班幹完,到家11點半,洗洗澡,看看零點新聞,說銀行業務改革了,大大加快業務處理速度,頓時精神大振,明天去銀行接著辦理業務,第二天吃了一個煎餅,精神充足的去銀行了,發現銀行門口等的人很少,感覺有戲,準備去排隊,正準備去取排隊的序號,一個帥氣的黑衣人站在門口櫃檯的地方熱情地問:“這位帥哥,幹啥啊?”

屌絲客戶:“我來辦貸款!”

黑衣人:“那填下單子,貸多少錢,貸多長時間,收入流水賬單,收入證明,手機號碼,身份證影印件....”

屌絲客戶:“好....” 填寫中...

1分鐘後,寫好準備排隊...

黑衣人:“你幹啥,不用排隊,你把填寫的資料放在我的櫃檯上,我等下會幫助你放置在三號櫃檯的那個美女的案板上,而你可以去上班了,辦好了會給你打電話,去上班吧”

屌絲客戶:“好....(其實我還想看下那個漂亮的客服妹子呢)”

黑衣人貌似看出屌絲客戶的想法,說道:“哦,對了,負責你案子的就是那個三號櫃檯的那個美女,手機號碼是xxxxxxxxx!”

屌絲客戶就心滿意足地走了......

下午的時候就收到銀行的那個美女的電話了:“親,你的手續辦好了,資料已經郵件給你了,你可以查收具體的資訊了,如果還有其他的問題,就打這個號碼聯絡我,我還有其他的客戶問題要處理,如果問題,歡迎來電!”

好了,這個小故事講完了,我們來分析一下新的場景對應的NIO模型

角色對應:

客戶(N多客戶)這些客戶就是N多的SocketChannel,n多的客戶端請求------>SocketChannel

黑衣人------->selector

黑衣人所處的門口櫃檯-------->ServerSocketChannel (ServerSocketChannel.accept()這個方法相當於放置各種請求)

三號櫃檯的美女客戶就是服務端的執行緒,處理各種請求------------>Thread

美女客服的手機號碼儲存在屌絲客戶那邊(當然客戶手機號碼也在美女客戶那邊),那麼這個手機號碼就是客戶端的selector,當服務端處理好請求的時候,就會打電話通知你,屌絲客戶一看客服的號碼來電了,說明那邊處理好了---------美女手機號碼======客戶端的selector

恩,到此為此,NIO的模型基本上已經出來了,你會發現黑衣人的角色很重要,他就像一個接收者,用來負責各種到來的連結,他的職責很簡單,而不做任何實際操作

這樣做的好處就能體現NIO的牛的地方:兩邊都做到了解耦,沒有了強依賴,沒有了阻塞


從故事中回來,NIO就是這麼一個模型,selector就是現實世界的那個黑衣人,永遠都是接受請求,但不做任何處理,他就像一個事件驅動型別的dispatcher,與spring mvc的dispather不一樣,他不會主動去分發任務,如果你是服務端的thread需要不斷的掃描這個黑衣人桌上的檔案,這些"檔案"就是我們需要解決一個個IO請求

不知道大家有沒有對NIO有了一點初步的瞭解了~謝謝~

相關推薦

一起學Netty(十七)netty原始碼學習大話java NIO

沉澱了一個月安安心心地學習了家純大神的Jupiter(https://github.com/fengjiachun/Jupiter),感覺受益良多,感覺自己學習了這裡面的精華的50%,不是謙虛,而是無知,因為我不知道著裡面還有多少是我沒有理解的,也許我看懂了他的程式碼,但我

Netty netty原始碼學習大話java NIO

沉澱了一個月安安心心地學習了家純大神的Jupiter(https://github.com/fengjiachun/Jupiter),感覺受益良多,感覺自己學習了這裡面的精華的50%,不是謙虛,而是無知,因為我不知道著裡面還有多少是我沒有理解的,也許我看懂了他的程式碼,但

一起學Netty(十八)netty原始碼學習netty server端原始碼初讀(上)

server端是使用了Reactor模式對nio進行了一些封裝,Reactor模式網上有很多資料,不贅述,瞭解了這個模式開始看原始碼 netty的版本是4.0.21.Final <dependency> <groupId>io.netty<

Netty netty原始碼學習netty server端原始碼初讀(下)

上一篇簡單的分析了一下NioEventLoop,ServerBootstrap等元件的建立過程做的一些操作 現在我們一起看下當SingleThreadEventExecutor.java中的thread啟動後,netty做的一些最最重要的一些操作 我們接著昨天的程

Dubbo原始碼學習-通過原始碼看看dubbo對netty的使用

前言     前段時間,從頭開始將netty原始碼瞭解了個大概,但都是原理上理解。剛好博主對dubbo框架了解過一些,這次就以dubbo框架為例,詳細看看dubbo這種出色的開源框架是如何使用netty的,又是如何與框架本身邏輯進行融合的。     本文分成兩大部分,一

java集合HashMap原始碼學習

   |-- Node<K,V>[] table; // 存資料的結構 int threshold; |-- new HashMap<>() { // DEFAULT_LOAD_FACTOR = 0.75f

SpringMVC原始碼學習request處理流程 springMVC原始碼學習地址 springMVC原始碼學習addFlashAttribute原始碼分析 java reflect反射呼叫方法invoke

目的:為看原始碼提供呼叫地圖,最長呼叫邏輯深度為8層,反正我是springMVC原始碼學習地址看了兩週才理出來的。 1.處理流程(版本為4.3.18) 入口為spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.Dispatche

Java併發包原始碼學習執行緒池(一)ThreadPoolExecutor原始碼分析

Java中使用執行緒池技術一般都是使用Executors這個工廠類,它提供了非常簡單方法來建立各種型別的執行緒池: public static ExecutorService newFixedThreadPool(int nThreads) public static ExecutorService

Java併發包原始碼學習AQS框架(二)CLH lock queue和自旋鎖

上一篇文章提到AQS是基於CLH lock queue,那麼什麼是CLH lock queue,說複雜很複雜說簡單也簡單, 所謂大道至簡: CLH lock queue其實就是一個FIFO的佇列,佇列中的每個結點(執行緒)只要等待其前繼釋放鎖就可以了。 AbstractQueuedSynchronizer

Java併發包原始碼學習AQS框架(四)AbstractQueuedSynchronizer原始碼分析

經過前面幾篇文章的鋪墊,今天我們終於要看看AQS的廬山真面目了,建議第一次看AbstractQueuedSynchronizer 類原始碼的朋友可以先看下我前面幾篇文章: 分析原始碼是非常枯燥乏味的一件事,其實程式碼本身其實就是最好的說明了,因此基本都是貼出一些程式碼加上一些註釋, 因為Abstract

Java併發包原始碼學習AQS框架(一)概述

AQS其實就是java.util.concurrent.locks.AbstractQueuedSynchronizer這個類。 閱讀Java的併發包原始碼你會發現這個類是整個java.util.concurrent的核心之一,也可以說是閱讀整個併發包原始碼的一個突破口。 比如讀ReentrantLock的

tensorflow原始碼學習五 -- 同步訓練和非同步訓練

 同步和非同步訓練是由optimizer來決定的。         1. 同步訓練         同步訓練需要使用SyncReplicasOptimizer,參考https://www.tensorflow.org

spring原始碼學習路---IOC容器初始化要義bean定義載入(四)

上章說到要帶各位去看看bean定義載入的要義,其實就是loadBeanDefinitions這個方法的具體實現步驟,下面我們跟隨這個方法去看下它到底是如何載入bean定義的。 上面是我擷取的實現了loadBeanDefinitions的類級別截圖,loadBeanDefinit

spring原始碼學習路---深度分析IOC容器初始化過程(三)

分析FileSystemXmlApplicationContext的建構函式,到底都做了什麼,導致IOC容器初始化成功。 public FileSystemXmlApplicationContext(String[] configLocations, boolean ref

spring原始碼學習路---IOC實現原理(二)

上一章我們已經初步認識了BeanFactory和BeanDefinition,一個是IOC的核心工廠介面,一個是IOC的bean定義介面,上章提到說我們無法讓BeanFactory持有一個Map package org.springframework.beans.factory.supp

spring原始碼學習路---IOC初探(一)

首先把spring原始碼匯入,怎麼匯入百度下。 首先我們來說一下IOC,IOC是spring最核心的理念,包括AOP也要屈居第二,那麼IOC到底是什麼呢,四個字,控制反轉。 網上有不少是這麼解釋IOC的,說IOC是將物件的建立和依賴關係交給容器,這句話我相信不少人都知道,在我個人的理解

springMVC原始碼學習addFlashAttribute原始碼分析

本文主要從falshMap初始化,存,取,消毀來進行原始碼分析,springmvc版本4.3.18。關於使用及驗證請參考另一篇https://www.cnblogs.com/pu20065226/p/10032048.html 1.初始化和呼叫,首先是入springMVC 入口webmvc包中org.spr

go 原始碼學習---Tail 原始碼分析

已經有兩個月沒有寫部落格了,也有好幾個月沒有看go相關的內容了,由於工作原因最近在做java以及大資料相關的內容,導致最近工作較忙,部落格停止了更新,正好想撿起之前go的東西,所以找了一個原始碼學習 這個也是之前用go寫日誌收集的時候用到的一個包 :github.com/hpcloud/tail, 這次就學

ORBSLAM2原始碼學習1-argv and argc

針對與slam 讀取資料時的函式時argc[ ] LoadImages(string(argv[3]), vstrImageFilenames, vTimestamps) 例項解釋: #include <iostream> using namespace

vue的原始碼學習三——原始碼構建

                                 原始碼構建