上期回顧
上期我們重點(diǎn)介紹了Java工程師進(jìn)階所需要掌握的一些技術(shù)內(nèi)容。特別對(duì)于即將參加校招的同學(xué)來(lái)說(shuō)创南,最重要的也是這部分內(nèi)容伦忠,你需要了解JVM虛擬機(jī)原理,Java并發(fā)原理稿辙,并且熟悉JDK的部分源碼昆码,了解這些API的底層實(shí)現(xiàn)。
之所以把這部分放在Java Web項(xiàng)目之后來(lái)講邻储,是因?yàn)槲矣X(jué)得赋咽,一開始做項(xiàng)目的時(shí)候你不可能已經(jīng)掌握好上述內(nèi)容了,所以你完全可以帶著問(wèn)題去做項(xiàng)目吨娜,再花時(shí)間去學(xué)習(xí)底層原理脓匿,這樣你可以很好地結(jié)合你之前實(shí)踐過(guò)的代碼去理解那些底層技術(shù)了。
本期主題
本期主要介紹的是Java后端技術(shù)比較“高端”的一些內(nèi)容宦赠,也就是我們經(jīng)常聊的分布式陪毡,架構(gòu),緩存勾扭,消息隊(duì)列等內(nèi)容毡琉,另外我們也會(huì)介紹一些大后端相關(guān)的技術(shù),比如云計(jì)算(OpenStack和docker)妙色,大數(shù)據(jù)(hadoop生態(tài))桅滋,以及一些常用的后端技術(shù)。
這些內(nèi)容其實(shí)離我們并不遠(yuǎn)燎斩,只不過(guò)在平時(shí)的項(xiàng)目中可能用的比較少虱歪,所以作為學(xué)生黨一般也只能通過(guò)一些文章或者書本去學(xué)習(xí)理論知識(shí)。那么基于這么一個(gè)情況栅表,我們來(lái)談?wù)勗趺磳W(xué)習(xí)這部分的內(nèi)容吧笋鄙。
01 Web后端架構(gòu)
Web后端架構(gòu)
后端進(jìn)階第一步,先把Web架構(gòu)相關(guān)的技術(shù)學(xué)好吧怪瓶,因?yàn)橹按蠹叶甲鲞^(guò)Java Web項(xiàng)目萧落,想必對(duì)這塊內(nèi)容還是比較熟悉的吧。我們需要了解Web架構(gòu)演化的歷史洗贰,了解為什么要做服務(wù)器集群找岖,為什么要用緩存,為什么要做拆分敛滋,做主從许布,以及為什么要有分布式。
推薦資源:《深入分析Java Web技術(shù)內(nèi)幕》绎晃,《大型網(wǎng)站技術(shù)架構(gòu)》
兩本都是阿里大佬出的書蜜唾,兩位都是淘寶系的技術(shù)大牛。前一本書主要講述的Java Web的一些技術(shù)基礎(chǔ)庶艾,關(guān)于Web架構(gòu)的內(nèi)容比較少袁余。
后一本則是李智慧大佬寫的架構(gòu)科普書籍,用非常簡(jiǎn)單易懂的語(yǔ)言寫出了大型Web項(xiàng)目架構(gòu)之美咱揍,分別著眼于高可用颖榜,高性能,高擴(kuò)展等方面講解了很多設(shè)計(jì)結(jié)構(gòu)的原則和方法煤裙。這本書應(yīng)該是Web架構(gòu)小白最好的入門書籍了掩完。
02 分布式理論基礎(chǔ)
由于下面的內(nèi)容或多或少都會(huì)涉及到分布式相關(guān)的知識(shí),所以這一部分我們主要介紹一下有關(guān)分布式的基礎(chǔ)知識(shí)硼砰。筆者對(duì)分布式的學(xué)習(xí)主要也停留在理論上藤为,所以這里講的也是一些理論的東西。
推薦資源:《從Paxos到zookeeper分布式一致性原理與實(shí)踐》
這本書比較好地科普了分布式基礎(chǔ)知識(shí)夺刑,也介紹了zookeeper的原理和使用缅疟。了解zookeeper是了解分布式技術(shù)很重要的一個(gè)環(huán)節(jié)。
1 CAP 和 BASE
談分布式就要談CAP遍愿,一致性存淫,高可用,網(wǎng)絡(luò)分區(qū)容忍性為何只能三選二沼填,為什么網(wǎng)絡(luò)分區(qū)容忍性必須要被考慮桅咆。CAP在實(shí)際應(yīng)用中真的可靠么?
BASE出現(xiàn)的原因坞笙,為什么BASE更容易實(shí)現(xiàn)岩饼,更適合實(shí)際應(yīng)用荚虚,BASE可以通過(guò)哪些技術(shù)去實(shí)現(xiàn)呢?
2 一致性協(xié)議和算法
一致性協(xié)議也是分布式理論的一個(gè)重點(diǎn)籍茧,2PC版述,3PC,分別指的是什么寞冯,其中分別有什么問(wèn)題渴析。3PC解決了2PC的一個(gè)問(wèn)題,卻仍然不完美吮龄。
Paxos和Raft兩種一致性算法俭茧,顯然前者比后者復(fù)雜得多,但是Raft可能更加實(shí)用漓帚。為什么我們需要一致性算法母债,它們又有什么用呢。
3 分布式事務(wù)和最終一致性
分布式事務(wù)是一個(gè)復(fù)雜的概念尝抖,主要指分布式系統(tǒng)中需要強(qiáng)一致場(chǎng)景時(shí)所用到的事務(wù)场斑。理解和實(shí)現(xiàn)它都不是簡(jiǎn)單的事情。
如果我們退而求其次牵署,不要求強(qiáng)一致性漏隐,而選擇最終一致性,則可以用更加靈活的方案奴迅,比如事務(wù)消息青责。
03 常見(jiàn)分布式技術(shù)
推薦資源:《從Paxos到zookeeper分布式一致性原理與實(shí)踐》《深入理解Spring Cloud與微服務(wù)構(gòu)建》,《分布式服務(wù)框架原理與實(shí)踐》取具。
1 zookeeper
上文說(shuō)到zookeeper是分布式技術(shù)很重要的一塊內(nèi)容脖隶,這是因?yàn)閦ookeeper用于管理和協(xié)調(diào)分布式組件,雖然它出自hadoop生態(tài)暇检,卻用于很多應(yīng)用當(dāng)中产阱,基本上有分布式的地方就有zk的存在。
簡(jiǎn)單說(shuō)來(lái)块仆,zk可以提供全局統(tǒng)一的節(jié)點(diǎn)樹結(jié)構(gòu)构蹬,通過(guò)節(jié)點(diǎn)來(lái)管理資源,同時(shí)zk自身是使用集群方式部署的悔据,所以保證自己是高可用的庄敛。根據(jù)這一特點(diǎn),它可以作為服務(wù)注冊(cè)中心科汗,還可以實(shí)現(xiàn)分布式鎖等功能藻烤。
2 分布式服務(wù)
分布式服務(wù)是一個(gè)挺有意思的東西,也很常用,簡(jiǎn)單來(lái)說(shuō)怖亭,就是把服務(wù)組件部署在不同節(jié)點(diǎn)上涎显,通過(guò)rpc的方式訪問(wèn),為了實(shí)現(xiàn)這一功能兴猩,我們需要考慮通信協(xié)議期吓,序列化方式,進(jìn)一步來(lái)說(shuō)峭跳,我們還要了解如何做服務(wù)注冊(cè)和發(fā)現(xiàn)膘婶,以及如何做限流缺前,做服務(wù)熔斷和降級(jí)蛀醉,等等等等。
常見(jiàn)的分布式服務(wù)框架有dubbo衅码,以及Spring Cloud這類產(chǎn)品拯刁,學(xué)會(huì)使用他們,然后了解它們的底層實(shí)現(xiàn)原理逝段,相信會(huì)是一個(gè)很有趣的過(guò)程垛玻。
3 負(fù)載均衡
關(guān)于負(fù)載均衡,說(shuō)起來(lái)其實(shí)很簡(jiǎn)單奶躯,就是把一組請(qǐng)求分成多組帚桩,按照某種規(guī)則分發(fā)到多臺(tái)服務(wù)器上。
但是負(fù)載均衡也涉及很多內(nèi)容嘹黔,包括負(fù)載均衡的算法账嚎,負(fù)載均衡的實(shí)現(xiàn)方式,我們需要了解它到底是在哪一層實(shí)現(xiàn)的儡蔓。
一般來(lái)說(shuō)郭蕉,常用的負(fù)載均衡方式有nginx和lvs兩種,分別是7層和4層的負(fù)載均衡喂江,一個(gè)基于域名進(jìn)行負(fù)載均衡召锈,一個(gè)基于端口號(hào)做負(fù)載均衡。了解它們的實(shí)現(xiàn)原理获询,會(huì)讓你更好地理解這部分內(nèi)容涨岁。
4 分布式session和分布式鎖
這兩個(gè)組件也是分布式項(xiàng)目中經(jīng)常要用到的,了解它們的使用和實(shí)現(xiàn)原理吉嚣,有助于以后在項(xiàng)目中的實(shí)踐卵惦。
分布式session一般有多種實(shí)現(xiàn)方式,可以存數(shù)據(jù)庫(kù)或者緩存瓦戚,也可以單獨(dú)部署成一個(gè)服務(wù)沮尿,總之最重要的一點(diǎn)就是,性能要好,并且要高可用畜疾。
分布式鎖則用于一些需要一致性的場(chǎng)景中赴邻,比如訂單生成這種全局唯一的功能,分布式鎖通撤却罚可以用緩存或者數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)姥敛,但為了保證高性能,并且避免死鎖瞎暑,我們一般采用Redis或者zookeeper來(lái)實(shí)現(xiàn)彤敛。
04 緩存
講到緩存,我們說(shuō)的最多的就是Redis了赌,所以我們要講的也是Redis墨榄。學(xué)習(xí)Redis,除了學(xué)會(huì)使用簡(jiǎn)單的api之外勿她,最好還要了解它的實(shí)現(xiàn)原理袄秩。
推薦資源:《Redis設(shè)計(jì)與實(shí)現(xiàn)》
這里我們主要介紹三部分內(nèi)容,也是我個(gè)人認(rèn)為比較重要的三塊內(nèi)容逢并。
1 數(shù)據(jù)結(jié)構(gòu)和底層實(shí)現(xiàn)
Redis的數(shù)據(jù)結(jié)構(gòu)比較豐富之剧,但更有意思的是這些數(shù)據(jù)結(jié)構(gòu)背后的底層實(shí)現(xiàn),也就是作者如何用c語(yǔ)言來(lái)實(shí)現(xiàn)這些結(jié)構(gòu)的砍聊。其中會(huì)有你熟悉的數(shù)組背稼,鏈表,還有一些有意思的結(jié)構(gòu)比如跳表玻蝌,哈希表蟹肘。
2 持久化方式
持久化方式主要分兩種,aof和rdb灶伊,前者基于追加日志的方式來(lái)實(shí)現(xiàn)日志持久化疆前,后者則是使用備份數(shù)據(jù)的方式來(lái)實(shí)現(xiàn)持久化。
3 分布式方案
這是Redis最有趣也最復(fù)雜的部分聘萨。 首先竹椒,Redis可以使用主從的方式部署,其中“哨兵”這一組件用于故障切換米辐。
基于哨兵的主從部署后來(lái)發(fā)展為Redis cluster的部署方式胸完,也就是Redis集群,通過(guò)分片的方式來(lái)部署Redis集群翘贮,并且集群中任一節(jié)點(diǎn)都可以用來(lái)對(duì)外提供服務(wù)赊窥。
當(dāng)然,除了Redis集群之外狸页,還有codis的分布式方案锨能,codis基于代理的方式來(lái)實(shí)現(xiàn)扯再,表面上還是使用原來(lái)的Redis API,但實(shí)際上訪問(wèn)的卻是一個(gè)Redis集群址遇。
05 消息隊(duì)列
消息隊(duì)列的作用一般來(lái)說(shuō)就是削峰熄阻,控流,解耦合倔约,目前業(yè)界也有很多的消息隊(duì)列產(chǎn)品秃殉,在很多公司都會(huì)使用,當(dāng)然浸剩,它們各有各的優(yōu)缺點(diǎn)钾军,我們也不必全都了解,這里我們大概介紹3種消息隊(duì)列绢要,它們各自的特點(diǎn)都比較鮮明吏恭,值得大家去了解一番。
1 RabbitMQ
筆者剛開始接觸的消息隊(duì)列是rabbitmq袖扛,它的使用方法比較簡(jiǎn)單砸泛。 RabbitMQ是一個(gè)由erlang開發(fā)的AMQP(Advanced Message Queue )的開源實(shí)現(xiàn)十籍,主要有以下特點(diǎn):
安裝部署簡(jiǎn)單蛆封,上手門檻低,功能豐富勾栗,符合AMQP標(biāo)準(zhǔn)惨篱;
企業(yè)級(jí)消息隊(duì)列,經(jīng)過(guò)大量實(shí)踐考驗(yàn)的高可靠围俘;
集群易擴(kuò)展砸讳,可以輕松的增減集群節(jié)點(diǎn);
有強(qiáng)大的WEB管理頁(yè)面界牡。
2 Kafka
與其他MQ相比較簿寂,Kafka有一些優(yōu)缺點(diǎn),主要如下
優(yōu)點(diǎn):
可擴(kuò)展宿亡。Kafka集群可以透明的擴(kuò)展常遂,增加新的服務(wù)器進(jìn)集群。
高性能挽荠。Kafka性能遠(yuǎn)超過(guò)傳統(tǒng)的ActiveMQ克胳、RabbitMQ等,Kafka支持Batch操作圈匆。
容錯(cuò)性漠另。Kafka每個(gè)Partition數(shù)據(jù)會(huì)復(fù)制到幾臺(tái)服務(wù)器,當(dāng)某個(gè)Broker失效時(shí)跃赚,Zookeeper將通知生產(chǎn)者和消費(fèi)者從而使用其他的Broker笆搓。
缺點(diǎn):
重復(fù)消息。Kafka保證每條消息至少送達(dá)一次,雖然幾率很小满败,但一條消息可能被送達(dá)多次窘奏。
消息亂序。Kafka某一個(gè)固定的Partition內(nèi)部的消息是保證有序的葫录,如果一個(gè)Topic有多個(gè)Partition着裹,partition之間的消息送達(dá)不保證有序。
復(fù)雜性米同。Kafka需要Zookeeper的支持骇扇,Topic一般需要人工創(chuàng)建,部署和維護(hù)比一般MQ成本更高面粮。
RocketMQ
RocketMQ是一個(gè)純java少孝、分布式、隊(duì)列模型的開源消息中間件熬苍,前身是Metaq稍走,當(dāng) Metaq 3.0發(fā)布時(shí),產(chǎn)品名稱改為 RocketMQ柴底。
具有以下特點(diǎn):
1婿脸、能夠保證嚴(yán)格的消息順序
2、提供豐富的消息拉取模式
3柄驻、高效的訂閱者水平擴(kuò)展能力
4狐树、實(shí)時(shí)的消息訂閱機(jī)制
5、億級(jí)消息堆積能力
除此之外鸿脓,它還有一個(gè)優(yōu)點(diǎn)抑钟,就是支持事務(wù)消息,讓分布式事務(wù)的實(shí)現(xiàn)變得簡(jiǎn)單
05 分布式數(shù)據(jù)庫(kù)
這里說(shuō)的分布式”數(shù)據(jù)庫(kù)“野哭,其實(shí)指的是數(shù)據(jù)庫(kù)的分布式方案在塔,更具體來(lái)說(shuō),主要指的是數(shù)據(jù)庫(kù)的主從部署拨黔,以及分庫(kù)蛔溃,分表。
1 主從復(fù)制和讀寫分離
這是數(shù)據(jù)庫(kù)高可用的基礎(chǔ)蓉驹。MySQL數(shù)據(jù)庫(kù)會(huì)使用日志來(lái)完成主從復(fù)制城榛,先寫主庫(kù),然后再同步到從庫(kù)态兴。讀寫分離則一般是指的是:從庫(kù)負(fù)責(zé)讀狠持,主庫(kù)負(fù)責(zé)寫。
2 分庫(kù)分表方案
分庫(kù)分表是解決大表性能瓶頸的一種方法瞻润,當(dāng)然也分為橫向拆分和縱向拆分喘垂,橫向拆分指的就是減少單表的數(shù)據(jù)量甜刻,放到其他表或者其他庫(kù)中≌眨縱向拆分則一般指按照業(yè)務(wù)來(lái)拆分得院,把不必要的字段放到其他表中。
分庫(kù)分表可以在應(yīng)用層做章贞,通過(guò)對(duì)id或者其他字段進(jìn)行hash以便映射到對(duì)應(yīng)的表中祥绞。當(dāng)然也可以通過(guò)數(shù)據(jù)庫(kù)中間件來(lái)完成,例如mycat這種中間件鸭限,通過(guò)代理的方式實(shí)現(xiàn)分庫(kù)分表蜕径,非常方便。
06 大后端相關(guān)技術(shù)
這部分的內(nèi)容筆者也只是略知一二败京,所以這里只是拋磚引玉兜喻,做一個(gè)簡(jiǎn)單的科普罷了。畢竟咱們學(xué)技術(shù)的人都是先講深度再來(lái)談廣度赡麦。當(dāng)你對(duì)之前的內(nèi)容掌握得比較好的時(shí)候朴皆,再去看看大后端的一些其他技術(shù),也會(huì)感覺(jué)挺有意思的泛粹。
下面這些技術(shù)主要是我自己學(xué)習(xí)路上接觸過(guò)的一些內(nèi)容遂铡,所以比較熟悉,才拿出來(lái)分享戚扳,至于適不適合大家的口味忧便,可能就見(jiàn)仁見(jiàn)智了族吻。
Hadoop生態(tài)
筆者之前參與過(guò)數(shù)據(jù)倉(cāng)庫(kù)相關(guān)的項(xiàng)目帽借,所以稍微了解了這方面的內(nèi)容,感覺(jué)hadoop生態(tài)還是挺有意思的超歌。
大家不妨去了解一下其中的基本組件砍艾,然后打一個(gè)集群自己玩玩看。 常見(jiàn)的組件有:hdfs巍举,hbase脆荷,hive,zookeeper懊悯,flume蜓谋,sqoop,yarn炭分。
推薦資源:《大數(shù)據(jù)技術(shù)原理與應(yīng)用》
對(duì)于入門hadoop生態(tài)來(lái)說(shuō)桃焕,這本書完全足夠了,如果你要做大數(shù)據(jù)平臺(tái)開發(fā)或者是數(shù)據(jù)研發(fā)工程師捧毛,可能需要非常全面地了解這些組件的底層原理观堂。
云計(jì)算初探
項(xiàng)目中主要接觸到的是OpenStack让网,docker以及kubenetes,OpenStack是一個(gè)私有云生態(tài)师痕,內(nèi)部結(jié)構(gòu)對(duì)于我們來(lái)說(shuō)還是比較復(fù)雜的溃睹,不過(guò)最根本的虛擬化技術(shù)還是基于kvm虛擬化來(lái)實(shí)現(xiàn)的。
docker則是現(xiàn)在非常流行的一種容器胰坟,用于快速部署應(yīng)用因篇。
kubenetes也借著docker的東風(fēng)火了起來(lái),可以理解為是基于容器的分布式調(diào)度系統(tǒng)笔横。
這些技術(shù)在企業(yè)中也是比較常用的惜犀,只不過(guò)對(duì)于研發(fā)同學(xué)來(lái)說(shuō),更多時(shí)候扮演的是工具的角色狠裹。
推薦資源:《Docker技術(shù)入門與實(shí)戰(zhàn)》虽界,《kubenetes權(quán)威指南》
其他常見(jiàn)后端技術(shù)
除此之外,想必大家還了解過(guò)很多其他的技術(shù)涛菠,只不過(guò)不同的業(yè)務(wù)用到的組件往往不一樣莉御,所以并不是每個(gè)東西你都需要去了解。
比如搜索引擎技術(shù)Lucene俗冻,基于它的兩款產(chǎn)品solr和elasticsearch礁叔,通常出現(xiàn)在需要搜索功能的項(xiàng)目中。
再比如流式計(jì)算技術(shù)迄薄,如storm和spark streaming等等琅关,通常都用于大數(shù)據(jù)部門,用作實(shí)時(shí)數(shù)據(jù)采集讥蔽。
又如ELK實(shí)現(xiàn)的分布式日志系統(tǒng)涣易,多用于分析和定位系統(tǒng)問(wèn)題,經(jīng)常會(huì)出現(xiàn)在一些比較重要的應(yīng)用當(dāng)中冶伞。
當(dāng)然新症,也有現(xiàn)在大火的人工智能,還有太多的技術(shù)我們沒(méi)機(jī)會(huì)去了解和使用响禽,我們能做的也就是在自己能力范圍內(nèi)把需要做的東西做到最好了徒爹。
所以,這些內(nèi)容并不是每一樣你都需要知道芋类,但是如果有時(shí)間去了解一下的話隆嗅,還是建議多了解一點(diǎn)的。
07 總結(jié)
總結(jié)
1 Web架構(gòu) 2 分布式基礎(chǔ)理論 3 常見(jiàn)分布式技術(shù) 4 緩存 5 消息隊(duì)列 6 數(shù)據(jù)的分布式方案 7 大后端相關(guān)技術(shù)