Java工程師學習指南(完結篇)

a724888發表於2019-10-17

Java工程師學習指南

完結篇

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

因為筆者還只是一名在校生,所以寫的內容主要還是針對Java初學者或者接觸Java後端不久的朋友,不適用於已經工作多年的Java大佬們。所以本文中的方法不一定適合所有人,如有錯誤還請諒解。

本期的內容是系列文章的最後一部分內容了。這個系列可能還有很多東西沒有說清楚,也有很多內容被忽略了。但是這些內容也確實是筆者結合自己經驗總結而成的,希望能對大家有用 ~ 當然如果有什麼建議也可以隨時和筆者交流。

上期回顧

上期我們重點介紹了Java工程師進階所需要掌握的一些技術內容。特別對於即將參加校招的同學來說,最重要的也是這部分內容,你需要了解JVM虛擬機器原理,Java併發原理,並且熟悉JDK的部分原始碼,瞭解這些API的底層實現。

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

本期主題

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

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

01

Web後端架構

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

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

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

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

02

分散式理論基礎

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

推薦資源:《從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來實現。

04

快取

講到快取,我們說的最多的就是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叢集。

05

訊息佇列

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

1 RabbitMQ

筆者剛開始接觸的訊息佇列是rabbitmq,它的使用方法比較簡單。 RabbitMQ是一個由erlang開發的AMQP(Advanced Message Queue )的開源實現,主要有以下特點:

1.  `安裝部署簡單,上手門檻低,功能豐富,符合AMQP標準;`
2.  `企業級訊息佇列,經過大量實踐考驗的高可靠;`
3.  `叢集易擴充套件,可以輕鬆的增減叢集節點;`
4.  `有強大的WEB管理頁面。`

2 Kafka

與其他MQ相比較,Kafka有一些優缺點,主要如下

優點:

1.  `可擴充套件。Kafka叢集可以透明的擴充套件,增加新的伺服器進叢集。`
2.  `高效能。Kafka效能遠超過傳統的ActiveMQ、RabbitMQ等,Kafka支援Batch操作。`
3.  `容錯性。Kafka每個Partition資料會複製到幾臺伺服器,當某個Broker失效時,Zookeeper將通知生產者和消費者從而使用其他的Broker。`

缺點:

1.  `重複訊息。Kafka保證每條訊息至少送達一次,雖然機率很小,但一條訊息可能被送達多次。`
2.  `訊息亂序。Kafka某一個固定的Partition內部的訊息是保證有序的,如果一個Topic有多個Partition,partition之間的訊息送達不保證有序。`
3.  `複雜性。Kafka需要Zookeeper的支援,Topic一般需要人工建立,部署和維護比一般MQ成本更高。`

RocketMQ

RocketMQ是一個純java、分散式、佇列模型的開源訊息中介軟體,前身是Metaq,當 Metaq 3.0釋出時,產品名稱改為 RocketMQ。

具有以下特點:

1.  `1、能夠保證嚴格的訊息順序`
2.  `2、提供豐富的訊息拉取模式`
3.  `3、高效的訂閱者水平擴充套件能力`
4.  `4、實時的訊息訂閱機制`
5.  `5、億級訊息堆積能力`

除此之外,它還有一個優點,就是支援事務訊息,讓分散式事務的實現變得簡單

05

分散式資料庫

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

1 主從複製和讀寫分離

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

2 分庫分表方案

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

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

06

大後端相關技術

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

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

Hadoop生態

筆者之前參與過資料倉儲相關的專案,所以稍微瞭解了這方面的內容,感覺hadoop生態還是挺有意思的。

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

推薦資源:我的技術部落格-個人分類-hadoop,《大資料技術原理與應用》

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

雲端計算初探

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

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

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

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

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

推薦資源:《Docker技術入門與實戰》,《kubenetes權威指南》

其他常見後端技術

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

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

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

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

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

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

總結

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

1 Web架構

2 分散式基礎理論

3 常見分散式技術

4 快取

5 訊息佇列

6 資料的分散式方案

7 大後端相關技術

至此本系列文章就已經結束了,不知道大家有什麼問題或者建議想和筆者交流嗎~趕緊加我的微信來聊聊吧。

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

微信公眾號

個人公眾號:黃小斜

黃小斜是跨考軟體工程的 985 碩士,自學 Java 兩年,拿到了 BAT 等近十家大廠 offer,從技術小白成長為阿里工程師。

作者專注於 JAVA 後端技術棧,熱衷於分享程式設計師乾貨、學習經驗、求職心得和程式人生,目前黃小斜的CSDN部落格有百萬+訪問量,知乎粉絲2W+,全網已有10W+讀者。

黃小斜是一個斜槓青年,堅持學習和寫作,相信終身學習的力量,希望和更多的程式設計師交朋友,一起進步和成長!

原創電子書:
關注公眾號【黃小斜】後回覆【原創電子書】即可領取我原創的電子書《菜鳥程式設計師修煉手冊:從技術小白到阿里巴巴Java工程師》

程式設計師3T技術學習資源: 一些程式設計師學習技術的資源大禮包,關注公眾號後,後臺回覆關鍵字 “資料” 即可免費無套路獲取。

考研複習資料:
計算機考研大禮包,都是我自己考研複習時用的一些複習資料,包括公共課和專業的複習視訊,這裡也推薦給大家,關注公眾號後,後臺回覆關鍵字 “考研” 即可免費獲取。

技術公眾號:Java技術江湖

如果大家想要實時關注我更新的文章以及分享的乾貨的話,可以關注我的公眾號【Java技術江湖】一位阿里 Java 工程師的技術小站,作者黃小斜,專注 Java 相關技術:SSM、SpringBoot、MySQL、分散式、中介軟體、叢集、Linux、網路、多執行緒,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!

Java工程師必備學習資源: 一些Java工程師常用學習資源,關注公眾號後,後臺回覆關鍵字 “Java” 即可免費無套路獲取。

我的公眾號

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69906029/viewspace-2660446/,如需轉載,請註明出處,否則將追究法律責任。

相關文章