超硬核Java工程師學習指南,真正的從入門到精通,眾多粉絲親測已拿offer!

来源:https://www.cnblogs.com/AntCoder/archive/2020/07/26/13382054.html
-Advertisement-
Play Games

最近有很多小伙伴來問我,Java小白如何入門,如何安排學習路線,每一步應該怎麼走比較好。原本我以為之前的幾篇文章已經可以解決大家的問題了,其實不然,因為我之前寫的文章都是站在Java後端的全局上進行思考和總結的,忽略了很多小白們的感受,而很多朋友都需要更加基礎,更加詳細的學習路線。 所以,今天我們重 ...


最近有很多小伙伴來問我,Java小白如何入門,如何安排學習路線,每一步應該怎麼走比較好。原本我以為之前的幾篇文章已經可以解決大家的問題了,其實不然,因為我之前寫的文章都是站在Java後端的全局上進行思考和總結的,忽略了很多小白們的感受,而很多朋友都需要更加基礎,更加詳細的學習路線。

所以,今天我們重新開一個新的專題,分別按照四篇文章講述Java的學習路線(分別是入門篇,初級篇,中級篇,高級篇),筆者也打算趁此機會,回憶一下自己的Java學習歷程。今天我們要講的是,小白同學如何入門Java。

先聲明一點,文章內容不會詳細到每一步怎麼操作,只會提供大致的思路和方向,給大家以啟發,如果真的要一步一步指導操作的話,那至少需要一本書的厚度啦。

本文所述的方法不一定適合所有人,如有錯誤敬請諒解。

Java工程師學習指南 入門篇

文中提到我的技術博客專欄

https://github.com/h2pl/Java-Tutorial

【Java工程師面試複習指南】本倉庫涵蓋大部分Java程式員所需要掌握的核心知識,整合了互聯網上的很多優質Java技術文章,力求打造為最完整最實用的Java開發者學習指南,如果對你有幫助,給個star告訴我吧,謝謝!

前期準備工作

開發環境搭建

這一步我們往往會直接跳過,但既然是面向小白的教程,這裡就提一下吧。首先你需要一臺電腦,然後安裝好JDK和JRE,JDK提供的是Java開發工具,也就是一些必備的jar包,JRE則是Java的運行環境組件,我們熟悉的JVM就在這裡面。

安裝好這兩個東東之後,一般還要配置一下環境變數,否則有一些目錄可能無法被正確找到。

IDE選擇和安裝

IDE指的就是本地開發編輯器,沒有了它,你就只能直接在記事本這類工具里敲代碼了。IDE最大的好處就是整合了大量的工具和功能模塊,讓你非常輕鬆地完成開發。

以前大家都用eclipse,不過eclipse已經不流行了,現在我推薦你直接用intellij idea作為你的第一個代碼編輯器。如果是用過eclipse的同學,基本上也可以無痛切換。

intellij idea可以直接在官網上下載,試用版30天,如果想要永久使用,網上也有一些辦法滴。

關於jar包

jar包是什麼,其實就是將一堆class格式文件打包,Java中把它稱為jar包,這些jar包在編譯器中能被直接識別,讓開發者使用。

對於新手來說,可能只需要用到JDK自帶的一些API,但是如果你要引用外部jar包,可能就會遇到一些困難了。對於idea來說,導入外部jar包有兩種辦法,一種是手動導入jar包,一種是使用maven。後者會在Java Web相關的文章中講起。

手動導入jar包其實也不難,你需要先下載好jar包,然後在對應的項目下選擇導入jar包即可,具體的方法這裡就不展開說了,因為在網上都找得到。

學習Java基礎的幾種方法

瞭解基礎語法

學習一門語言,最開始要做的事情就是學習它的語法。我最早學習Java語法是在Runoob,這個網站可以讓你對任意一門語言完成最快速的語法入門,當然,這隻是相當於你瀏覽了一遍基礎語法。

想要真正掌握Java語言基礎,光看基礎語法還遠遠不夠,我在大三第一次接觸Java課程,聽老師講面向對象三大特征聽得一頭霧水,連數組的初始化方式都理不清楚,但這些內容都是我們需要掌握的。所以,為了學好Java基礎,我們還需要看視頻或者看書進行學習。

看視頻

視頻的話,可以到極客學院或者慕課網聽Java基礎課程,當然也可以看我分享的Java視頻課程。大家也都知道,現在Java的培訓班非常多,基本上學的東西也都大同小異,不過它們的有些課程還不錯,大家有渠道的話也可以去看一看。

看視頻的好處是你可以更好地接收知識,同時也會耗費你更多實踐,所以,有時候你也可以選擇看書。

看書

看書的話,對於小白來說不推薦太複雜的書,比如《Java編程思想》這種書,新手千萬不要看。我個人建議,你只需要先看看《Java入門到精通》這種類型的書就足夠了,因為這個部分的學習只是為你後面的學習開個頭,你以後可能還要回過頭來重新研究這些內容。

現在市面上介紹Java基礎的書籍實在太多了,質量參差不齊,內容同質化嚴重,筆者看過的其實也不多。給大家一個建議,你只需要挑一兩本書來看即可,這裡推薦兩本最簡單的吧,《head first java》和《Java從入門到精通》。

看博客

這裡再推薦另一種學習方式,就是看博客,博客比起書籍來說,更適合對於某個技術點的學習,你可以很容易地在網上找到這個知識點相關的原理,實現方法,以及代碼範例。

我的博客里沒有講解特別基礎的東西,如果你看一些比較基礎的文章,可以到Runoob等網站上查看。如果你有一個很明確的知識點想要學習,相信搜搜引擎會給你更好的答案。

代碼實踐

除此之外,一般的Java書籍或者視頻課程都會要求你相應完成一些練習題,這部分內容你需要自己在電腦里使用IDE完成。

在IDE里,你可以很好地熟悉Java語言的使用,基本代碼的實現,同時可以嘗試各種各樣的API,並且測試一些語言特性,比如繼承,封裝,多態等等。

另外,這也是你熟悉IDE的一個好機會,因為在公司里做開發可能要用到IDE各種各樣的功能,提前熟悉好IDE絕對是有益無害的。

Java入門必備知識點梳理

在Java入門階段,你可能需要接觸到以下這部分知識,不管你是從通過哪種方式學習,這些內容都是你學習Java基礎時繞不過的重點。

Java基礎知識

這部分內容是你必須要掌握的內容,在入門階段你需要把這些基礎打扎實,以便於在學習後面的內容時可以更上一層樓。

如何把基礎打扎實呢,最好的辦法就是在IDE上把書上或者視頻上的每個例子都實現一遍,當然有的時候你也可以自己寫一些有意思的例子。

1 基本數據類型

比如int,double,char,以及其包裝類。

熟悉基本數據類型的使用,瞭解每種類型所占的位元組數,以及它們和包裝類之間的相互轉換。

2 流程式控制制

比如for迴圈,if else,while迴圈等等

如果是學過c語言的同學,這部分可以跳過了。

3 字元串類型String的使用

字元串類型是Java中很重要的類型,它不是基本數據類型,但卻很常用,熟悉和實踐String相關的api,開始你對字元串的學習吧。

4 數組

數組的初始化方式有哪些,二維數組應該怎麼寫,把數組當成方法參數又該怎麼處理?

5 類和對象

Java中最重要的兩個概念:類和對象,它們有什麼用呢,有什麼區別和聯繫呢,請在代碼中實踐它們吧。

Java核心技術

對於這部分內容,我相信很多小白只能瞭解它們的基本使用方法,但是並不明白其背後的一些原理:比如為什麼介面和抽象類有這些區別,多態的意義是什麼,為什麼要有反射。

新手在學習這部分內容時,只需要知道怎麼用就可以了。當然,你最好把這些特性都實現一遍,以加深印象。

至於為什麼有這些特性,這些特性背後的原理是什麼,不是我們現在討論的內容,這些內容我們將在初級和中級篇中講述。因為,要瞭解這些原理,你得瞭解JVM,瞭解併發技術的基礎,瞭解網路基礎,甚至更多。顯然,這不是你現在能做到的。

1 介面和抽象類

寫一些介面,同時寫一些實現類去實現這些介面,並且瞭解一下為什麼我們需要介面,為什麼子類需要實現介面里的方法。

同理,去實現一些抽象類吧。然後,看看它和介面有什麼不同。

2 繼承,封裝和多態

如何理解繼承,子類和父類之間有什麼聯繫呢。

封裝是一種保護代碼的方式,有哪些方式可以實現封裝呢。

多態一般分為重載和重寫,它們分別怎麼使用?

3 異常處理

Java中的異常處理主要用於捕獲和處理錯誤,請你寫一些try catch代碼塊去捕獲錯誤吧。

4 集合類

集合類是我們經常需要打交道的東西,List,Map,Set等等,趕快去熟悉API,然後寫一些測試例子吧。

5 IO輸入流和輸出流

IO輸入流和輸出流可以操作文件,網路數據等內容,如何在Java代碼中完成這麼複雜的操作呢,其實只需要簡單的幾個api就可以了。

6 多線程

為了讓系統資源最合理地分配和調度,我們需要多線程,多線程會讓程式變得有趣,也會帶來很多問題,使用Thread和相關API,去嘗試這些有趣的事情吧。

可選內容:

1 反射(瞭解即可,不是入門必須)

2 枚舉類型和泛型(瞭解即可,不是入門必須)

3 網路通信(瞭解基本的socket使用即可,需要網路基礎)

4 資料庫操作(瞭解基本的JDBC即可,需要資料庫基礎)

總結

總而言之,對於一個Java小白來說,入門Java可以分為這幾步:

1 首先搭建好Java開發環境

2 通過Runoob等一些網站熟悉Java的基本語法

3 通過看書看視頻等方式熟悉Java基礎知識,通過代碼實踐加深理解

4 通過看書看視頻等方式初步瞭解Java核心技術,通過代碼實踐加深理解。

本文主要是為大家提供一個學習的思路,以及推薦一些學習方法,如果你能夠按照這樣的步驟去學習,並且配合上一些適合你自己的學習方法來完成學習計劃,相信你可以很好地完成對Java的入門。

Java工程師學習指南 中級篇

在上一小節中,我們主要討論的是如何做一個Java Web項目,以及前期需要哪些方面的基礎。

跟著視頻課程做完一個項目,你只是照葫蘆畫瓢又練習了一遍,可能其中有很多東西你並不太理解,比如你可能不知道為什麼代碼要分層,為什麼要用maven進行線上編譯,為什麼Tomcat啟動時會輸出那麼多的日誌。

有疑問很正常,因為一個Java Web項目涉及的技術還是很多的,如果要理解這些技術的原理,光靠一個項目課程是遠遠不夠的。所以,在你體驗了Java Web項目的開發流程以後,你應該花些時間去瞭解相關技術原理了,今天我們要講的也是這部分內容。

對於即將參加校招的同學來說,最重要的也是這部分內容,你需要瞭解JVM虛擬機原理,Java併發原理,並且熟悉JDK的部分源碼,瞭解這些API的底層實現。除此之外,還有很多,下麵我們分別來談一談。

文中提到我的技術博客專欄

https://github.com/h2pl/Java-Tutorial

【Java工程師面試複習指南】本倉庫涵蓋大部分Java程式員所需要掌握的核心知識,整合了互聯網上的很多優質Java技術文章,力求打造為最完整最實用的Java開發者學習指南,如果對你有幫助,給個star告訴我吧,謝謝!

電腦基礎知識

如果你不是電腦專業的同學,那你可能要註意一下了。在學習下麵這些內容之前,你最好要學習一下電腦基礎課程。

這裡我們說的電腦課程是:數據結構,操作系統,電腦網路。

數據結構:這門課應該算是三門課程比較簡單的一門了,推薦《大話數據結構》,看書結合代碼實踐,把基本的數據結構演算法寫一寫就可以了。

操作系統:關於操作系統我看了很多本書,但是沒有感覺特別好的,所以如果有時間的話可以先看另外一本書《深入理解電腦系統》,這本書講了很多電腦的基本概念,不局限於操作系統。

然後可以看一看《操作系統導論》或者你們學校的教材。

電腦網路:網路方面的書也非常多,推薦看一下《電腦網路:自頂向下方法》,另外還有一本《TCP/IP 詳解:捲一》也是備受推崇的書。

除此之外,我還要推薦一下劉欣老師的書 《碼農翻身》,書中用一些有趣的故事來講解操作系統和計算網路的一些複雜概念,有助於大家理解這部分內容。

JVM虛擬機

為什麼把JVM放在第一位,因為它是最基礎也最重要的一塊內容。所有的Java代碼都運行在JVM上,事實上,JVM在操作系統中只是一個進程。為了瞭解Java代碼的運行方式,底層引擎的執行原理,以及記憶體的分配情況,我們必須要學習JVM虛擬機。

推薦資源:《深入理解JVM虛擬機》我的技術博客專欄“深入瞭解JVM虛擬機”

很高興地告訴你們,學習JVM你只需要把這本書吃透即可,當然,看一遍可不夠,筆者前後至少看了三遍,有條件的話最好把書中的實例都跑一跑。

另外,JVM也是面試必考的內容,所以,相應地去準備一些面試題也是很有必要的,如果你基本掌握了這本書的內容,相信你不會懼怕任何JVM面試題。

設計模式與源碼閱讀

為什麼在這裡提到設計模式呢,因為設計模式是Java編程規範的經典總結,並且在JDK源碼中經常使用,由於我們後面會講到JDK源碼方面的學習,所以對於設計模式,建議大家先學習一下,最好的學習方式就是看書結合實踐,把一些常用的設計模式自己實現一下。

推薦資源:《head first 設計模式》

JDK源碼(主要指集合類源碼)

接下來下場的選手是:JDK源碼。不過對於大部分人來說,只要能夠掌握集合類,字元串這些源碼就可以了,其他部分的源碼主要集中在JUC併發包里,而這些內容我們會放在Java併發技術里來講。

為什麼我們需要掌握集合類源碼呢,其一是因為面試喜歡考,其二是因為集合類的源碼實現都比較經典,難度也不算太大,並且運用了很多優化方法,所以瞭解它對於學習Java的同學來說大有裨益。

推薦資源

我的技術博客專欄“spring和springmvc源碼解析”

市面上並沒有哪本書專門來講JDK源碼的,所以這部分內容的學習資源主要是兩個部分,一是JDK源碼本身,而是一些技術博客。

1 對於JDK源碼,直接看可能比較有難度,不推薦新手這麼做。

2 講解源碼的文章質量參差不齊,比較優質的文章可以到掘金和開發者頭條看看,另外【JavaDoop】和【芋道源碼】等幾位老哥的源碼文章也很好

Spring源碼

說實話,Spring源碼的複雜度遠高於集合類的源碼,這也是因為Spring運用了很多的設計模式,並且有著非常繁雜的類關係。所以,我不建議大家直接去讀Spring源碼,因為即使是看Spring源碼解析的書籍,你也會感到很吃力。

所以,我推薦的方式是,看書+看一些比較好的源碼解析文章。另外要告訴大家的是,Spring的源碼很多,並不是所有內容都需要你掌握的,大家都知道Spring最常用的特性就是IOC和AOP,所以看源碼解析時,最重要的也是這兩個部分了。

另外,看完Spring的源碼解析以後,別忘了看SpringMVC的源碼解析,學習方法也是一樣的,找重點內容看即可。

Java併發技術

推薦閱讀,我的技術博客專欄“Java併發編程技術“

相信你為了搞定集合類源碼和Spring源碼花了不少功夫了,接下來輪到Java併發技術出場了。我們在入門篇其實已經談到了多線程,但是也僅僅停留在使用Thread或者Runnable實現簡單的多線程demo。

實際上,為了理解Java併發技術的底層實現,我們還需要知道JMM模型,瞭解synchronized和volatile的底層實現,同時還要明白Java中的多線程和操作系統的多線程和什麼聯繫和區別。除此之外,我們經常談到的線程安全,有哪些實現方法,也是這部分內容的要點。

學習併發技術,我建議分為三個步驟

1 首先熟悉Java的多線程基礎知識,比如Thread的使用,線程的狀態轉換,以及一些api的使用方式。

2 瞭解一些理論基礎,比如JMM,操作系統的多線程實現。這部分內容推薦通過看書和看博客來學習。

3 瞭解並使用JUC的一些API,然後開始看JUC的一些源代碼。這個階段是最重要也是最困難的。

Java網路編程

推薦閱讀,我的技術博客專欄“分散式系統理論與實踐”

在搞懂Java併發編程技術之後,相信這部分內容也難不倒你。當然,前提是你對電腦網路有一定瞭解,因為網路編程涉及到TCP和HTTP相關的知識點。

在學習這部分內容的時候,你首先要瞭解socket的使用以及原理,然後再去瞭解NIO的相關API,多寫一些客戶端和服務端通訊的demo,以便熟悉這些內容。為了更好地理解網路編程,你還要去瞭解UNIX網路編程模型。

除此之外,如果你想要更好地理解Java網路編程,你還需要去瞭解Tomcat的實現原理。同時,Netty也是值得你去學習的一部分內容,當然這頁是比較進階的內容了,有機會的話可以去用一用這一網路編程框架,學有餘力的同學還可以考慮看看它的源碼(筆者沒有看)。

Java8

Java的版本一直在更新,但目前在用的主要還是Java8和Java7,等再過幾年可能這部分的內容就過時了。但是目前看來,對Java8的學習和瞭解還是很重要的,畢竟面試也喜歡考。

對這部分內容學習的最好方式就是:看文章+代碼實踐

總結

今天的內容貌似有點多,大家會不會感覺有點吃不消呢。沒關係,因為這部分內容確實需要花很多時間去學習。對於一個在校的Java學習者來說,可能沒有機會接觸到多麼高大上的項目,所以對內功的修煉顯得格外重要。

看書,寫demo,讀源碼,看似簡單的事情實際上需要花費大量時間和精力,這個過程是需要你靜下心來,慢慢沉澱的,在學習的過程中你也可以和筆者一樣,寫一些總結和博客,以便更好地回顧自己的學習歷程。

總結以下今天所講的內容吧:

1 電腦基礎課程:數據結構,網路和操作系統 
2 JVM基本原理 
3 設計模式,JDK源碼,Spring源碼 
4 Java併發技術,JUC源碼 
5 Java網路編程 
6 Java8

Java工程師學習指南 完結篇

之所以把這部分放在Java Web項目之後來講,是因為我覺得,一開始做項目的時候你不可能已經掌握好上述內容了,所以你完全可以帶著問題去做項目,再花時間去學習底層原理,這樣你可以很好地結合你之前實踐過的代碼去理解那些底層技術了。

本期主要介紹的是Java後端技術比較“高端”的一些內容,也就是我們經常聊的分散式,架構,緩存,消息隊列等內容,另外我們也會介紹一些大後端相關的技術,比如雲計算(OpenStack和docker),大數據(hadoop生態),以及一些常用的後端技術。

這些內容其實離我們並不遠,只不過在平時的項目中可能用的比較少,所以作為學生黨一般也只能通過一些文章或者書本去學習理論知識。那麼基於這麼一個情況,我們來談談怎麼學習這部分的內容吧。

文中提到我的技術博客專欄

https://github.com/h2pl/Java-Tutorial

【Java工程師面試複習指南】本倉庫涵蓋大部分Java程式員所需要掌握的核心知識,整合了互聯網上的很多優質Java技術文章,力求打造為最完整最實用的Java開發者學習指南,如果對你有幫助,給個star告訴我吧,謝謝!

Web後端架構

後端進階第一步,先把Web架構相關的技術學好吧,因為之前大家都做過Java Web項目,想必對這塊內容還是比較熟悉的吧。我們需要瞭解Web架構演化的歷史,瞭解為什麼要做伺服器集群,為什麼要用緩存,為什麼要做拆分,做主從,以及為什麼要有分散式。

推薦資源:《深入分析Java Web技術內幕》,《大型網站技術架構》

兩本都是阿裡大佬出的書,兩位都是淘寶系的技術大牛。前一本書主要講述的Java Web的一些技術基礎,關於Web架構的內容比較少。

後一本則是李智慧大佬寫的架構科普書籍,用非常簡單易懂的語言寫出了大型Web項目架構之美,分彆著眼於高可用,高性能,高擴展等方面講解了很多設計結構的原則和方法。這本書應該是Web架構小白最好的入門書籍了。

分散式理論基礎

由於下麵的內容或多或少都會涉及到分散式相關的知識,所以這一部分我們主要介紹一下有關分散式的基礎知識。筆者對分散式的學習主要也停留在理論上,所以這裡講的也是一些理論的東西。

推薦資源:《從Paxos到zookeeper分散式一致性原理與實踐》 我的技術博客專欄“分散式系統理論與實踐”

這本書比較好地科普了分散式基礎知識,也介紹了zookeeper的原理和使用。瞭解zookeeper是瞭解分散式技術很重要的一個環節。

1 CAP 和 BASE

談分散式就要談CAP,一致性,高可用,網路分區容忍性為何只能三選二,為什麼網路分區容忍性必須要被考慮。CAP在實際應用中真的可靠麽?

BASE出現的原因,為什麼BASE更容易實現,更適合實際應用,BASE可以通過哪些技術去實現呢?

2 一致性協議和演算法

一致性協議也是分散式理論的一個重點,2PC,3PC,分別指的是什麼,其中分別有什麼問題。3PC解決了2PC的一個問題,卻仍然不完美。

Paxos和Raft兩種一致性演算法,顯然前者比後者複雜得多,但是Raft可能更加實用。為什麼我們需要一致性演算法,它們又有什麼用呢。

3 分散式事務和最終一致性

分散式事務是一個複雜的概念,主要指分散式系統中需要強一致場景時所用到的事務。理解和實現它都不是簡單的事情。

如果我們退而求其次,不要求強一致性,而選擇最終一致性,則可以用更加靈活的方案,比如事務消息。

常見分散式技術

推薦資源:《從Paxos到zookeeper分散式一致性原理與實踐》,《深入理解Spring Cloud與微服務構建》,《分散式服務框架原理與實踐》。

推薦閱讀我的技術博客專欄“分散式系統理論與實踐”

1 zookeeper

上文說到zookeeper是分散式技術很重要的一塊內容,這是因為zookeeper用於管理和協調分散式組件,雖然它出自hadoop生態,卻用於很多應用當中,基本上有分散式的地方就有zk的存在。

簡單說來,zk可以提供全局統一的節點樹結構,通過節點來管理資源,同時zk自身是使用集群方式部署的,所以保證自己是高可用的。根據這一特點,它可以作為服務註冊中心,還可以實現分散式鎖等功能。

2 分散式服務

分散式服務是一個挺有意思的東西,也很常用,簡單來說,就是把服務組件部署在不同節點上,通過rpc的方式訪問,為了實現這一功能,我們需要考慮通信協議,序列化方式,進一步來說,我們還要瞭解如何做服務註冊和發現,以及如何做限流,做服務熔斷和降級,等等等等。

常見的分散式服務框架有dubbo,以及Spring Cloud這類產品,學會使用他們,然後瞭解它們的底層實現原理,相信會是一個很有趣的過程。

3 負載均衡

關於負載均衡,說起來其實很簡單,就是把一組請求分成多組,按照某種規則分發到多台伺服器上。

但是負載均衡也涉及很多內容,包括負載均衡的演算法,負載均衡的實現方式,我們需要瞭解它到底是在哪一層實現的。

一般來說,常用的負載均衡方式有nginx和lvs兩種,分別是7層和4層的負載均衡,一個基於功能變數名稱進行負載均衡,一個基於埠號做負載均衡。瞭解它們的實現原理,會讓你更好地理解這部分內容。

4 分散式session和分散式鎖

這兩個組件也是分散式項目中經常要用到的,瞭解它們的使用和實現原理,有助於以後在項目中的實踐。

分散式session一般有多種實現方式,可以存資料庫或者緩存,也可以單獨部署成一個服務,總之最重要的一點就是,性能要好,並且要高可用。

分散式鎖則用於一些需要一致性的場景中,比如訂單生成這種全局唯一的功能,分散式鎖通常可以用緩存或者資料庫來實現,但為了保證高性能,並且避免死鎖,我們一般採用Redis或者zookeeper來實現。

緩存

講到緩存,我們說的最多的就是Redis,所以我們要講的也是Redis。學習Redis,除了學會使用簡單的api之外,最好還要瞭解它的實現原理。

推薦閱讀:我的技術博客專欄“重新學習MySQL和Redis”,《Redis設計與實現》

這裡我們主要介紹三部分內容,也是我個人認為比較重要的三塊內容。

1 數據結構和底層實現

Redis的數據結構比較豐富,但更有意思的是這些數據結構背後的底層實現,也就是作者如何用c語言來實現這些結構的。其中會有你熟悉的數組,鏈表,還有一些有意思的結構比如跳錶,哈希表。

2 持久化方式

持久化方式主要分兩種,aof和rdb,前者基於追加日誌的方式來實現日誌持久化,後者則是使用備份數據的方式來實現持久化。

3 分散式方案

這是Redis最有趣也最複雜的部分。 首先,Redis可以使用主從的方式部署,其中“哨兵”這一組件用於故障切換。

基於哨兵的主從部署後來發展為Redis cluster的部署方式,也就是Redis集群,通過分片的方式來部署Redis集群,並且集群中任一節點都可以用來對外提供服務。

當然,除了Redis集群之外,還有codis的分散式方案,codis基於代理的方式來實現,錶面上還是使用原來的Redis API,但實際上訪問的卻是一個Redis集群。

消息隊列

消息隊列的作用一般來說就是削峰,控流,解耦合,目前業界也有很多的消息隊列產品,在很多公司都會使用,當然,它們各有各的優缺點,我們也不必全都瞭解,這裡我們大概介紹3種消息隊列,它們各自的特點都比較鮮明,值得大家去瞭解一番。

1 RabbitMQ

筆者剛開始接觸的消息隊列是rabbitmq,它的使用方法比較簡單。 RabbitMQ是一個由erlang開發的AMQP(Advanced Message Queue )的開源實現

2 Kafka

Kafka是由Apache軟體基金會開發的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分散式發佈訂閱消息系統,它可以處理消費者在網站中的所有動作流數據。 這種

RocketMQ

RocketMQ是一個純java、分散式、隊列模型的開源消息中間件,前身是Metaq,當 Metaq 3.0發佈時,產品名稱改為 RocketMQ。

它支持事務消息,讓分散式事務的實現變得簡單

分散式數據中間件

這裡說的分散式”資料庫“,其實指的是資料庫的分散式方案,更具體來說,主要指的是資料庫的主從部署,以及分庫,分表。

1 主從複製和讀寫分離

這是資料庫高可用的基礎。MySQL資料庫會使用日誌來完成主從複製,先寫主庫,然後再同步到從庫。讀寫分離則一般是指的是:從庫負責讀,主庫負責寫。

2 分庫分表方案

分庫分表是解決大表性能瓶頸的一種方法,當然也分為橫向拆分和縱向拆分,橫向拆分指的就是減少單表的數據量,放到其他表或者其他庫中。縱向拆分則一般指按照業務來拆分,把不必要的欄位放到其他表中。

分庫分表可以在應用層做,通過對id或者其他欄位進行hash以便映射到對應的表中。當然也可以通過資料庫中間件來完成,例如mycat這種中間件,通過代理的方式實現分庫分表,非常方便。

大後端相關技術

推薦閱讀我的技術博客專欄“後端技術雜談”

這部分的內容筆者也只是略知一二,所以這裡只是拋磚引玉,做一個簡單的科普罷了。畢竟咱們學技術的人都是先講深度再來談廣度。當你對之前的內容掌握得比較好的時候,再去看看大後端的一些其他技術,也會感覺挺有意思的。

下麵這些技術主要是我自己學習路上接觸過的一些內容,所以比較熟悉,才拿出來分享,至於適不適合大家的口味,可能就見仁見智了。

Hadoop生態

筆者之前參與過數據倉庫相關的項目,所以稍微瞭解了這方面的內容,感覺hadoop生態還是挺有意思的。

大家不妨去瞭解一下其中的基本組件,然後打一個集群自己玩玩看。 常見的組件有:hdfs,hbase,hive,zookeeper,flume,sqoop,yarn。

推薦:《大數據技術原理與應用》

對於入門hadoop生態來說,這本書完全足夠了,如果你要做大數據平臺開發或者是數據研發工程師,可能需要非常全面地瞭解這些組件的底層原理。

雲計算初探

筆者之前參與過私有雲相關的項目,所以稍微瞭解了這方面的內容,感覺這方面的內容也蠻有趣的。

我在項目中主要接觸到的是OpenStack,docker以及kubenetes,OpenStack是一個私有雲生態,內部結構對於我們來說還是比較複雜的,不過最根本的虛擬化技術還是基於kvm虛擬化來實現的。

docker則是現在非常流行的一種容器,用於快速部署應用。

kubenetes也藉著docker的東風火了起來,可以理解為是基於容器的分散式調度系統。

這些技術在企業中也是比較常用的,只不過對於研發同學來說,更多時候扮演的是工具的角色。

其他常見後端技術

除此之外,想必大家還瞭解過很多其他的技術,只不過不同的業務用到的組件往往不一樣,所以並不是每個東西你都需要去瞭解。

比如搜索引擎技術Lucene,基於它的兩款產品solr和elasticsearch,通常出現在需要搜索功能的項目中。

再比如流式計算技術,如storm和spark streaming等等,通常都用於大數據部門,用作實時數據採集。

又如ELK實現的分散式日誌系統,多用於分析和定位系統問題,經常會出現在一些比較重要的應用當中。

當然,也有現在大火的人工智慧,還有太多的技術我們沒機會去瞭解和使用,我們能做的也就是在自己能力範圍內把需要做的東西做到最好了。

所以,這些內容並不是每一樣你都需要知道,但是如果有時間去瞭解一下的話,還是建議多瞭解一點的。

總結

今天碼的字有點多,所以難免有些寫的不太好的地方,希望大家見諒。縱觀全文,我們主要講了這些內容:

1 Web架構

2 分散式基礎理論

3 常見分散式技術
 
4 緩存
 
5 消息隊列

6 數據的分散式方案

至此本系列文章就已經結束了,不知道大家有什麼問題或者建議想和筆者交流嗎?

寫本系列文章也是因為有很多朋友想要瞭解更加清晰的Java後端學習路線,所以我總結了之前自己的學習歷程,才創作出這四篇文章,希望能夠對大家有所幫助~

更多內容請關註微信公眾號【Java技術江湖】

一位阿裡 Java 工程師的技術小站。作者黃小斜,專註 Java 相關技術:SSM、SpringBoot、MySQL、分散式、中間件、集群、Linux、網路、多線程,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!(關註公眾號後回覆”Java“即可領取 Java基礎、進階、項目和架構師等免費學習資料,更有資料庫、分散式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送作者原創的Java學習指南、Java程式員面試指南等乾貨資源)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 本篇文章收錄於專輯:http://dwz.win/HjK,點擊解鎖更多數據結構與演算法的知識。 你好,我是彤哥,一個每天爬二十六層樓還不忘讀源碼的硬核男人。 上一節,我們一起學習了複雜度分析的套路和常見的複雜度。 但是,我們的案例基本都是以時間複雜度為主,很少接觸到空間複雜度。 那麼,到底什麼才 ...
  • 很多人搞不明白 REST(Representational State Transfer 表述性狀態轉移)原因在於一開始就是把它當做設計風格而不是架構風格來理解,因而一上來就大談特談什麼 RESTful API,結果是只見樹木不見森林。 僅從設計的角度去理解 REST(僅把它作為 API 設計原則) ...
  • 一、PreparedStatement介面 1.java.sql.PraparedStatement介面繼承並擴展了Statement介面,用於執行動態的SQL語句,即包含參數的SQL語句。 PraparedStatement ps = connection.preparedStatement("s ...
  • IO讀寫基礎 應用層在進行read,write系統調用時,不是物理級別的讀寫,而是緩存的複製,進程緩衝區同內核緩衝區的緩存複製,底層數據交換是有由操作系統內核完成,控制內核緩衝與硬體(物理設備)之間數據交換.linux系統在系統內核只有一個內核緩衝區,用戶進程都有獨立的緩衝區,是進程緩衝區。外部設備 ...
  • 內置異常和Throwable核心方法 Java內置異常 可查異常(必須要在方法裡面捕獲或者拋出) ClassNoFoundException 應⽤程式試圖載入類,找不到對應的類 IllegalAccessException 拒絕訪問⼀個類的時候 NoSuchFieldExcetion 請求的變數不存 ...
  • VSCode配置Rust開發環境 在商店中輸入rls,選擇rust,點擊Quick start中的下載鏈接。這個Rust插件你也要記得下。 跳轉後來到下載界面,點擊下載。 運行下載好的exe文件,命令行輸入1按下回車即可。 安裝完畢後在命令行輸入rustc --version,如果能輸出版本號則表示 ...
  • 一、Tomcat的安裝及簡單使用 在網上找到你需要安裝的Tomcat版本,解壓到你需要安裝的目錄就可以了 目錄介紹: bin 專門用來存放 Tomcat 伺服器的可執行程式 conf 專門用來存放 Tocmat 伺服器的配置文件 lib 專門用來存放 Tomcat 伺服器的 jar 包 logs 專 ...
  • Java是啥 新手程式員通常會走入一個誤區,就是認為學習了一門語言,就可以稱為是某某語言工程師了。但事實上真的是這樣嗎?其實並非如此。 今天我們就來聊一聊,Java 開發工程師到底開發的是什麼東西。準確點來說,Java後端到底在做什麼? 基礎 大家都知道 Java 是一門後端語言,後端指的就是服務端 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...