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

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 )的開源實現,主要有以下特點:

<pre>

  1. 安裝部署簡單,上手門檻低,功能豐富,符合AMQP標準;

  2. 企業級消息隊列,經過大量實踐考驗的高可靠;

  3. 集羣易擴展,可以輕鬆的增減集羣節點;

  4. 有強大的WEB管理頁面。

</pre>

2 Kafka

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

優點:

<pre>

  1. 可擴展。Kafka集羣可以透明的擴展,增加新的服務器進集羣。

  2. 高性能。Kafka性能遠超過傳統的ActiveMQ、RabbitMQ等,Kafka支持Batch操作。

  3. 容錯性。Kafka每個Partition數據會複製到幾臺服務器,當某個Broker失效時,Zookeeper將通知生產者和消費者從而使用其他的Broker。

</pre>

缺點:

<pre>

  1. 重複消息。Kafka保證每條消息至少送達一次,雖然機率很小,但一條消息可能被送達多次。

  2. 消息亂序。Kafka某一個固定的Partition內部的消息是保證有序的,如果一個Topic有多個Partition,partition之間的消息送達不保證有序。

  3. 複雜性。Kafka需要Zookeeper的支持,Topic一般需要人工創建,部署和維護比一般MQ成本更高。

</pre>

RocketMQ

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

具有以下特點:

<pre>

  1. 1、能夠保證嚴格的消息順序

  2. 2、提供豐富的消息拉取模式

  3. 3、高效的訂閱者水平擴展能力

  4. 4、實時的消息訂閱機制

  5. 5、億級消息堆積能力

</pre>

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

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後端學習路線,所以我總結了之前自己的學習歷程,才創作出這四篇文章,希望能夠對大家有所幫助~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章