2021 最新的Java 后端學(xué)習(xí)路線!凎!
斷斷續(xù)續(xù)寫(xiě)了大半個(gè)月,終于把 2021 最新版的 Java 后端學(xué)習(xí)路線給整完了!
這篇文章可能是你看過(guò)最用心、最全面的 Java 后端學(xué)習(xí)路線。
為了完成這份學(xué)習(xí)路線,最近熬了很多次夜,因?yàn)楝嵥榈氖虑樘啵茈y有一塊比較完整的時(shí)間專(zhuān)門(mén)用來(lái)做這件事。
其實(shí),說(shuō)這個(gè)并不是為了讓大家同情我。相反,我覺(jué)得我在熬夜肝學(xué)習(xí)路線的時(shí)候是快樂(lè)的,因?yàn)檫@是我喜歡做的事情。

這篇文章不會(huì)涉及到學(xué)習(xí)方法以及學(xué)習(xí)網(wǎng)站的推薦,我不想讓篇幅太長(zhǎng),內(nèi)容太雜,我希望留著下一篇文章專(zhuān)門(mén)來(lái)談一談。
另外,這篇文章也不會(huì)涉及到計(jì)算機(jī)基礎(chǔ),也是為了保證內(nèi)容的不至于太雜。計(jì)算基礎(chǔ)相關(guān)的內(nèi)容我也已經(jīng)寫(xiě)好,預(yù)計(jì)會(huì)在五一同步給小伙伴們。

多說(shuō)一句,對(duì)于編程初學(xué)者,我不太建議上來(lái)通過(guò)做項(xiàng)目學(xué)習(xí)。實(shí)踐確實(shí)很重要,如果你沒(méi)有編程基礎(chǔ)的話,直接上手實(shí)戰(zhàn),很容易最后學(xué)個(gè)四不像。
建議你在學(xué)習(xí)編程的初期盡量多看一些優(yōu)質(zhì)視頻。跟著視頻一步一步走,可以讓你少踩很多坑,學(xué)習(xí)編程的信心也會(huì)增加。
概覽:

Java 基礎(chǔ)
如果你之前沒(méi)有學(xué)習(xí)過(guò)編程的話,我建議你可以看看視頻教程。
像尚硅谷的 《 Java 基礎(chǔ)教程系列》[2]和韓順平老師的《零基礎(chǔ) 30 天學(xué)會(huì) Java》[3]就很不錯(cuò)。

學(xué)習(xí)過(guò) Java 的朋友,大部分應(yīng)該都看過(guò)韓老師的課程吧!韓老師畢業(yè)于清華大學(xué),錄制的視頻課程質(zhì)量都非常高。內(nèi)容易懂,并且不失嚴(yán)謹(jǐn)。
韓老師的《零基礎(chǔ) 30 天學(xué)會(huì) Java》[4]系列不光會(huì)教你 Java 基礎(chǔ),還會(huì)幫你建立編程思想,讓你知道學(xué)習(xí)了 Java 之后,你可以從事什么工作。
看視頻的同時(shí),配套一本好書(shū)也是非常有作用的。
《Head First Java》[5] 這本書(shū)在是入門(mén) Java 的很不錯(cuò)的書(shū)籍 。

《Head First Java》這本書(shū)的內(nèi)容很輕松有趣,可以說(shuō)是我學(xué)習(xí)編程初期最喜歡的幾本書(shū)之一了。同時(shí),這本書(shū)也是我的 Java 啟蒙書(shū)籍。我在學(xué)習(xí) Java 的初期多虧了這本書(shū)的幫助,自己才算是跨進(jìn) Java 語(yǔ)言的大門(mén)。
我覺(jué)得我在 Java 這塊能夠堅(jiān)持下來(lái),這本書(shū)有很大的功勞。我身邊的的很多朋友學(xué)習(xí) Java 初期都是看的這本書(shū)。
有很多小伙伴就會(huì)問(wèn)了:這本書(shū)適不適合編程新手閱讀呢?
我個(gè)人覺(jué)得這本書(shū)還是挺適合編程新手閱讀的,畢竟是 “Head First” 系列。

《Java 核心技術(shù)卷 1+卷 2》[6] 這兩本書(shū)也非常不錯(cuò)。不過(guò),這兩本書(shū)的內(nèi)容很多,全看的話比較費(fèi)時(shí)間。我現(xiàn)在是把這兩本書(shū)當(dāng)做工具書(shū)來(lái)用,就比如我平時(shí)寫(xiě)文章的時(shí)候,碰到一些 Java 基礎(chǔ)方面的問(wèn)題,經(jīng)常就翻看這兩本來(lái)當(dāng)做參考!
我當(dāng)時(shí)在大學(xué)的時(shí)候就買(mǎi)了兩本放在寢室,沒(méi)事的時(shí)候就翻翻。建議有點(diǎn) Java 基礎(chǔ)之后再讀,介紹的還是比較深入和全面的,非常推薦。

《Java 編程思想 》[7] 這本書(shū)被很多人稱(chēng)之為 Java 領(lǐng)域的圣經(jīng)(感覺(jué)有點(diǎn)過(guò)了~~~)。不太推薦編程初學(xué)者閱讀,有點(diǎn)勸退的味道,稍微有點(diǎn)基礎(chǔ)后閱讀更好。
我第一次看的時(shí)候還覺(jué)得有點(diǎn)枯燥,那時(shí)候還在上大二,看了 1/3 就沒(méi)看下去了。

另外,Java 8 算是一個(gè)里程碑式的版本,現(xiàn)在一般企業(yè)還是用 Java 8 比較多。掌握 Java 8 的一些新特性比如 Lambda、Strean API 還是挺有必要的。這塊的話,我推薦 《Java 8 實(shí)戰(zhàn)》[8] 這本書(shū)。
學(xué)完 Java 基礎(chǔ)之后,你可以用自己學(xué)的東西實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 Java 程序,也可以嘗試用 Java 解決一些編程問(wèn)題,以此來(lái)將自己學(xué)到的東西付諸于實(shí)踐。
不太建議學(xué)習(xí) Java 基礎(chǔ)的之后通過(guò)做游戲來(lái)鞏固。為什么培訓(xùn)班喜歡通過(guò)這種方式呢?說(shuō)白點(diǎn)就是為了找到你的 G 點(diǎn)。新手學(xué)習(xí)完 Java 基礎(chǔ)后做游戲一般是不太現(xiàn)實(shí)的,還不如找一些簡(jiǎn)單的程序問(wèn)題解決一下比如簡(jiǎn)單的算法題。
記得多總結(jié)!打好基礎(chǔ)!把自己重要的東西都記錄下來(lái)。API 文檔放在自己可以看到的地方,以備自己可以隨時(shí)查閱。為了能讓自己寫(xiě)出更優(yōu)秀的代碼,《Effective Java》、《重構(gòu)》 這兩本書(shū)沒(méi)事也可以看
并發(fā)
多線程這部分內(nèi)容稍微會(huì)比較難以理解和實(shí)踐。如果你剛學(xué)完 Java 基礎(chǔ)的話,我建議你學(xué)習(xí)并發(fā)這部分內(nèi)容的時(shí)候,可以先簡(jiǎn)單地了解一下基礎(chǔ)知識(shí)比如線程和進(jìn)程的對(duì)比。到了后面,你對(duì)于 Java 了解的更深了之后,再回來(lái)仔細(xì)看看這部分的內(nèi)容。
下面是一些我比較推薦的書(shū)籍。
《Java 并發(fā)編程之美》[9]

這本書(shū)還是非常適合我們用來(lái)學(xué)習(xí) Java 多線程的。這本書(shū)的講解非常通俗易懂,作者從并發(fā)編程基礎(chǔ)到實(shí)戰(zhàn)都是信手拈來(lái)。
另外,這本書(shū)的作者加多自身也會(huì)經(jīng)常在網(wǎng)上發(fā)布各種技術(shù)文章。這本書(shū)也是加多大佬這么多年在多線程領(lǐng)域的沉淀所得的結(jié)果吧!他書(shū)中的內(nèi)容基本都是結(jié)合代碼講解,非常有說(shuō)服力!
《實(shí)戰(zhàn) Java 高并發(fā)程序設(shè)計(jì)》[10]

這個(gè)是我第二本要推薦的書(shū)籍,比較適合作為多線程入門(mén)/進(jìn)階書(shū)籍來(lái)看。這本書(shū)內(nèi)容同樣是理論結(jié)合實(shí)戰(zhàn),對(duì)于每個(gè)知識(shí)點(diǎn)的講解也比較通俗易懂,整體結(jié)構(gòu)也比較清。
《深入淺出 Java 多線程》[11]

這本書(shū)是幾位大廠的大佬開(kāi)源的。
這幾位作者為了寫(xiě)好《深入淺出 Java 多線程》這本書(shū)閱讀了大量的 Java 多線程方面的書(shū)籍和博客,然后再加上他們的經(jīng)驗(yàn)總結(jié)、Demo 實(shí)例、源碼解析,最終才形成了這本書(shū)。
這本書(shū)的質(zhì)量也是非常過(guò)硬!給作者們點(diǎn)個(gè)贊!這本書(shū)有統(tǒng)一的排版規(guī)則和語(yǔ)言風(fēng)格、清晰的表達(dá)方式和邏輯。并且每篇文章初稿寫(xiě)完后,作者們就會(huì)互相審校,合并到主分支時(shí)所有成員會(huì)再次審校,最后再通篇修訂了三遍。
《Java 并發(fā)實(shí)現(xiàn)原理:JDK 源碼剖析》[12]

這本書(shū)是去年也就是 2020 年新出的,所以,現(xiàn)在知道的人還不是很多。
這本書(shū)主要是對(duì) Java Concurrent 包中一些比較重要的源碼進(jìn)行了講解,另外,像 JMM、happen-before、CAS 等等比較重要的并發(fā)知識(shí)這本書(shū)也都會(huì)一并介紹到。
不論是你想要深入研究 Java 并發(fā),還是說(shuō)要準(zhǔn)備面試,你都可以看看這本書(shū)。
下面是我總結(jié)的一些關(guān)于并發(fā)的小問(wèn)題,你可以拿來(lái)自測(cè):
什么是線程和進(jìn)程? 線程與進(jìn)程的關(guān)系,區(qū)別及優(yōu)缺點(diǎn)? 說(shuō)說(shuō)并發(fā)與并行的區(qū)別? 為什么要使用多線程呢? 使用多線程可能帶來(lái)什么問(wèn)題?(內(nèi)存泄漏、死鎖、線程不安全等等) 創(chuàng)建線程有哪幾種方式?(a.繼承 Thread 類(lèi);b.實(shí)現(xiàn) Runnable 接口;c. 使用 Executor 框架;d.使用 FutureTask) 說(shuō)說(shuō)線程的生命周期和狀態(tài)? 什么是上下文切換? 什么是線程死鎖?如何避免死鎖? 說(shuō)說(shuō) sleep()方法和wait()方法區(qū)別和共同點(diǎn)?Java 內(nèi)存模型(JMM)、重排序與 happens-before 原則了解嗎? synchronized關(guān)鍵字、volatile 關(guān)鍵字ThreadLocal有啥用(解決了什么問(wèn)題)?怎么用?原理了解嗎??jī)?nèi)存泄露問(wèn)題了解嗎?為什么要用線程池? ThreadPoolExecutor類(lèi)的重要參數(shù)了解嗎?ThreadPoolExecutor飽和策略了解嗎?線程池原理了解嗎?幾種常見(jiàn)的線程池了解嗎?為什么不推薦使用FixedThreadPool?如何設(shè)置線程池的大小?AQS 了解么?原理?AQS 常用組件: Semaphore(信號(hào)量)、CountDownLatch(倒計(jì)時(shí)器)CyclicBarrier(循環(huán)柵欄)ReentrantLock、ReentrantReadWriteLock、StampedLock(JDK8)CAS 了解么?原理? Atomic 原子類(lèi) 并發(fā)容器: ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueueBlockingQueue、ConcurrentSkipListMapFuture和CompletableFuture......
JVM
對(duì)于 Java 程序員來(lái)說(shuō),JVM 幫助我們做了很多事情比如內(nèi)存管理、垃圾回收等等。在 JVM 的幫助下,我們的程序出現(xiàn)內(nèi)存泄漏這些問(wèn)題的概率相對(duì)來(lái)說(shuō)是比較低的。但是,這并不代表我們?cè)谌粘i_(kāi)發(fā)工作中不會(huì)遇到。萬(wàn)一你在工作中遇到了 OOM 問(wèn)題,你至少要知道如何去排查和解決問(wèn)題吧!
并且,就單純從面試角度來(lái)說(shuō),JVM 是 Java 后端面試(大廠)中非常重要的一環(huán)。不論是應(yīng)屆還是社招,面試國(guó)內(nèi)的一些大廠,你都會(huì)被問(wèn)到很多 JVM 相關(guān)的問(wèn)題(應(yīng)屆的話側(cè)重理論,社招實(shí)踐)。
只有搞懂了 JVM 才有可能真正把 Java 語(yǔ)言“吃透”。學(xué)習(xí) JVM 這部分的內(nèi)容,一定要注意要實(shí)戰(zhàn)和理論結(jié)合。
書(shū)籍的話,《深入理解 Java 虛擬機(jī)》[13] 這本書(shū)是首先要推薦的。

這本書(shū)就一句話形容:國(guó)產(chǎn)書(shū)籍中的戰(zhàn)斗機(jī),實(shí)實(shí)在在的優(yōu)秀! (真心希望國(guó)內(nèi)能有更多這樣的優(yōu)質(zhì)書(shū)籍出現(xiàn)!加油!??)
這本書(shū)的第三版去年年底已經(jīng)出來(lái)了,新增了很多實(shí)在的內(nèi)容比如 ZGC 等新一代 GC 的原理剖析。目前豆瓣上是 9.6 的高分,?? 不 ?? 我就不多說(shuō)了!
不論是你面試還是你想要在 Java 領(lǐng)域?qū)W習(xí)的更深,你都離不開(kāi)這本書(shū)籍。這本書(shū)不光要看,你還要多看幾遍,里面都是干貨。這本書(shū)里面還有一些需要自己實(shí)踐的東西,我建議你也跟著實(shí)踐一下。
類(lèi)似的書(shū)籍還有 《實(shí)戰(zhàn) Java 虛擬機(jī)》[14]、《虛擬機(jī)設(shè)計(jì)與實(shí)現(xiàn):以 JVM 為例》[15] ,這兩本都是非常不錯(cuò)的!

如果你對(duì)實(shí)戰(zhàn)比較感興趣,想要自己動(dòng)手寫(xiě)一個(gè)簡(jiǎn)易的 JVM 的話,可以看看 《自己動(dòng)手寫(xiě) Java 虛擬機(jī)》[16] 這本書(shū)。

書(shū)中的代碼是基于 Go 語(yǔ)言實(shí)現(xiàn)的,搞懂了原理之后,你可以使用 Java 語(yǔ)言模仿著寫(xiě)一個(gè),也算是練練手!如果你當(dāng)前沒(méi)有能力獨(dú)立使用 Java 語(yǔ)言模仿著寫(xiě)一個(gè)的話,你也可以在網(wǎng)上找到很多基于 Java 語(yǔ)言版本的實(shí)現(xiàn),比如《zachaxy 的手寫(xiě) JVM 系列》[17] 。
這本書(shū)目前在豆瓣有 8.2 的評(píng)分,我個(gè)人覺(jué)得張秀宏老師寫(xiě)的挺好的,這本書(shū)值得更高的評(píng)分。
另外,R 大在豆瓣發(fā)的《從表到里學(xué)習(xí) JVM 實(shí)現(xiàn)》[18]這篇文章中也推薦了很多不錯(cuò)的 JVM 相關(guān)的書(shū)籍,推薦小伙伴們?nèi)タ纯础?/p>
再推薦兩個(gè)視頻給喜歡看視頻學(xué)習(xí)的小伙伴。
第 1 個(gè)是尚硅谷的宋紅康老師講的《JVM 全套教程》[19]。這個(gè)課程的內(nèi)容非常硬,一共有接近 400 小節(jié)。
課程的內(nèi)容分為 3 部分:
《內(nèi)存與垃圾回收篇》 《字節(jié)碼與類(lèi)的加載篇》 《性能監(jiān)控與調(diào)優(yōu)篇》

第 2 個(gè)是你假笨大佬的 《JVM 參數(shù)【Memory 篇】》[20] 教程,很厲害了!

下面是我總結(jié)的一些關(guān)于 JVM 的小問(wèn)題,你可以拿來(lái)自測(cè):
什么是虛擬機(jī)? Java 內(nèi)存區(qū)域是怎么劃分的?大對(duì)象放在哪個(gè)內(nèi)存區(qū)域? 垃圾回收有哪些算法?GC 的流程 什么是類(lèi)加載?何時(shí)類(lèi)加載?類(lèi)加載流程? 知道哪些類(lèi)加載器。類(lèi)加載器之間的關(guān)系? 類(lèi)加載器的雙親委派了解么?結(jié)合 Tomcat 說(shuō)一下雙親委派(Tomcat 如何打破雙親委托機(jī)制?...)。 常見(jiàn)調(diào)優(yōu)參數(shù)有哪些? ......
數(shù)據(jù)庫(kù)
我們網(wǎng)站或 者 APP 的數(shù)據(jù)都是需要使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù)的。
MySQL
一般企業(yè)項(xiàng)目開(kāi)發(fā)中,使用 MySQL 比較多。如果你要學(xué)習(xí) MySQL 的話,可以看下面這 3 本書(shū)籍:
《MySQL 必知必會(huì)》[21] :非常薄!非常適合 MySQL 新手閱讀,很棒的入門(mén)教材。 《高性能 MySQL》[22] :MySQL 領(lǐng)域的經(jīng)典之作!學(xué)習(xí) MySQL 必看!屬于進(jìn)階內(nèi)容,主要教你如何更好地使用 MySQL 。既有有理論,又有實(shí)踐!如果你沒(méi)時(shí)間都看一遍的話,拿我建議第 5 章(創(chuàng)建高性能的索引) 、第 6 章(查詢(xún)性能優(yōu)化) 你你一定要認(rèn)真看一下。 《MySQL 技術(shù)內(nèi)幕》[23] :你想深入了解 MySQL 存儲(chǔ)引擎的話,看這本書(shū)準(zhǔn)沒(méi)錯(cuò)!

視頻的話,你可以看看動(dòng)力節(jié)點(diǎn)的 《MySQL 數(shù)據(jù)庫(kù)教程視頻》[24]。這個(gè)視頻基本上把 MySQL 的相關(guān)一些入門(mén)知識(shí)給介紹完了。
學(xué)習(xí)了 MySQL 之后,務(wù)必確保自己掌握下面這些知識(shí)點(diǎn):
MySQL 常用命令 :
安全:登錄、增加/刪除用戶、備份數(shù)據(jù)和還原數(shù)據(jù) 數(shù)據(jù)庫(kù)操作:建庫(kù)建表/刪庫(kù)刪表、用戶權(quán)限分配 ...... MySQL 中常用的數(shù)據(jù)類(lèi)型、字符集編碼
MySQL 簡(jiǎn)單查詢(xún)、條件查詢(xún)、模糊查詢(xún)、多表查詢(xún)以及如何對(duì)查詢(xún)結(jié)果排序、過(guò)濾、分組......
MySQL 中使用索引、視圖、存儲(chǔ)過(guò)程、游標(biāo)、觸發(fā)器
......
如果你想讓自己更加了解 MySQL ,同時(shí)也是為了準(zhǔn)備面試的話,下面這些知識(shí)點(diǎn)要格外注意:
索引:索引優(yōu)缺點(diǎn)、B 樹(shù)和 B+樹(shù)、聚集索引與非聚集索引、覆蓋索引 事務(wù):事務(wù)、數(shù)據(jù)庫(kù)事務(wù)、ACID、并發(fā)事務(wù)、事務(wù)隔離級(jí)別 存儲(chǔ)引擎(MyISAM 和 InnoDB) 鎖機(jī)制與 InnoDB 鎖算法
Redis
Redis 就是一個(gè)使用 C 語(yǔ)言開(kāi)發(fā)的數(shù)據(jù)庫(kù),不過(guò)與傳統(tǒng)數(shù)據(jù)庫(kù)不同的是 Redis 的數(shù)據(jù)是存在內(nèi)存中的 ,也就是它是內(nèi)存數(shù)據(jù)庫(kù),所以讀寫(xiě)速度非常快,因此 Redis 被廣泛應(yīng)用于緩存方向。
如果你要學(xué)習(xí) Redis 的話,強(qiáng)烈推薦 《Redis 設(shè)計(jì)與實(shí)現(xiàn)》[25] 和 《Redis 實(shí)戰(zhàn)》[26] 這兩本書(shū)。另外,《Redis 開(kāi)發(fā)與運(yùn)維》[27] 這本書(shū)也非常不錯(cuò),既有基礎(chǔ)介紹,又有一線開(kāi)發(fā)運(yùn)維經(jīng)驗(yàn)分享。

下面是我總結(jié)的一些關(guān)于并發(fā)的小問(wèn)題,你可以拿來(lái)自測(cè):
Redis 和 Memcached 的區(qū)別和共同點(diǎn) 為什么要用 Redis/為什么要用緩存? Redis 常見(jiàn)數(shù)據(jù)結(jié)構(gòu)以及使用場(chǎng)景分析 Redis 沒(méi)有使用多線程?為什么不使用多線程?Redis6.0 之后為何引入了多線程? Redis 給緩存數(shù)據(jù)設(shè)置過(guò)期時(shí)間有啥用? Redis 是如何判斷數(shù)據(jù)是否過(guò)期的呢? 過(guò)期的數(shù)據(jù)的刪除策略了解么? Redis 內(nèi)存淘汰機(jī)制了解么? Redis 持久化機(jī)制(怎么保證 Redis 掛掉之后再重啟數(shù)據(jù)可以進(jìn)行恢復(fù)) Redis 緩存穿透、緩存雪崩? 如何保證緩存和數(shù)據(jù)庫(kù)數(shù)據(jù)的一致性? ......
常用工具
非常重要!非常重要!特別是 Git 和 Docker。
除了下面這些工具之外,我強(qiáng)烈建議你一定要搞懂 Github 的使用。一些使用 Github 的小技巧,你可以看《Github 小技巧》[28]這篇文章。
IDEA
俗話說(shuō):“工欲善其事,必先利其器 !”。選擇一款好的開(kāi)發(fā)工具對(duì)于我們高效率編碼非常有幫助!
常用的 Java 開(kāi)發(fā)工具就 Eclipse 和 IDEA。就我個(gè)人而言 IDEA 是最適合 Java 開(kāi)發(fā)者的 IDE 。
建議你要熟悉 IDEA 的基本操作以及常用快捷。你可以通過(guò) Github 上的開(kāi)源教程 《IntelliJ IDEA 簡(jiǎn)體中文專(zhuān)題教程》[29] 來(lái)學(xué)習(xí) IDEA 的相關(guān)使用。
除了 IDEA 自身對(duì)編碼優(yōu)秀的支持(比如智能上下文提示)之外,IDEA 中還有豐富的插件來(lái)幫助我們高效開(kāi)發(fā)。《IDEA 插件》 這個(gè)系列專(zhuān)輯中推薦了很多實(shí)用 IDEA 必備的插件!
Maven
強(qiáng)烈建議學(xué)習(xí)常用框架之前可以提前花幾天時(shí)間學(xué)習(xí)一下Maven的使用。(到處找 Jar 包,下載 Jar 包是真的麻煩費(fèi)事,使用 Maven 可以為你省很多事情)。
Git
Git 技能對(duì)于程序員來(lái)說(shuō)也是必備的!試著在學(xué)習(xí)的過(guò)程中將自己的代碼托管在 Github 上,有一個(gè)漂亮的 Github 主頁(yè)在求職面試中是十分加分的。并且,現(xiàn)在的企業(yè)都是基于 Git 在 GitHub 或 GitLab 平臺(tái)上做版本控制。
學(xué)習(xí) Git 的話,強(qiáng)烈推薦給大家一個(gè)可以交互式學(xué)習(xí) Git 的網(wǎng)站 Learn Git Branching[30]。效果真的非常非常棒,通過(guò)游戲的方式讓你學(xué)習(xí) Git 的常見(jiàn)操作。
整個(gè)教程分為很多關(guān),每一關(guān)都有非常詳細(xì)的指導(dǎo),還會(huì)有詳細(xì)的動(dòng)圖展示結(jié)果。并且,你做錯(cuò)了之后還可以使用 reset 命令從頭開(kāi)始。

如果你是在不知道答案的話,還可以使用 show solution 命令查看答案。

這種即時(shí)反饋的學(xué)習(xí)讓過(guò)程變得有趣!真心感謝這個(gè)網(wǎng)站的作者,太愛(ài)了!
另外,你可以看看 Github 上開(kāi)源的這篇 《Git 極簡(jiǎn)入門(mén)》[31] ,像版本控制和 Git 的相關(guān)概念、Git 常見(jiàn)操作這篇文章都有介紹到。
如果想要詳細(xì)了解 Git 的話,Git 官方文檔教程[32]是肯定要看的,介紹的非常全面,并且有中文版!

《Pro Git》[33]這本書(shū)也非常不錯(cuò),還有中文版,內(nèi)容非常全面,硬核!


如果你比較喜歡看視頻教程的話,可以看看極客時(shí)間的《玩轉(zhuǎn) Git 三劍客》[34],課程的作者是攜程代碼平臺(tái)負(fù)責(zé)人蘇玲,講的挺不錯(cuò)的!
Docker
傳統(tǒng)的開(kāi)發(fā)流程中,我們的項(xiàng)目通常需要使用 MySQL、Redis、FastDFS 等等環(huán)境,這些環(huán)境都是需要我們手動(dòng)去進(jìn)行下載并配置的,安裝配置流程極其復(fù)雜,而且不同系統(tǒng)下的操作也不一樣。
Docker 的出現(xiàn)完美地解決了這一問(wèn)題,我們可以在容器中安裝 MySQL、Redis 等軟件環(huán)境,使得應(yīng)用和環(huán)境架構(gòu)分開(kāi),它的優(yōu)勢(shì)在于:
一致的運(yùn)行環(huán)境,能夠更輕松地遷移 對(duì)進(jìn)程進(jìn)行封裝隔離,容器與容器之間互不影響,更高效地利用系統(tǒng)資源 可以通過(guò)鏡像復(fù)制多個(gè)一致的容器
Docker 常見(jiàn)概念解讀,可以看這篇 Github 上開(kāi)源的這篇《Docker 基本概念解讀》[35] ,從零到上手實(shí)戰(zhàn)可以看《Docker 從入門(mén)到上手干事》[36]這篇文章,內(nèi)容非常詳細(xì)!
另外,再給大家推薦一本質(zhì)量非常高的開(kāi)源書(shū)籍《Docker 從入門(mén)到實(shí)踐》[37] ,這本書(shū)的內(nèi)容非常新,畢竟書(shū)籍的內(nèi)容是開(kāi)源的,可以隨時(shí)改進(jìn)。

常用框架
Spring/SpringBoot
Spring 和 SpringBoot 真的很重要!
一定要搞懂 AOP 和 IOC 這兩個(gè)概念。Spring 中 bean 的作用域與生命周期、SpringMVC 工作原理詳解等等知識(shí)點(diǎn)都是非常重要的,一定要搞懂。
企業(yè)中做 Java 后端,你一定離不開(kāi) SpringBoot ,這個(gè)是必備的技能了!一定一定一定要學(xué)好!
像 SpringBoot 和一些常見(jiàn)技術(shù)的整合你也要知識(shí)怎么做,比如 SpringBoot 整合 MyBatis、 ElasticSearch、SpringSecurity、Redis 等等。
學(xué)習(xí) Spring 的話,可以多看看 **《Spring 的官方文檔》**[38],寫(xiě)的很詳細(xì)。你可以在這里找到 Spring 全家桶的學(xué)習(xí)資源。

你也可以把 《Spring 實(shí)戰(zhàn)》[39] 這本書(shū)作為學(xué)習(xí) Spring 的參考資料。這本書(shū)還是比較新的,目前已經(jīng)出到了第 5 版,基于 Spring 5 來(lái)講。

了解了 Spring 中的一些常見(jiàn)概念和基本用法之后,你就可以開(kāi)始學(xué)習(xí) Spring Boot 了。
當(dāng)然了,Spring 其實(shí)并不是學(xué)習(xí) Spring Boot 的前置基礎(chǔ),相比于 Spring 來(lái)說(shuō),Spring Boot 要更容易上手一些!如果你只是想使用 Spring Boot 來(lái)做項(xiàng)目的話,直接學(xué) Spring Boot 就可以了。
不過(guò),我建議你在學(xué)習(xí) Spring Boot 之前,可以看看 《Spring 常見(jiàn)問(wèn)題總結(jié)》[40] 。這些問(wèn)題都是 Spring 比較重要的知識(shí)點(diǎn),也是面試中經(jīng)常會(huì)被問(wèn)到的。
學(xué)習(xí) Spring Boot 的話,還是建議可以多看看 《Spring Boot 的官方文檔》[41],寫(xiě)的很詳細(xì)。
你也可以把 《Spring Boot 實(shí)戰(zhàn)》[42] 這本書(shū)作為學(xué)習(xí) Spring Boot 的參考資料。

這本書(shū)的整體質(zhì)量實(shí)際一般,你當(dāng)做參考書(shū)來(lái)看就好了!
相比于 《Spring Boot 實(shí)戰(zhàn)》這本書(shū),我更推薦國(guó)人寫(xiě)的 《Spring Boot 實(shí)戰(zhàn)派》[43] 。

這本書(shū)使用的 Spring Boot 2.0+的版本,還算比較新。整本書(shū)采用“知識(shí)點(diǎn)+實(shí)例”的形式編寫(xiě),書(shū)籍的最后兩章還有 2 個(gè)綜合性的企業(yè)實(shí)戰(zhàn)項(xiàng)目:
開(kāi)發(fā)企業(yè)級(jí)通用的后臺(tái)系統(tǒng) 實(shí)現(xiàn)一個(gè)類(lèi)似“京東”的電子商務(wù)商城
作者在注意實(shí)戰(zhàn)的過(guò)程中還不忘記對(duì)于一些重要的基礎(chǔ)知識(shí)的講解。
如果你想專(zhuān)研 Spring Boot 底層原理的話,可以看看 《Spring Boot 編程思想(核心篇)》[44] 。

這本書(shū)稍微有點(diǎn)啰嗦,不過(guò),原理介紹的比較清楚(不適合初學(xué)者)。
如果你比較喜歡看視頻的話,推薦尚硅谷雷神的**《2021 版 Spring Boot2 零基礎(chǔ)入門(mén)》**[45] 。

這可能是全網(wǎng)質(zhì)量最高并且免費(fèi)的 Spring Boot 教程了,好評(píng)爆炸!
另外,Spring Boot 這塊還有很多優(yōu)質(zhì)的開(kāi)源教程,我已經(jīng)整理好放到 awesome-java@SpringBoot[46] 中了。

Netty
但凡涉及到網(wǎng)絡(luò)通信就必然必然離不開(kāi)網(wǎng)絡(luò)編程。Netty 目前作為 Java 網(wǎng)絡(luò)編程最熱門(mén)的框架,毫不夸張地說(shuō)是每個(gè) Java 程序員必備的技能之一。
為什么說(shuō)學(xué)好 Netty 很有必要呢?
Netty 基于 NIO (NIO 是一種同步非阻塞的 I/O 模型,在 Java 1.4 中引入了 NIO )。使用 Netty 可以極大地簡(jiǎn)化并簡(jiǎn)化了 TCP 和 UDP 套接字服務(wù)器等網(wǎng)絡(luò)編程,并且性能以及安全性等很多方面都非常優(yōu)秀。 我們平常經(jīng)常接觸的 Dubbo、RocketMQ、Elasticsearch、gRPC、Spark、Elasticsearch 等等熱門(mén)開(kāi)源項(xiàng)目都用到了 Netty。 大部分微服務(wù)框架底層涉及到網(wǎng)絡(luò)通信的部分都是基于 Netty 來(lái)做的,比如說(shuō) Spring Cloud 生態(tài)系統(tǒng)中的網(wǎng)關(guān) Spring Cloud Gateway 。
下面是一些比較推薦的書(shū)籍/專(zhuān)欄。
《Netty 實(shí)戰(zhàn)》[47]

這本書(shū)可以用來(lái)入門(mén) Netty ,內(nèi)容從 BIO 聊到了 NIO、之后才詳細(xì)介紹為什么有 Netty 、Netty 為什么好用以及 Netty 重要的知識(shí)點(diǎn)講解。
這本書(shū)基本把 Netty 一些重要的知識(shí)點(diǎn)都介紹到了,而且基本都是通過(guò)實(shí)戰(zhàn)的形式講解。
《Netty 進(jìn)階之路:跟著案例學(xué) Netty》

內(nèi)容都是關(guān)于使用 Netty 的實(shí)踐案例比如內(nèi)存泄露這些東西。如果你覺(jué)得你的 Netty 已經(jīng)完全入門(mén)了,并且你想要對(duì) Netty 掌握的更深的話,推薦你看一下這本書(shū)。
《Netty 入門(mén)與實(shí)戰(zhàn):仿寫(xiě)微信 IM 即時(shí)通訊系統(tǒng)》

通過(guò)一個(gè)基于 Netty 框架實(shí)現(xiàn) IM 核心系統(tǒng)為引子,帶你學(xué)習(xí) Netty。整個(gè)小冊(cè)的質(zhì)量還是很高的,即使你沒(méi)有 Netty 使用經(jīng)驗(yàn)也能看懂。
搜索引擎
搜索引擎用于提高搜索效率,功能和瀏覽器搜索引擎類(lèi)似。比較常見(jiàn)的搜索引擎是 Elasticsearch(推薦) 和 Solr。
如果你要學(xué)習(xí) Elasticsearch 的話,Elastic 中文社區(qū)[48] 以及 Elastic 官方博客[49] 都是非常不錯(cuò)的資源,上面會(huì)分享很多具體的實(shí)踐案例。
除此之外,極客時(shí)間的《Elasticsearch 核心技術(shù)與實(shí)戰(zhàn)》[50]這門(mén)課程非常贊!這門(mén)課基于 Elasticsearch 7.1 版本講解,比較新。并且,作者是 eBay 資深技術(shù)專(zhuān)家,有 20 年的行業(yè)經(jīng)驗(yàn),課程質(zhì)量有保障!

如果你想看書(shū)的話,可以考慮一下 《Elasticsearch 實(shí)戰(zhàn)》 這本書(shū)。不過(guò),需要說(shuō)明的是,這本書(shū)中的 Elasticsearch 版本比較老,你可以將其作為一個(gè)參考書(shū)籍來(lái)看,有一些原理性的東西可以在上面找找答案。

如果你想進(jìn)一步深入研究 Elasticsearch 原理的話,可以看看張超老師的《Elasticsearch 源碼解析與優(yōu)化實(shí)戰(zhàn)》這本書(shū)。這是市面上唯一一本寫(xiě) Elasticsearch 源碼的書(shū)。

分布式
下面我們開(kāi)始學(xué)習(xí)分布式以及高并發(fā)、高可用了。
這塊內(nèi)容的話,對(duì)于每一個(gè)知識(shí)點(diǎn)沒(méi)有特定的書(shū)籍。我就推薦 2 本我覺(jué)得還不錯(cuò)的書(shū)籍吧!這兩把書(shū)籍基本把下面涉及到的知識(shí)點(diǎn)給涵蓋了。
第一本是李運(yùn)華老師的**《從零開(kāi)始學(xué)架構(gòu)》[51]** 。

這本書(shū)對(duì)應(yīng)的有一個(gè)極客時(shí)間的專(zhuān)欄—《從零開(kāi)始學(xué)架構(gòu)》[52],里面的很多內(nèi)容都是這個(gè)專(zhuān)欄里面的,兩者買(mǎi)其一就可以了。
第二本是余老師的 《軟件架構(gòu)設(shè)計(jì):大型網(wǎng)站技術(shù)架構(gòu)與業(yè)務(wù)架構(gòu)融合之道》[53] 。

事務(wù)與鎖、分布式(CAP、分布式事務(wù)......)、高并發(fā)、高可用這本書(shū)都有介紹到。值得推薦!良心好書(shū)!
理論
CAP 理論
CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分區(qū)容錯(cuò)性) 這三個(gè)單詞首字母組合。
關(guān)于 CAP 的詳細(xì)解讀請(qǐng)看:《CAP 理論解讀》[54]。
BASE 理論
BASE 是 Basically Available(基本可用) 、Soft-state(軟狀態(tài)) 和 Eventually Consistent(最終一致性) 三個(gè)短語(yǔ)的縮寫(xiě)。BASE 理論是對(duì) CAP 中一致性和可用性權(quán)衡的結(jié)果,其來(lái)源于對(duì)大規(guī)模互聯(lián)網(wǎng)系統(tǒng)分布式實(shí)踐的總結(jié),是基于 CAP 定理逐步演化而來(lái)的,它大大降低了我們對(duì)系統(tǒng)的要求。
關(guān)于 CAP 的詳細(xì)解讀請(qǐng)看:《BASE 理論解讀》[55]。
Paxos 算法和 Raft 算法
Paxos 算法誕生于 1990 年,這是一種解決分布式系統(tǒng)一致性的經(jīng)典算法 。但是,由于 Paxos 算法非常難以理解和實(shí)現(xiàn),不斷有人嘗試簡(jiǎn)化這一算法。到了 2013 年才誕生了一個(gè)比 Paxos 算法更易理解和實(shí)現(xiàn)的分布式一致性算法—Raft 算法。
RPC
RPC 讓調(diào)用遠(yuǎn)程服務(wù)調(diào)用像調(diào)用本地方法那樣簡(jiǎn)單。
Dubbo 是一款國(guó)產(chǎn)的 RPC 框架,由阿里開(kāi)源。相關(guān)閱讀:
Dubbo 常見(jiàn)問(wèn)題總結(jié)[56] 服務(wù)之間的調(diào)用為啥不直接用 HTTP 而用 RPC?[57]
服務(wù)注冊(cè)與發(fā)現(xiàn)
Eureka、Zookeeper、Consul、Nacos 都可以提供服務(wù)注冊(cè)與發(fā)現(xiàn)的功能。

API 網(wǎng)關(guān)
網(wǎng)關(guān)主要用于請(qǐng)求轉(zhuǎn)發(fā)、安全認(rèn)證、協(xié)議轉(zhuǎn)換、容災(zāi)。
SpringCloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目,為了取代 Netflix Zuul。
配置中心
微服務(wù)下,業(yè)務(wù)的發(fā)展一般會(huì)導(dǎo)致服務(wù)數(shù)量的增加,進(jìn)而導(dǎo)致程序配置(服務(wù)地址、數(shù)據(jù)庫(kù)參數(shù)等等)增多。
傳統(tǒng)的配置文件的方式已經(jīng)無(wú)法滿足當(dāng)前需求,主要有兩點(diǎn)原因:一是安全性得不到保障(配置放在代碼庫(kù)中容易泄露);二是時(shí)效性不行 (修改配置需要重啟服務(wù)才能生效)。
Spring Cloud Config、Nacos 、Apollo、K8s ConfigMap 都可以用來(lái)做配置中心。
Apollo 和 Nacos 我個(gè)人更喜歡。Nacos 使用起來(lái)更加順手,Apollo 在配置管理方面做的更加全面。
分布式 id
日常開(kāi)發(fā)中,我們需要對(duì)系統(tǒng)中的各種數(shù)據(jù)使用 ID 唯一表示,比如用戶 ID 對(duì)應(yīng)且僅對(duì)應(yīng)一個(gè)人,商品 ID 對(duì)應(yīng)且僅對(duì)應(yīng)一件商品,訂單 ID 對(duì)應(yīng)且僅對(duì)應(yīng)一個(gè)訂單。

簡(jiǎn)單來(lái)說(shuō),ID 就是數(shù)據(jù)的唯一標(biāo)識(shí)。
分布式 ID 是分布式系統(tǒng)下的 ID。分布式 ID 不存在與現(xiàn)實(shí)生活中,屬于計(jì)算機(jī)系統(tǒng)中的一個(gè)概念。
我簡(jiǎn)單舉一個(gè)分庫(kù)分表的例子。
我司的一個(gè)項(xiàng)目,使用的是單機(jī) MySQL 。但是,沒(méi)想到的是,項(xiàng)目上線一個(gè)月之后,隨著使用人數(shù)越來(lái)越多,整個(gè)系統(tǒng)的數(shù)據(jù)量將越來(lái)越大。
單機(jī) MySQL 已經(jīng)沒(méi)辦法支撐了,需要進(jìn)行分庫(kù)分表(推薦 Sharding-JDBC)。
在分庫(kù)之后, 數(shù)據(jù)遍布在不同服務(wù)器上的數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)的自增主鍵已經(jīng)沒(méi)辦法滿足生成的主鍵唯一了。我們?nèi)绾螢椴煌臄?shù)據(jù)節(jié)點(diǎn)生成全局唯一主鍵呢?

這個(gè)時(shí)候就需要生成分布式 ID了。
分布式 ID 的解決方案有很多比如 :
算法 : UUID、Snowflake開(kāi)源框架 : UidGenerator、Leaf、Tinyid
分布式事務(wù)
微服務(wù)架構(gòu)下,一個(gè)系統(tǒng)被拆分為多個(gè)小的微服務(wù)。
每個(gè)微服務(wù)都可能存在不同的機(jī)器上,并且每個(gè)微服務(wù)可能都有一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)供自己使用。這種情況下,一組操作可能會(huì)涉及到多個(gè)微服務(wù)以及多個(gè)數(shù)據(jù)庫(kù)。
舉個(gè)例子:電商系統(tǒng)中,你創(chuàng)建一個(gè)訂單往往會(huì)涉及到訂單服務(wù)(訂單數(shù)加一)、庫(kù)存服務(wù)(庫(kù)存減一)等等服務(wù),這些服務(wù)會(huì)有供自己?jiǎn)为?dú)使用的數(shù)據(jù)庫(kù)。

那么如何保證這一組操作要么都執(zhí)行成功,要么都執(zhí)行失敗呢?
這個(gè)時(shí)候單單依靠數(shù)據(jù)庫(kù)事務(wù)就不行了!我們就需要引入 分布式事務(wù) 這個(gè)概念了!
常用分布式事務(wù)解決方案有 Seata 和 Hmily。
Seata[58] :Seata 是一款開(kāi)源的分布式事務(wù)解決方案,致力于在微服務(wù)架構(gòu)下提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。 Hmily[59] : 金融級(jí)分布式事務(wù)解決方案
分布式鏈路追蹤
不同于單體架構(gòu),在分布式架構(gòu)下,請(qǐng)求需要在多個(gè)服務(wù)之間調(diào)用,排查問(wèn)題會(huì)非常麻煩。我們需要分布式鏈路追蹤系統(tǒng)來(lái)解決這個(gè)痛點(diǎn)。
目前分布式鏈路追蹤系統(tǒng)基本都是根據(jù)谷歌的《Dapper 大規(guī)模分布式系統(tǒng)的跟蹤系統(tǒng)》這篇論文發(fā)展而來(lái),主流的有 Pinpoint,Skywalking ,CAT(當(dāng)然也有其他的例如 Zipkin,Jaeger 等產(chǎn)品,不過(guò)總體來(lái)說(shuō)不如前面選取的 3 個(gè)完成度高)等。
Zipkin 是 Twitter 公司開(kāi)源的一個(gè)分布式鏈路追蹤工具,Spring Cloud Sleuth 實(shí)際是基于 Zipkin 的。
SkyWalking 是國(guó)人吳晟(華為)開(kāi)源的一款分布式追蹤,分析,告警的工具,現(xiàn)在是 Apache 旗下開(kāi)源項(xiàng)目
微服務(wù)
微服務(wù)的很多東西實(shí)際在分布式這一節(jié)已經(jīng)提到了。
我這里就再補(bǔ)充一些微服務(wù)架構(gòu)中,經(jīng)常使用到的一些組件。
聲明式服務(wù)調(diào)用 : Feign 負(fù)載均衡 : Ribbon ......
高并發(fā)
消息隊(duì)列

消息隊(duì)列在分布式系統(tǒng)中主要是為了解耦和削峰。相關(guān)閱讀:消息隊(duì)列常見(jiàn)問(wèn)題總結(jié)[60]。
常用的消息隊(duì)列如下:
RocketMQ[61] :阿里巴巴開(kāi)源的一款高性能、高吞吐量的分布式消息中間件。 Kafaka[62]: Kafka 是一種分布式的,基于發(fā)布 / 訂閱的消息系統(tǒng)。關(guān)于它的入門(mén)可以查看:Kafka 入門(mén)看這一篇就夠了[63] RabbitMQ[64] :由 erlang 開(kāi)發(fā)的基于 AMQP(Advanced Message Queue 高級(jí)消息隊(duì)列協(xié)議)協(xié)議實(shí)現(xiàn)的消息隊(duì)列。
讀寫(xiě)分離&分庫(kù)分表
讀寫(xiě)分離主要是為了將數(shù)據(jù)庫(kù)的讀和寫(xiě)操作分不到不同的數(shù)據(jù)庫(kù)節(jié)點(diǎn)上。主服務(wù)器負(fù)責(zé)寫(xiě),從服務(wù)器負(fù)責(zé)讀。另外,一主一從或者一主多從都可以。
讀寫(xiě)分離可以大幅提高讀性能,小幅提高寫(xiě)的性能。因此,讀寫(xiě)分離更適合單機(jī)并發(fā)讀請(qǐng)求比較多的場(chǎng)景。

分庫(kù)分表是為了解決由于庫(kù)、表數(shù)據(jù)量過(guò)大,而導(dǎo)致數(shù)據(jù)庫(kù)性能持續(xù)下降的問(wèn)題。
常見(jiàn)的分庫(kù)分表工具有:sharding-jdbc(當(dāng)當(dāng))、TSharding(蘑菇街)、MyCAT(基于 Cobar)、Cobar(阿里巴巴)...。推薦使用 sharding-jdbc。因?yàn)椋?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(41, 128, 185);">sharding-jdbc 是一款輕量級(jí) Java 框架,以 jar 包形式提供服務(wù),不要我們做額外的運(yùn)維工作,并且兼容性也很好。

相關(guān)閱讀:讀寫(xiě)分離&分庫(kù)分表常見(jiàn)問(wèn)題總結(jié)[65]
負(fù)載均衡
負(fù)載均衡系統(tǒng)通常用于將任務(wù)比如用戶請(qǐng)求處理分配到多個(gè)服務(wù)器處理以提高網(wǎng)站、應(yīng)用或者數(shù)據(jù)庫(kù)的性能和可靠性。
常見(jiàn)的負(fù)載均衡系統(tǒng)包括 3 種:
DNS 負(fù)載均衡 :一般用來(lái)實(shí)現(xiàn)地理級(jí)別的均衡。 硬件負(fù)載均衡 :通過(guò)單獨(dú)的硬件設(shè)備比如 F5 來(lái)實(shí)現(xiàn)負(fù)載均衡功能(硬件的價(jià)格一般很貴)。 軟件負(fù)載均衡 :通過(guò)負(fù)載均衡軟件比如 Nginx 來(lái)實(shí)現(xiàn)負(fù)載均衡功能。
高可用
高可用描述的是一個(gè)系統(tǒng)在大部分時(shí)間都是可用的,可以為我們提供服務(wù)的。高可用代表系統(tǒng)即使在發(fā)生硬件故障或者系統(tǒng)升級(jí)的時(shí)候,服務(wù)仍然是可用的 。
相關(guān)閱讀:《如何設(shè)計(jì)一個(gè)高可用系統(tǒng)?要考慮哪些地方?[66]》 。
限流&降級(jí)&熔斷
限流是從用戶訪問(wèn)壓力的角度來(lái)考慮如何應(yīng)對(duì)系統(tǒng)故障。限流為了對(duì)服務(wù)端的接口接受請(qǐng)求的頻率進(jìn)行限制,防止服務(wù)掛掉。比如某一接口的請(qǐng)求限制為 100 個(gè)每秒, 對(duì)超過(guò)限制的請(qǐng)求放棄處理或者放到隊(duì)列中等待處理。限流可以有效應(yīng)對(duì)突發(fā)請(qǐng)求過(guò)多。相關(guān)閱讀:限流算法有哪些?[67]
降級(jí)是從系統(tǒng)功能優(yōu)先級(jí)的角度考慮如何應(yīng)對(duì)系統(tǒng)故障。服務(wù)降級(jí)指的是當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)當(dāng)前業(yè)務(wù)情況及流量對(duì)一些服務(wù)和頁(yè)面有策略的降級(jí),以此釋放服務(wù)器資源以保證核心任務(wù)的正常運(yùn)行。
熔斷和降級(jí)是兩個(gè)比較容易混淆的概念,兩者的含義并不相同。
降級(jí)的目的在于應(yīng)對(duì)系統(tǒng)自身的故障,而熔斷的目的在于應(yīng)對(duì)當(dāng)前系統(tǒng)依賴(lài)的外部系統(tǒng)或者第三方系統(tǒng)的故障。
Hystrix[68] 和 Sentinel[69] 都能實(shí)現(xiàn)限流、降級(jí)、熔斷。
Hystrix 是 Netflix 開(kāi)源的熔斷降級(jí)組件,Sentinel 是阿里中間件團(tuán)隊(duì)開(kāi)源的一款不光具有熔斷降級(jí)功能,同時(shí)還支持系統(tǒng)負(fù)載保護(hù)的組件。
兩者都是主要做熔斷降級(jí) ,那么兩者到底有啥異同呢?該如何選擇呢?
Sentinel 的 wiki 中已經(jīng)詳細(xì)描述了其與 Hystrix 的區(qū)別[70],你可以看看。
排隊(duì)
另類(lèi)的一種限流,類(lèi)比于現(xiàn)實(shí)世界的排隊(duì)。玩過(guò)英雄聯(lián)盟的小伙伴應(yīng)該有體會(huì),每次一有活動(dòng),就要經(jīng)歷一波排隊(duì)才能進(jìn)入游戲。
集群
相同的服務(wù)部署多份,避免單點(diǎn)故障。
超時(shí)和重試機(jī)制
一旦用戶的請(qǐng)求超過(guò)某個(gè)時(shí)間得不到響應(yīng)就結(jié)束此次請(qǐng)求并拋出異常。 如果不進(jìn)行超時(shí)設(shè)置可能會(huì)導(dǎo)致請(qǐng)求響應(yīng)速度慢,甚至導(dǎo)致請(qǐng)求堆積進(jìn)而讓系統(tǒng)無(wú)法在處理請(qǐng)求。
另外,重試的次數(shù)一般設(shè)為 3 次,再多次的重試沒(méi)有好處,反而會(huì)加重服務(wù)器壓力(部分場(chǎng)景使用失敗重試機(jī)制會(huì)不太適合)。
后續(xù)想法
我的后續(xù)想法是繼續(xù)完善這個(gè)學(xué)習(xí)路線并且將其制作為下圖的形式,非常清晰直觀!
deadline 就設(shè)定是五月中旬吧!

參考資料
Roadmap to becoming a Java developer in 2021—Github: https://github.com/s4kibs4mi/java-developer-roadmap
[2]《 Java 基礎(chǔ)教程系列》: https://www.bilibili.com/video/BV1Kb411W75N
[3]《零基礎(chǔ) 30 天學(xué)會(huì) Java》: https://www.bilibili.com/video/BV1fh411y7R8
[4]《零基礎(chǔ) 30 天學(xué)會(huì) Java》: https://www.bilibili.com/video/BV1fh411y7R8
[5]《Head First Java》: https://book.douban.com/subject/2000732/
[6]《Java 核心技術(shù)卷 1+卷 2》: https://book.douban.com/subject/34898994/
[7]《Java 編程思想 》: https://book.douban.com/subject/2130190/
[8]《Java 8 實(shí)戰(zhàn)》: https://book.douban.com/subject/26772632/
[9]《Java 并發(fā)編程之美》: https://book.douban.com/subject/30351286/
[10]《實(shí)戰(zhàn) Java 高并發(fā)程序設(shè)計(jì)》: https://book.douban.com/subject/30358019/
[11]《深入淺出 Java 多線程》: https://github.com/RedSpider1/concurrent
[12]《Java 并發(fā)實(shí)現(xiàn)原理:JDK 源碼剖析》: https://book.douban.com/subject/35013531/
[13]《深入理解 Java 虛擬機(jī)》: https://book.douban.com/subject/34907497/
[14]《實(shí)戰(zhàn) Java 虛擬機(jī)》: https://book.douban.com/subject/26354292/
[15]《虛擬機(jī)設(shè)計(jì)與實(shí)現(xiàn):以 JVM 為例》: https://book.douban.com/subject/34935105/
[16]《自己動(dòng)手寫(xiě) Java 虛擬機(jī)》: https://book.douban.com/subject/26802084/
[17]《zachaxy 的手寫(xiě) JVM 系列》: https://zachaxy.github.io/tags/JVM/
[18]《從表到里學(xué)習(xí) JVM 實(shí)現(xiàn)》: https://www.douban.com/doulist/2545443/
[19]《JVM 全套教程》: https://www.bilibili.com/video/BV1PJ411n7xZ
[20]《JVM 參數(shù)【Memory 篇】》: https://club.perfma.com/course/438755/list
[21]《MySQL 必知必會(huì)》: https://book.douban.com/subject/3354490/
[22]《高性能 MySQL》: https://book.douban.com/subject/23008813/
[23]《MySQL 技術(shù)內(nèi)幕》: https://book.douban.com/subject/24708143/
[24]《MySQL 數(shù)據(jù)庫(kù)教程視頻》: https://www.bilibili.com/video/BV1fx411X7BD
[25]《Redis 設(shè)計(jì)與實(shí)現(xiàn)》: https://book.douban.com/subject/25900156/
[26]《Redis 實(shí)戰(zhàn)》: https://book.douban.com/subject/26612779/
[27]《Redis 開(kāi)發(fā)與運(yùn)維》: https://book.douban.com/subject/26971561/
[28]《Github 小技巧》: https://snailclimb.gitee.io/javaguide/#/docs/tools/Github%E6%8A%80%E5%B7%A7
[29]《IntelliJ IDEA 簡(jiǎn)體中文專(zhuān)題教程》: https://github.com/judasn/IntelliJ-IDEA-Tutorial
[30]Learn Git Branching: https://learngitbranching.js.org/
[31]《Git 極簡(jiǎn)入門(mén)》: https://snailclimb.gitee.io/javaguide/#/docs/tools/Git
[32]Git 官方文檔教程: https://git-scm.com/book/zh/v2
[33]《Pro Git》: https://www.progit.cn/
[34]《玩轉(zhuǎn) Git 三劍客》: http://gk.link/a/10qcT
[35]《Docker 基本概念解讀》: https://snailclimb.gitee.io/javaguide/#/docs/tools/Docker
[36]《Docker 從入門(mén)到上手干事》: https://snailclimb.gitee.io/javaguide/#/docs/tools/Docker從入門(mén)到實(shí)戰(zhàn)
[37]《Docker 從入門(mén)到實(shí)踐》: https://yeasy.gitbook.io/docker_practice/introduction/why
[38]《Spring 的官方文檔》: https://spring.io/projects/spring-framework#learn
[39]《Spring 實(shí)戰(zhàn)》: https://book.douban.com/subject/34949443/
[40]《Spring 常見(jiàn)問(wèn)題總結(jié)》: https://snailclimb.gitee.io/javaguide/#/docs/system-design/framework/spring/Spring常見(jiàn)問(wèn)題總結(jié)
[41]《Spring Boot 的官方文檔》: https://spring.io/projects/spring-boot#learn
[42]《Spring Boot 實(shí)戰(zhàn)》: https://book.douban.com/subject/26857423/
[43]《Spring Boot 實(shí)戰(zhàn)派》: https://book.douban.com/subject/34894533/
[44]《Spring Boot 編程思想(核心篇)》: https://book.douban.com/subject/33390560/
[45]《2021 版 Spring Boot2 零基礎(chǔ)入門(mén)》: https://www.bilibili.com/video/BV19K4y1L7MT
[46]awesome-java@SpringBoot: https://github.com/CodingDocs/awesome-java#springboot
[47]《Netty 實(shí)戰(zhàn)》: https://book.douban.com/subject/27038538/
[48]Elastic 中文社區(qū): http://www.elasticsearch.cn/
[49]Elastic 官方博客: https://www.elastic.co/cn/blog/
[50]《Elasticsearch 核心技術(shù)與實(shí)戰(zhàn)》: http://gk.link/a/10bcT
[51]《從零開(kāi)始學(xué)架構(gòu)》: https://book.douban.com/subject/30335935/
[52]《從零開(kāi)始學(xué)架構(gòu)》: http://gk.link/a/10pKZ
[53]《軟件架構(gòu)設(shè)計(jì):大型網(wǎng)站技術(shù)架構(gòu)與業(yè)務(wù)架構(gòu)融合之道》: https://book.douban.com/subject/30443578/
[54]《CAP 理論解讀》: https://snailclimb.gitee.io/javaguide/#/docs/system-design/distributed-system/CAP理論
[55]《BASE 理論解讀》: https://snailclimb.gitee.io/javaguide/#/docs/system-design/distributed-system/BASE理論
[56]Dubbo 常見(jiàn)問(wèn)題總結(jié): https://snailclimb.gitee.io/javaguide/#/docs/system-design/distributed-system/rpc/Dubbo
[57]服務(wù)之間的調(diào)用為啥不直接用 HTTP 而用 RPC?: https://snailclimb.gitee.io/javaguide/#/docs/system-design/distributed-system/rpc/服務(wù)之間的調(diào)用為啥不直接用HTTP而用RPC
[58]Seata: https://seata.io/zh-cn/index.html
[59]Hmily: https://gitee.com/shuaiqiyu/hmily
[60]消息隊(duì)列常見(jiàn)問(wèn)題總結(jié): https://snailclimb.gitee.io/javaguide/#/docs/system-design/distributed-system/message-queue/message-queue
[61]RocketMQ: https://github.com/apache/rocketmq
[62]Kafaka: https://github.com/apache/kafka
[63]Kafka 入門(mén)看這一篇就夠了: https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/data-communication/Kafka入門(mén)看這一篇就夠了.md
[64]RabbitMQ: https://github.com/rabbitmq
[65]讀寫(xiě)分離&分庫(kù)分表常見(jiàn)問(wèn)題總結(jié): https://snailclimb.gitee.io/javaguide/#/docs/system-design/讀寫(xiě)分離&分庫(kù)分表
[66]如何設(shè)計(jì)一個(gè)高可用系統(tǒng)?要考慮哪些地方?: https://snailclimb.gitee.io/javaguide/#/docs/system-design/high-availability/如何設(shè)計(jì)一個(gè)高可用系統(tǒng)要考慮哪些地方
[67]限流算法有哪些?: https://snailclimb.gitee.io/javaguide/#/docs/system-design/high-availability/limit-request
[68]Hystrix: https://github.com/Netflix/Hystrix
[69]Sentinel: https://github.com/alibaba/Sentinel
[70]Sentinel 的 wiki 中已經(jīng)詳細(xì)描述了其與 Hystrix 的區(qū)別: https://github.com/alibaba/Sentinel/wiki/Sentinel-與-Hystrix-的對(duì)比
歡迎準(zhǔn)備面試的朋友加入我的星球,一個(gè)純 Java 面試交流圈子 !Ready!。目前星球已經(jīng)更新 3 個(gè)原創(chuàng)小冊(cè):《Java面試進(jìn)階指北》、《從零開(kāi)始寫(xiě)一個(gè) RPC 框架》 、《程序員副業(yè)賺錢(qián)之路》。累計(jì)幫助 520+ 位球友提供了免費(fèi)的簡(jiǎn)歷修改服務(wù),回答了 500+ 個(gè)問(wèn)題,產(chǎn)出了 1300+ 個(gè)主題。
推薦?? :1049天,100K!簡(jiǎn)單復(fù)盤(pán)!
推薦?? :年薪 40W Java 開(kāi)發(fā)是什么水平?
推薦?? :Github掘金計(jì)劃:Github上的一些優(yōu)質(zhì)項(xiàng)目搜羅
