最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

從零帶你寫netty

2023-03-11 23:05 作者:陳清風(fēng)揚(yáng)  | 我要投稿

????提到netty,我們總會(huì)說它是Java語言中網(wǎng)絡(luò)編程的首選框架?為什么?因?yàn)樗阅芴吡?。這也是很多人熱衷學(xué)習(xí)它的原因。也許點(diǎn)進(jìn)這篇文章的你,就懷著這樣的目的。但是,請(qǐng)你認(rèn)真審視一下自己的內(nèi)心,你是為了補(bǔ)充技能盞而盲目學(xué)習(xí),還是真的知道自己為什么學(xué)習(xí)netty,或者僅僅是因?yàn)榕d趣而學(xué)習(xí)?如果你真的知道自己為什么學(xué)習(xí)netty,那么,你肯定也就清楚,你希望從netty中學(xué)到什么,學(xué)到什么程度,最后把學(xué)到的東西用到哪里。如果你對(duì)這三點(diǎn)感到茫然,不如先聽聽我當(dāng)年為什么學(xué)習(xí)netty。

????我當(dāng)初工作了一年的時(shí)候,也接觸了一些業(yè)務(wù),代碼水平,也不值一提,但是我有一顆求知的心,總想利用業(yè)余時(shí)間找點(diǎn)東西學(xué)一下。恰好,那時(shí)我總是聽到一個(gè)詞:遠(yuǎn)程調(diào)用。我不知道大家第一次接觸這個(gè)概念的時(shí)候是怎么理解的,但我相信在分布式大行其道的今天,大家應(yīng)該都明白遠(yuǎn)程調(diào)用的意思,所以我就不嗦啰解釋了。在我看來,如果把遠(yuǎn)程調(diào)用的定義設(shè)定得寬泛一點(diǎn),http請(qǐng)求也可以稱得上遠(yuǎn)程調(diào)用,redis的客戶端發(fā)送一條get指令給服務(wù)端,也可以稱得上遠(yuǎn)程調(diào)用。甚至我可以說,只要有客戶端和服務(wù)端,就會(huì)有遠(yuǎn)程調(diào)用。所以我就一直想,為什么我不自定義協(xié)議,也寫一個(gè)遠(yuǎn)程調(diào)用框架呢?也就是我們俗稱的Rpc框架。

????當(dāng)然,這只是引起我興趣的一個(gè)契機(jī),讓我們回到網(wǎng)絡(luò)編程,各位,我理解的網(wǎng)絡(luò)編程實(shí)際上就是為網(wǎng)絡(luò)通信服務(wù)的,我們所做的一切就是為了讓客戶端發(fā)送一條消息,然后順利到達(dá)服務(wù)端,或者是服務(wù)端發(fā)送一條消息,順利達(dá)到客戶端。我們熟知的各種軟件不就是這么工作嗎?MySQL不就是這樣嗎?Redis也是如此,我們熟悉的各種中間件,哪一個(gè)離得開網(wǎng)絡(luò)通信呢?

????比如說,我學(xué)過了Redis,現(xiàn)在我想自己手寫一個(gè)Redis,要寫客戶端和服務(wù)端,要完善哨兵模式,我不可能離得開網(wǎng)絡(luò)編程;如果我要手寫一個(gè)消息隊(duì)列中間件,或者手寫一個(gè)全鏈路監(jiān)控框架,或者是一個(gè)分布式定時(shí)任務(wù)框架,或者類似于Nacos的動(dòng)態(tài)配置中心,我就必須要熟練掌握網(wǎng)絡(luò)編程,實(shí)現(xiàn)網(wǎng)絡(luò)通信。眾所周知,學(xué)習(xí)一個(gè)框架有很多種方式,但是哪種方式都比不過自己仿照源碼手寫一個(gè)新的框架。這不是重復(fù)造輪子,造輪子還是交給大廠去吧,這只是我們學(xué)習(xí)的一種最優(yōu)手段。所以,我為了能夠以上面列舉的這些框架為模版而創(chuàng)造輪子,我在掌握J(rèn)ava網(wǎng)絡(luò)編程的基礎(chǔ)上,學(xué)會(huì)了如何使用netty,又在此基礎(chǔ)上,深入學(xué)習(xí)了netty的源碼和架構(gòu)。這時(shí)候,我也擁有了創(chuàng)造這些輪子的最基本的能力。當(dāng)然,這也就意味著我要學(xué)習(xí)的東西還有很多。

????現(xiàn)在,請(qǐng)各位再次問問自己,究竟為什么要學(xué)netty?

????我可以再談?wù)勛约涸趯W(xué)習(xí)netty的過程中掌握了哪些知識(shí),首先,我得承認(rèn),雖然netty用到了多線程編程,但是它并沒有使用多么豐富的多線程編程手段,它的核心部分也只是用到了線程池和Promise,其實(shí)Promise是Java中Future的一種更靈活的實(shí)現(xiàn),算不上新東西。但是我可以說,通過學(xué)習(xí)netty,我個(gè)人對(duì)并發(fā)編程思想的理解和掌握,達(dá)到了一個(gè)新的層次;其次就是一些常用的設(shè)計(jì)模式,讓我領(lǐng)悟得更深,也在之后的編程生涯中用到了很多次;還有對(duì)象池,堆內(nèi)存和堆外內(nèi)存的利用,我把這些稱為優(yōu)化的技術(shù)。最后,也是最重要的,通過反復(fù)研究netty的源碼,琢磨其中各種接口和類的關(guān)系結(jié)構(gòu),我發(fā)現(xiàn)我對(duì)編寫框架,也就是造輪子,有了更深的領(lǐng)悟。

????比如,在我后來自己造輪子時(shí)——當(dāng)然也是為了更深入地學(xué)習(xí)某個(gè)框架——編寫到某個(gè)地方,很自然地我就明白,應(yīng)該引入接口了,或者這里應(yīng)該弄成抽象類,哪些方法應(yīng)該定義成抽象的,漸漸成為了一種習(xí)慣。后來我學(xué)習(xí)一些邏輯復(fù)雜的源碼,比如Spring,多看幾遍,我也可以看明白其中類和接口的關(guān)系結(jié)構(gòu),為什么這個(gè)方法要在這個(gè)類中,為什么這個(gè)類要實(shí)現(xiàn)好幾個(gè)接口。簡而言之,我對(duì)編寫框架的思想也有新的感悟。說到底,高內(nèi)聚,低耦合,適用于你編寫的任何代碼和框架。這里我多說一句,從我個(gè)人來說,netty的源碼比Spring的源碼簡單一些,但同時(shí)又精妙一些。

????說了這么多,那么netty難學(xué)嗎?還是我個(gè)人的感受,我認(rèn)為不難,只要你有網(wǎng)絡(luò)編程和并發(fā)編程的知識(shí),知道什么是bio和nio,就可以學(xué)習(xí)。我知道有些技術(shù)博主或者培訓(xùn)機(jī)構(gòu)也在吹捧netty,甚至吹捧到神乎其神的地步。依我看,根本沒必要這么做,netty只是一個(gè)性能優(yōu)秀的框架,源碼確實(shí)很精妙,但是再精妙,也不會(huì)增加它的學(xué)習(xí)難度,只會(huì)讓你學(xué)起來感覺更有趣。總而言之,netty的核心就四個(gè)字:異步,回調(diào)。

????如果你知道自己為什么學(xué)習(xí)netty,想學(xué)到什么程度,今后怎么運(yùn)用,那就跟著我的課程學(xué)習(xí)吧。別的我不敢保證,但是我從netty中受益多少,我會(huì)毫無保留地展現(xiàn)給大家。

????好了,下面來談?wù)勎沂窃趺匆?guī)劃這門課程的吧,整個(gè)課程目前分為25節(jié),可能還會(huì)加餐。下面是該課程的目錄。我采用的是漸進(jìn)式教學(xué),既然是手寫netty,當(dāng)然就不會(huì)直接去講框架的源碼,如果是那種照本宣科的教學(xué)方式,我相信市面上已經(jīng)有很多了。沒有新意,而且效率也不是很高。當(dāng)然,我們自己手寫的netty,不論是接口和類的名稱還是關(guān)系結(jié)構(gòu),還是各個(gè)方法的名稱和邏輯,最后都會(huì)和源碼一摸一樣,但是整個(gè)過程的變化,結(jié)構(gòu)的演進(jìn),我們都一清二楚,最后循序漸進(jìn),由淺入深地掌握這個(gè)框架。

????課程配備的代碼,目前已經(jīng)迭代到了第十版本,對(duì)應(yīng)我們課程的第十六節(jié)。后面應(yīng)該還會(huì)繼續(xù)迭代八個(gè)版本。每一個(gè)版本,你都會(huì)看到新的變化。而且所有關(guān)鍵代碼都加了注釋,保證大家不會(huì)困惑。再回過頭說說我們的課程,雖然寫了這么多版本的代碼,但是在講課的時(shí)候,我也不會(huì)照著手寫的代碼或者框架源碼,干巴巴地講解代碼邏輯,那樣還不如直接把代碼發(fā)給大家去看。我喜歡的風(fēng)格是列舉例子,提出問題,然后引導(dǎo)思考的方向,然后是下一個(gè)問題,環(huán)環(huán)相扣,最后講清楚內(nèi)容。我不會(huì)直接教你就這么寫,而是想教給你為什么要這么寫,簡而言之,我想把我領(lǐng)悟的編程思想展示給大家。我相信我沒有夸大這種講課模式的益處,如果我沒能做到我說的這樣,請(qǐng)大家及時(shí)給我留言。

代碼具體版本可點(diǎn)擊鏈接觀看:代碼迭代詳情

????好了,這時(shí)候,我想談?wù)勎覟槭裁匆獙戇@門課,首先,我的目的是掙點(diǎn)錢,這一點(diǎn)無法回避。我本人已經(jīng)工作六年,呆過的地方都是小公司,沒進(jìn)過大廠,這是事實(shí)。除了Java,還學(xué)過C和C++,雖然也存了點(diǎn)錢,但是也花了不少錢,馬上就要有小孩了,未來還要花更多的錢,所以才想用自己掌握的一點(diǎn)知識(shí)換點(diǎn)錢。你們也許會(huì)好奇既然我打算販賣這門課,之前一定也寫過不少技術(shù)文章,不然你怎么能讓陌生的讀者一上來就信服你擁有過人的技術(shù)呢?這時(shí)候我確實(shí)得解釋一句,我個(gè)人之前確實(shí)沒寫過什么技術(shù)文章,倒不是我一點(diǎn)技術(shù)也不會(huì),而是我覺得各種平臺(tái)上有很多技術(shù)文章,我要講的東西有人已經(jīng)講得很好了,因?yàn)槲乙渤T诟鞣N平臺(tái)上看別人發(fā)表的文章,學(xué)習(xí)知識(shí)。就像這次準(zhǔn)備netty課程,我也觀摩學(xué)習(xí)了一下別的技術(shù)博主的講解流程。如果我做一件事,我希望最好能讓這件事體現(xiàn)出我自己獨(dú)有的價(jià)值。雖然我和大家一樣都是普通人。

????還有一個(gè)最重要的原因,我之所以沒怎么寫過技術(shù)文章,是因?yàn)槲覜]精力。因?yàn)榫驮趦赡昵埃倚闹械奈膶W(xué)夢還沒有熄滅,那時(shí)候還幻想自己寫的文學(xué)小說能夠出版,一有時(shí)間就寫小說,把時(shí)間都留給文學(xué)小說了。最后確實(shí)寫完了兩部文學(xué)作品,一本四十萬字,一本十萬字,當(dāng)然也沒能出版成功,都分給身邊的朋友看了,文學(xué)夢也就此擱淺,也許以后還會(huì)有機(jī)會(huì)重新起航。近幾年,我最喜歡的作家是石黑一雄,所以,我也希望自己能寫出它那樣情感沖擊強(qiáng)烈的文學(xué)小說。

????如果大家懷疑我的能力,我在文章的最后貼出了三節(jié)課作為試讀,如果大家有興趣,可以大概瀏覽一遍。最后,再說說這門課的定價(jià),定價(jià)為100,雖然每節(jié)課我講述的內(nèi)容很多,但也確實(shí)很貴,就算一本市面上的實(shí)體書也沒這么貴。但是這個(gè)定價(jià)是一次性買斷的,這也就意味著我們的語雀小冊(cè)以后會(huì)一直更新。手寫netty的項(xiàng)目更新完了,我會(huì)繼續(xù)更新其他的新項(xiàng)目,比如仍然是仿照別的框架手寫鏈路監(jiān)控系統(tǒng);或者是動(dòng)態(tài)配置中心;或者是一個(gè)小巧的Redis;或者是用netty寫一個(gè)游戲的服務(wù)器。甚至我可以用我的方法教大家C和C++,然后講一些編譯器的知識(shí)。以后我推銷自己課程,也會(huì)以新的科目來推銷,但是只要購買了冊(cè)子的人,都可以學(xué)習(xí)有所有課程。

????當(dāng)然,我說我可能會(huì)搞這些東西,并不是我對(duì)這些東西全都精通,我自己也只是明白它們的運(yùn)行原理,然后抽時(shí)間去學(xué)了學(xué)。因?yàn)槲乙恢庇X得我在這行不會(huì)干太久,遲早有一天我會(huì)脫掉程序員的身份,變成文學(xué)作家,所以我不會(huì)強(qiáng)迫自己太深入地學(xué)習(xí)一些知識(shí),如果有些知識(shí)我學(xué)得時(shí)間長,稍微有些深度,那也是感興趣才去學(xué)的。我研究生是在香港的城市大學(xué)讀的,是比不過大陸的一些學(xué)校,所以畢業(yè)之后直接在香港找工作,直到去年結(jié)婚才回大陸。疫情那兩年,香港的公司一直居家辦公,基本上每天五點(diǎn)就可以結(jié)束工作,所以我有很多可以自由支配的時(shí)間去鉆研知識(shí),寫自己的小說。對(duì)了,我還要再說一句,我們現(xiàn)在的手寫netty項(xiàng)目也沒有更新完,代碼已經(jīng)迭代到第16節(jié)課了,文章馬上就要更新第4和第5節(jié)課,今后會(huì)維持五天一節(jié)課的更新頻率。

????也許你是個(gè)經(jīng)驗(yàn)豐富的老程序員,對(duì)Spring,Mybatis等框架的源碼爛熟于心,學(xué)netty只是想在工作之余快速學(xué)點(diǎn)東西,如果是這樣的話,瀏覽我寫的課程時(shí),有不正確的地方請(qǐng)耐心地留言指出,我一定虛心接受和學(xué)習(xí);如果你是個(gè)工作經(jīng)驗(yàn)剛滿一年,不滿足于整日CRUD,想學(xué)點(diǎn)有技術(shù)含量的知識(shí),提高閱讀源碼和編程的能力,那么在閱讀課程的時(shí)候,有不明白的地方也請(qǐng)及時(shí)給我留言,我一定幫你解惑。因?yàn)槲覍戇@門課的初衷,就是想教給那些只有網(wǎng)絡(luò)編程基礎(chǔ),明白什么是bio和nio,同時(shí)也掌握了并發(fā)編程的人從零寫一個(gè)netty。也許有的人會(huì)質(zhì)疑,連netty都沒用過,怎么能學(xué)會(huì)寫呢?這時(shí)候我就要反問一句了,netty的作者在沒寫出netty之前是怎么學(xué)會(huì)netty的呢?

????下面給出的四個(gè)鏈接,前三個(gè)是課程的試讀部分,也就是我們的前三節(jié)課。如果大家覺得我講得不錯(cuò),可以點(diǎn)擊最下面的鏈接進(jìn)行購買。感謝大家。

課程有三節(jié)試讀章節(jié)和兩節(jié)試看課程,試看鏈接:試看課程的入口

從該入口的視頻簡介中的鏈接可以得到課程的前三節(jié)試讀章節(jié),還可以獲得加群方式。

從零帶你寫netty的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
诸暨市| 池州市| 西城区| 昭通市| 富锦市| 黄浦区| 五原县| 浪卡子县| 晋城| 攀枝花市| 安新县| 蒙山县| 武宁县| 黄骅市| 香格里拉县| 衡南县| 准格尔旗| 云安县| 镇赉县| 兴义市| 南郑县| 安岳县| 郴州市| 融水| 喜德县| 江陵县| 台东市| 平度市| 阿克陶县| 瑞金市| 日土县| 武冈市| 新乡县| 砚山县| 长垣县| 汉寿县| 高陵县| 通许县| 昌宁县| 林州市| 定安县|