鳳凰架構(gòu),牛了牛了!(文末送書)
大家好,這里是 Java建設(shè)者,歡迎你關(guān)注我最新一期的文章,這篇文章給大家介紹一本近期非常硬核的書籍,作者是我們大家都熟悉的周老師。
周志明老師的《深入理解Java虛擬機(jī)》想必大家都不陌生,這本書憑借著生動(dòng)易懂的文風(fēng)、系統(tǒng)實(shí)用的知識(shí)點(diǎn)、成為原創(chuàng)計(jì)算機(jī)圖書經(jīng)典中的經(jīng)典。周老師憑借一己之力拉高了 Java 開發(fā)者內(nèi)功水平,把 JVM 帶到了初級(jí)面試題環(huán)節(jié)。如今周志明老師的開源項(xiàng)目《鳳凰架構(gòu)》紙質(zhì)書已正式出版,這是一本從架構(gòu)視角講解如何構(gòu)建大型分布式系統(tǒng)的著作,是作者多年架構(gòu)和研發(fā)經(jīng)驗(yàn)的總結(jié),相信本書必將成為原創(chuàng)計(jì)算機(jī)圖書領(lǐng)域的又一座豐碑。
小編在這里斗膽預(yù)測(cè):以后的面試題中關(guān)于架構(gòu)方向的問題估計(jì)都會(huì)在這本書中找到答案。。。
架構(gòu)模式的每一次演進(jìn)都是鳳凰涅槃
系統(tǒng)架構(gòu)的每一次迭代都是浴火重生
構(gòu)成系統(tǒng)的每一個(gè)部件都是一只不死鳥
構(gòu)成大規(guī)模系統(tǒng)的每一個(gè)部件都可以是不可靠的,會(huì)出錯(cuò),會(huì)老朽,甚至是消亡,如何讓不可靠部件構(gòu)成的系統(tǒng)持續(xù)保持可靠性,本書將給你答案:
《鳳凰架構(gòu):構(gòu)建可靠的大型分布式系統(tǒng)》
超級(jí)暢銷書《深入理解Java虛擬機(jī)》作者周志明最新力作,國(guó)內(nèi)多位架構(gòu)專家聯(lián)袂推薦,從架構(gòu)演進(jìn)、架構(gòu)設(shè)計(jì)思維、分布式技術(shù)、不可變基礎(chǔ)設(shè)施、技術(shù)方法論5個(gè)維度全面探索如何構(gòu)建可靠的大型分布式系統(tǒng)。

本書也在全網(wǎng)得到了極大的關(guān)注,看過的都說好:

部分豆瓣讀者反饋

上市即登當(dāng)當(dāng)新書榜Top1
“Phoenix”(鳳凰)這個(gè)詞在東方的技術(shù)書中不常用,但在西方的軟件工程讀物中,尤其是在關(guān)于敏捷、DevOps話題的作品中時(shí)常出現(xiàn)。軟件工程小說《鳳凰項(xiàng)目》講述了徘徊在死亡邊緣的鳳凰項(xiàng)目在精益方法下浴火重生的故事;Martin Fowler在詮釋“持續(xù)交付”時(shí),曾多次提到“Phoenix Server”(鳳凰服務(wù)器,取其能夠“涅槃重生”之意)與“Snowflake Server”(雪花服務(wù)器,取其“世界上沒有相同的兩片雪花”之意)的優(yōu)劣比對(duì)。也許是東西方文化的差異,盡管有“失敗是成功之母”這樣的諺語,但我們東方人的骨子里更注重的還是一次把事做對(duì)、做好,盡量別出亂子;而西方人則要“更看得開”一些,把出錯(cuò)看作正常甚至是必需的發(fā)展過程,只要出了問題能夠兜底使其重回正軌便好。
在軟件工程里,任何產(chǎn)品的研發(fā),如果持續(xù)時(shí)間很長(zhǎng),人總免不了疏忽、犯錯(cuò),導(dǎo)致代碼存在缺陷,電腦宕機(jī)崩潰,網(wǎng)絡(luò)堵塞中斷……如果一項(xiàng)工程需要大量的人員共同研發(fā)某個(gè)大規(guī)模的軟件產(chǎn)品,并使其分布在網(wǎng)絡(luò)中的大量的服務(wù)器節(jié)點(diǎn)中同時(shí)運(yùn)行,隨著項(xiàng)目規(guī)模增大、運(yùn)作時(shí)間變長(zhǎng),其必然會(huì)受到墨菲定律的無情打擊。
為了得到高質(zhì)量的軟件產(chǎn)品,我們是應(yīng)該把精力更多地集中在提升其中每一個(gè)人員、過程、產(chǎn)出物的能力和質(zhì)量上?還是應(yīng)該把更多精力放在整體流程和架構(gòu)上?
筆者對(duì)這個(gè)問題先給一個(gè)“和稀泥”式的回答:這兩者都重要。前者重術(shù),后者重道;前者更多與編碼能力相關(guān),后者更多與軟件架構(gòu)相關(guān);前者主要由開發(fā)者個(gè)體的水平?jīng)Q定,后者主要由技術(shù)決策者的水平?jīng)Q定。
然而,筆者也必須強(qiáng)調(diào)此問題的另外一面:這兩者的理解路徑和抽象程度是不一樣的。如何學(xué)習(xí)一項(xiàng)具體的語言、框架、工具,譬如Java、Spring、Vue.js等,是相對(duì)具象的,不論其蘊(yùn)含的內(nèi)容多少,復(fù)雜程度高低,它至少是能看得見、摸得著的。而如何學(xué)習(xí)某一種風(fēng)格的架構(gòu)方法,譬如單體、微服務(wù)、服務(wù)網(wǎng)格、無服務(wù)、云原生等,則是相對(duì)抽象的,談?wù)撍鼈兛赡芤媾R“一千個(gè)人眼中有一千個(gè)哈姆雷特”的困境。談這方面的話題,若要言之有物,就不能是單純的經(jīng)驗(yàn)陳述?;氐竭@些架構(gòu)根本的出發(fā)點(diǎn)和問題上,筆者認(rèn)為,真正去使用這些不同風(fēng)格的架構(gòu)方法來實(shí)現(xiàn)某些需求,解決某些問題,然后在實(shí)踐中觀察它們的異同優(yōu)劣,會(huì)是一種很好的也許是最好的講述方式。筆者想說一下這些架構(gòu),而且想說得透徹明白,就需要代碼與文字的配合,于是便有了這本書,以及與它配套的實(shí)踐項(xiàng)目。
可靠的系統(tǒng)
讓我們?cè)賮硭伎家粋€(gè)問題,構(gòu)建一個(gè)大規(guī)模但依然可靠的軟件系統(tǒng),是否可行?
這個(gè)問題聽起來的第一感覺也許會(huì)有點(diǎn)荒謬。如果這個(gè)事情從理論上來說就是根本不可能的,那我們這些軟件開發(fā)人員在瞎忙活些什么?但你再仔細(xì)想想,前面才提到的“墨菲定律”和在“大規(guī)模”這個(gè)前提下必然會(huì)遇到各種“不靠譜”的人員、代碼、硬件、網(wǎng)絡(luò)等因素,從中能得出一個(gè)聽起來頗為合理的推論:如果一項(xiàng)工作要經(jīng)過多個(gè)“不靠譜”的過程相互協(xié)作完成,其中的誤差應(yīng)會(huì)不斷累積疊加,導(dǎo)致最終結(jié)果必然不能收斂穩(wěn)定。
這個(gè)問題也并非杞人憂天、庸人自擾式的瞎操心,計(jì)算機(jī)之父馮·諾依曼在20世紀(jì)40年代末期,曾經(jīng)花費(fèi)大約兩年時(shí)間,研究這個(gè)問題并且得出了一個(gè)理論—自復(fù)制自動(dòng)機(jī)(Self-Reproducing Automata)。這個(gè)理論以機(jī)器應(yīng)該如何從基本的部件中構(gòu)造出與自身相同的另一臺(tái)機(jī)器引出,其目的并不是想單純地模擬或者理解生物體的自我復(fù)制,也并不是想簡(jiǎn)單地制造自我復(fù)制的計(jì)算機(jī),而是想回答一個(gè)理論問題:如何用一些“不可靠”部件構(gòu)造出一個(gè)可靠的系統(tǒng)。

當(dāng)時(shí)自復(fù)制自動(dòng)機(jī)的藝術(shù)表示(圖片來自維基百科)
自復(fù)制自動(dòng)機(jī)恰好就是一個(gè)最好的用“不可靠”部件構(gòu)造可靠系統(tǒng)的例子。這里,“不可靠”部件可以理解為構(gòu)成生命的大量細(xì)胞,甚至是分子。由于熱力學(xué)擾動(dòng)、生物復(fù)制差錯(cuò)等因素干擾,這些分子本身并不可靠。但是生命系統(tǒng)之所以可靠,恰是因?yàn)樗梢允褂谩安豢煽俊辈考硗瓿蛇z傳迭代。這其中的關(guān)鍵點(diǎn)便是承認(rèn)細(xì)胞等零部件可能會(huì)出錯(cuò),某個(gè)具體的零部件可能會(huì)崩潰消亡,但在存續(xù)生命的微生態(tài)系統(tǒng)中其后代一定會(huì)出現(xiàn),重新代替該零部件,實(shí)現(xiàn)它的作用,以維持系統(tǒng)的整體穩(wěn)定。在這個(gè)微生態(tài)里,每一個(gè)部件都可以看作一只“不死鳥”(Phoenix),它會(huì)老邁,又能涅槃重生。
架構(gòu)的演進(jìn)
從大型機(jī)(Mainframe)、原始分布式(Distributed)、大型單體(Monolithic)、面向服務(wù)(Service-Oriented)、微服務(wù)(Microservice)、服務(wù)網(wǎng)格(Service Mesh)到無服務(wù)(Serverless)等,技術(shù)架構(gòu)確實(shí)呈現(xiàn)出“從大到小”的發(fā)展趨勢(shì)。近年來,自微服務(wù)興起以后,涌現(xiàn)出各類文章去總結(jié)、贊美微服務(wù)帶來的種種好處,諸如簡(jiǎn)化部署、邏輯拆分更清晰、便于技術(shù)異構(gòu)、易于伸縮拓展以提供更高的性能等,這些當(dāng)然都是重要優(yōu)點(diǎn)和動(dòng)力。可是,如果不拘泥于特定系統(tǒng)或特定某個(gè)問題,以更宏觀的角度來看,前面所列的種種好處都只能算是“錦上添花”,是屬于讓系統(tǒng)“活得更好”的動(dòng)因,肯定比不上系統(tǒng)如何“確保生存”的需求更關(guān)鍵、更貼近本質(zhì)。在筆者看來,架構(gòu)演變最重要的驅(qū)動(dòng)力,或者說這種“從大到小”的變化趨勢(shì)的最根本驅(qū)動(dòng)力,始終都是為了方便某個(gè)服務(wù)能夠順利地“死去”與“重生”。個(gè)體服務(wù)的生死更迭,是關(guān)系到整個(gè)系統(tǒng)能否可靠存續(xù)的關(guān)鍵因素。
舉個(gè)例子,某企業(yè)中應(yīng)用的單體架構(gòu)的Java系統(tǒng),其更新、升級(jí)都必須要有固定的停機(jī)計(jì)劃,必須在特定的時(shí)間窗口內(nèi)才能按時(shí)開始,且必須按時(shí)結(jié)束。如果出現(xiàn)了非計(jì)劃的宕機(jī),那便是生產(chǎn)事故。但是軟件的缺陷不會(huì)遵循定下的停機(jī)計(jì)劃來“安排時(shí)間出錯(cuò)”。為了應(yīng)對(duì)缺陷與變化,做到不停機(jī)地檢修,Java曾經(jīng)制定了OSGi和JVMTI Instrumentation等復(fù)雜的HotSwap方案,以實(shí)現(xiàn)“給奔跑中的汽車更換輪胎”這種匪夷所思卻又無可奈何的需求。而在微服務(wù)架構(gòu)的視角下,所謂系統(tǒng)檢修,不過只是一次在線服務(wù)更新而已,先停掉1/3的機(jī)器,升級(jí)新的軟件版本,再有條不紊地導(dǎo)流、測(cè)試、做金絲雀發(fā)布,一切都顯得如此理所當(dāng)然、平淡尋常。在無服務(wù)架構(gòu)的視角下,我們甚至都不需要關(guān)心服務(wù)所運(yùn)行的基礎(chǔ)設(shè)施,連機(jī)器是哪臺(tái)都不必知道,停機(jī)升級(jí)就更無須關(guān)注了。
流水不腐。有老朽,有消亡,有重生,有更迭,才是生態(tài)運(yùn)行的合理規(guī)律。設(shè)想一下,如果你的系統(tǒng)中的每個(gè)部件都符合“Phoenix”的特性,哪怕其中某些部件采用了由“極不靠譜”的人員所開發(fā)的“極不靠譜”的程序,哪怕存在嚴(yán)重的內(nèi)存泄漏問題,哪怕最多只能服務(wù)三分鐘就會(huì)崩潰,只要在整體架構(gòu)設(shè)計(jì)有恰當(dāng)且自動(dòng)化的錯(cuò)誤熔斷、服務(wù)淘汰和重建機(jī)制,從系統(tǒng)外部來觀察,架構(gòu)仍然有可能表現(xiàn)出穩(wěn)定和健壯的服務(wù)能力。
鳳凰架構(gòu)
在企業(yè)軟件開發(fā)的歷史中,一項(xiàng)新技術(shù)發(fā)布時(shí),常有伴以該技術(shù)開發(fā)的“寵物店”(PetStore)作為演示的傳統(tǒng)(如J2EE PetStore、.NET PetShop、Spring PetClinic等)。在對(duì)不同架構(gòu)風(fēng)格的演示中,筆者本也希望能遵循此傳統(tǒng),卻無奈從來沒養(yǎng)過寵物,遂改行開了書店(Fenix’s Bookstore),里面出售了幾本筆者的著作,算是夾帶一點(diǎn)私貨,同時(shí)也避免了使用素材時(shí)的版權(quán)隱患。
盡管相信沒有人會(huì)誤解,但筆者最后還是多強(qiáng)調(diào)一句,Oracle、Microsoft、Pivotal等公司設(shè)計(jì)“寵物店”的目的絕不是為了日后能在網(wǎng)上販賣“寵物”,而是純粹為了演示技術(shù)。所以也請(qǐng)勿以“實(shí)現(xiàn)這種學(xué)生畢業(yè)設(shè)計(jì)復(fù)雜度的需求,引入如此規(guī)模的架構(gòu)或框架,純屬大炮打蒼蠅,肯定是過度設(shè)計(jì)”的眼光來看待接下來的“Fenix’s Bookstore”項(xiàng)目。相反,如果可能的話,筆者會(huì)在有新的技術(shù)、框架發(fā)布時(shí),持續(xù)更新,以恰當(dāng)?shù)男问教砑拥巾?xiàng)目的不同版本中,其技術(shù)??赡茉絹碓綇?fù)雜。筆者希望把這些新的、不斷發(fā)展的知識(shí),融入已有的知識(shí)框架之中,便于自己學(xué)習(xí)、理解、思考,同時(shí)能將這些技術(shù)連同自己的觀點(diǎn)和看法分享給更多感興趣的人。
也算是緣分,網(wǎng)名“IcyFenix”是二十多年前筆者從中學(xué)時(shí)代開始使用的,它源自暴雪公司的即時(shí)戰(zhàn)略游戲《星際爭(zhēng)霸》的Protoss英雄Fenix。如名字預(yù)示的那樣,他曾經(jīng)是Zealot,犧牲后以Dragoon的形式重生,帶領(lǐng)Protoss與刀鋒女王Kerrigan繼續(xù)抗?fàn)?。盡管中學(xué)時(shí)期我已經(jīng)篤定自己未來肯定會(huì)從事信息技術(shù)相關(guān)的工作,但顯然不可能預(yù)計(jì)到二十年后我會(huì)寫下這些文字。
所以,既然我們要開始一段關(guān)于“Phoenix”的代碼與故事,那便叫它“鳳凰架構(gòu)”,如何?
這是一本從架構(gòu)視角講解如何構(gòu)建大型分布式系統(tǒng)的著作,是超級(jí)暢銷書《深入理解Java虛擬機(jī)》的作者周志明多年架構(gòu)和研發(fā)經(jīng)驗(yàn)的總結(jié),得到了多位行業(yè)資深架構(gòu)專家的聯(lián)袂推薦。全書共16章,分為演進(jìn)中的架構(gòu)、架構(gòu)師的視角、分布式的基石、不可變基礎(chǔ)設(shè)施和技術(shù)方法論五部分。
第一部分?演進(jìn)中的架構(gòu)(第1章)
著重介紹了軟件開發(fā)歷史中多種主流架構(gòu)風(fēng)格出現(xiàn)的契機(jī)、解決的問題以及帶來的新缺陷。
第二部分?架構(gòu)師的視角(第2~5章)
總結(jié)了一名架構(gòu)師應(yīng)該在架構(gòu)設(shè)計(jì)時(shí)思考哪些問題,有哪些主流的解決方案和行業(yè)標(biāo)準(zhǔn)做法,各種方案有什么優(yōu)缺點(diǎn),不同的解決方法會(huì)帶來什么不同的影響,等等。
第三部分?分布式的基石(第6~10章)
重點(diǎn)討論了“不同架構(gòu)風(fēng)格是應(yīng)該在技術(shù)規(guī)范上統(tǒng)一,還是由應(yīng)用系統(tǒng)自行解決”這個(gè)問題,給出了解決思路、方法和常見工具。
第四部分?不可變基礎(chǔ)設(shè)施(第11~15章)
重點(diǎn)講解了基礎(chǔ)設(shè)施不變性的目的、原理與實(shí)現(xiàn)途徑,包括虛擬化容器、容器間網(wǎng)絡(luò)、持久化存儲(chǔ)、資源與調(diào)度、服務(wù)網(wǎng)格等內(nèi)容。
第五部分?技術(shù)方法論(第16章)
面向技術(shù)決策者集中討論了與分布式、微服務(wù)、架構(gòu)等相關(guān)的理論話題,將解決問題的能力歸納、總結(jié)、升華為方法論。
全書以實(shí)踐為導(dǎo)向,一個(gè)案例貫穿全書,同時(shí)給出了基于Spring Boot、Spring Cloud、Kubernetes、Istio、AWS Lambda 五種架構(gòu)風(fēng)格的樣例工程。
重點(diǎn)來了,如何獲取這本書呢?你需要點(diǎn)贊 + 在看這篇文章,并在這篇文章下面留言,我會(huì)選取點(diǎn)贊量最高的 4 位小伙伴送書這本書籍。截止時(shí)間在 8 月 8 號(hào)早 12 點(diǎn)哦!
另外,感謝華章的贊助,這本書大家也可以在當(dāng)當(dāng)買到???
點(diǎn)擊閱讀全文購買
