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

Java工程師學習指南java

完結篇nginx

先聲明一點,文章裏面不會詳細到每一步怎麼操做,只會提供大體的思路和方向,給你們以啓發,若是真的要一步一步指導操做的話,那至少須要一本書的厚度啦。算法

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

本期的內容是系列文章的最後一部份內容了。這個系列可能還有不少東西沒有說清楚,也有不少內容被忽略了。可是這些內容也確實是筆者結合本身經驗總結而成的,但願能對你們有用 ~ 固然若是有什麼建議也能夠隨時和筆者交流。docker

上期回顧

上期咱們重點介紹了Java工程師進階所須要掌握的一些技術內容。特別對於即將參加校招的同窗來講,最重要的也是這部份內容,你須要瞭解JVM虛擬機原理,Java併發原理,而且熟悉JDK的部分源碼,瞭解這些API的底層實現。數據庫

之因此把這部分放在Java Web項目以後來說,是由於我以爲,一開始作項目的時候你不可能已經掌握好上述內容了,因此你徹底能夠帶着問題去作項目,再花時間去學習底層原理,這樣你能夠很好地結合你以前實踐過的代碼去理解那些底層技術了。後端

本期主題

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

這些內容其實離咱們並不遠,只不過在平時的項目中可能用的比較少,因此做爲學生黨通常也只能經過一些文章或者書本去學習理論知識。那麼基於這麼一個狀況,咱們來談談怎麼學習這部分的內容吧。數組

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. 一、可以保證嚴格的消息順序
  2. 二、提供豐富的消息拉取模式
  3. 三、高效的訂閱者水平擴展能力
  4. 四、實時的消息訂閱機制
  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後端學習路線,因此我總結了以前本身的學習歷程,才創做出這四篇文章,但願可以對你們有所幫助~

相關文章
相關標籤/搜索