一起學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有了一點初步的瞭解了~謝謝~