![]() ![]() |
輕量級(jí)微服務(wù)架構(gòu)(上冊(cè)) ![]()
本系列從開(kāi)發(fā)與運(yùn)維兩方面分別對(duì)微服務(wù)架構(gòu)的實(shí)踐過(guò)程進(jìn)行描述,全套分為上下兩冊(cè),上冊(cè)偏重于開(kāi)發(fā),下冊(cè)偏重于運(yùn)維。在上冊(cè)中讀者會(huì)學(xué)習(xí)到微服務(wù)架構(gòu)所需的開(kāi)發(fā)技能,包括使用SpringBoot搭建微服務(wù)開(kāi)發(fā)框架,使用Node.js搭建微服務(wù)網(wǎng)關(guān),使用ZooKeeper實(shí)現(xiàn)微服務(wù)注冊(cè)與發(fā)現(xiàn),使用Docker封裝微服務(wù),使用Jenkins部署微服務(wù)。通過(guò)閱讀上冊(cè),讀者可輕松搭建一款輕量級(jí)微服務(wù)架構(gòu)。
《輕量級(jí)微服務(wù)架構(gòu)(上冊(cè))》適合對(duì)微服務(wù)實(shí)踐感興趣,以及想成為微服務(wù)架構(gòu)師的人員閱讀。
業(yè)內(nèi)專(zhuān)家聯(lián)合力薦
讓微服務(wù)落地,深入分析踐行微服務(wù)的種種要點(diǎn) 深入闡述微服務(wù)架構(gòu)體系的各種zui佳實(shí)踐
微服務(wù)是近年來(lái)備受關(guān)注的話題,它的出現(xiàn)讓我們想起了十年前的 SOA(Service-Oriented Architecture,面向服務(wù)架構(gòu)),但它比傳統(tǒng)的 SOA 更容易理解,也更容易實(shí)踐,它將“面向服務(wù)”的思想做得更加徹底。
當(dāng)國(guó)外一些知名技術(shù)公司成功實(shí)踐了微服務(wù)以后,這股熱潮就吹遍了國(guó)內(nèi)的大街小巷,大家街頭巷尾都在聊微服務(wù),對(duì)它眾說(shuō)紛紜且褒貶不一。有人說(shuō)它非常好,但就是“玩不起”,為何會(huì)這樣呢? 我們不妨帶著這個(gè)問(wèn)題來(lái)簡(jiǎn)單介紹一下,究竟什么才是微服務(wù)。 微服務(wù)是一種分布式系統(tǒng)架構(gòu),它建議我們將業(yè)務(wù)切分為更加細(xì)粒度的服務(wù),并使每個(gè)服務(wù)的責(zé)任單一且可獨(dú)立部署,服務(wù)內(nèi)部高內(nèi)聚,隱含內(nèi)部細(xì)節(jié),服務(wù)之間低耦合,彼此相互隔離。此外,我們根據(jù)面向服務(wù)的業(yè)務(wù)領(lǐng)域來(lái)建模,對(duì)外提供統(tǒng)一的 API 接口。微服務(wù)的思想不只是停留在開(kāi)發(fā)階段,它貫穿于設(shè)計(jì)、開(kāi)發(fā)、測(cè)試、部署、運(yùn)維等軟件生命周期階段。 可見(jiàn),我們提到的微服務(wù),實(shí)際上是一種架構(gòu)思想,我們不妨稱(chēng)它為“微服務(wù)架構(gòu)”。 微服務(wù)架構(gòu)看起來(lái)如此之好,我們真的就需要它嗎? 微服務(wù)架構(gòu)建議我們按照業(yè)務(wù)來(lái)切分服務(wù),我們完全可以選擇最合適的技術(shù)來(lái)實(shí)現(xiàn)具體的服務(wù),只需確保對(duì)外提供的 API 接口保持一致即可,也就是說(shuō),微服務(wù)架構(gòu)使我們技術(shù)選型的自由度更加寬廣了。既然系統(tǒng)可拆分為多個(gè)服務(wù),這樣非常有利于我們對(duì)每個(gè)服務(wù)進(jìn)行監(jiān)控,可不斷收集每個(gè)服務(wù)的性能指標(biāo)數(shù)據(jù),當(dāng)某個(gè)服務(wù)出現(xiàn)性能瓶頸時(shí),會(huì)發(fā)出預(yù)警,我們可隨時(shí)水平地?cái)U(kuò)展該服務(wù),以支撐更大的流量,而不至于復(fù)制整個(gè)系統(tǒng)。由于服務(wù)之間彼此隔離,相互之間不會(huì)產(chǎn)生影響,因此我們可借助技術(shù)的手段來(lái)實(shí)現(xiàn)自動(dòng)化部署,這會(huì)使我們的部署過(guò)程變得更加高效。 其實(shí)微服務(wù)架構(gòu)的優(yōu)點(diǎn)數(shù)不勝數(shù),但是大家可能還是不敢用,因?yàn)樗鼘?duì)我們的技術(shù)要求具有一定的挑戰(zhàn)。比如,我們需要一個(gè)自動(dòng)化部署系統(tǒng),也需要解決分布式系統(tǒng)帶來(lái)的一系列問(wèn)題,還需要服務(wù)之間能做到彼此隔離且互不影響,同時(shí)還不能影響通信過(guò)程中所帶來(lái)的性能開(kāi)銷(xiāo)。因此很多人認(rèn)為,只有大公司或強(qiáng)悍的技術(shù)團(tuán)隊(duì)才能玩得起微服務(wù)架構(gòu),自己只能“遠(yuǎn)觀”卻不能“近玩”。甚至還有人認(rèn)為,微服務(wù)架構(gòu)實(shí)際上就是以前談?wù)摱嗄甓y以落地的 SOA。 實(shí)際上,我們認(rèn)為微服務(wù)架構(gòu)的本質(zhì)仍然符合 SOA 思想,只不過(guò)它比 SOA 更容易落地。為了證明這件事情,我們經(jīng)過(guò)了大量的實(shí)踐,借助了許多優(yōu)秀的開(kāi)源技術(shù),搭建了一款“輕量級(jí)微服務(wù)架構(gòu)”。實(shí)踐證明,該架構(gòu)不僅可以適應(yīng)大中型公司的業(yè)務(wù)變化,還能滿足中小型公司的快速增長(zhǎng)。我們真心地希望這款輕量級(jí)微服務(wù)架構(gòu)能夠幫助更多的技術(shù)愛(ài)好者以及更多的技術(shù)團(tuán)隊(duì),順利地走出技術(shù)困境,以全新的視角去迎接新的挑戰(zhàn)。 不得不提醒大家的是:微服務(wù)并不是萬(wàn)靈丹!它不能包治百病,我們更不要為了微服務(wù)而去微服務(wù)。而是需要根據(jù)自身的情況,靈活地選擇最合適的技術(shù),通過(guò)技術(shù)的手段實(shí)現(xiàn)更高的目標(biāo)。 為什么寫(xiě)這本書(shū)? 我一直很關(guān)注服務(wù)化方面的技術(shù),記得在 2014 年,我偶然發(fā)現(xiàn)國(guó)外技術(shù)博客中有人在寫(xiě)關(guān)于“微服務(wù)”方面的概念與技術(shù)。坦白地講,當(dāng)我第一次看到微服務(wù)時(shí),并沒(méi)有對(duì)它產(chǎn)生濃厚的興趣,我當(dāng)時(shí)認(rèn)為微服務(wù)是笨重的,它和傳統(tǒng)的 SOA 沒(méi)有太大的區(qū)別,同樣都是服務(wù)化,只不過(guò)微服務(wù)更加細(xì)粒度而已。直到 Docker 容器技術(shù)逐步成熟起來(lái),越來(lái)越多的人開(kāi)始使用Docker 來(lái)封裝應(yīng)用程序,并借助 Docker 技術(shù)讓軟件交付變得更加靈活而高效,這讓我不由地對(duì)微服務(wù)的未來(lái)產(chǎn)生了強(qiáng)烈的期待,我堅(jiān)信微服務(wù)將伴隨著 Docker 技術(shù)成為未來(lái)軟件開(kāi)發(fā)與運(yùn)維的核心武器。 我開(kāi)始瘋狂地學(xué)習(xí)微服務(wù),研究它的各種架構(gòu)模式與應(yīng)用領(lǐng)域,開(kāi)始自己動(dòng)手做一些練習(xí),并在公司內(nèi)部大力推廣這種新架構(gòu)。在實(shí)踐中,我獲得了一點(diǎn)收獲,曾在一些技術(shù)大會(huì)與企業(yè)內(nèi)訓(xùn)中講過(guò)微服務(wù)的原理與實(shí)踐。我發(fā)現(xiàn)一個(gè)問(wèn)題,雖然大家對(duì)微服務(wù)都非常關(guān)注,但往往卻不知應(yīng)該如何開(kāi)始,應(yīng)該使用哪些技術(shù)來(lái)搭建微服務(wù)架構(gòu),以及在實(shí)踐中應(yīng)該如何避免掉進(jìn)坑里。甚至有些人還認(rèn)為微服務(wù)只是大公司才玩得起的東西,因?yàn)樗枰柚?SOA 那樣重量級(jí)的基礎(chǔ)設(shè)施,需要付出大量的成本,但收益卻不一定。其實(shí),我想告訴大家的是,微服務(wù)架構(gòu)并非這樣,它應(yīng)該是輕量級(jí)的,它應(yīng)該是很容易上手的,它應(yīng)該是任何公司想用就敢用的。雖然國(guó)內(nèi)外已經(jīng)有幾本關(guān)于微服務(wù)方面的好書(shū)了,但我仍然希望這本書(shū)能為大家在微服務(wù)實(shí)踐方面帶來(lái)微薄的價(jià)值。 我們可以把微服務(wù)架構(gòu)想象成海面上的一座冰山,看得見(jiàn)的部分是開(kāi)發(fā),看不見(jiàn)的部分是運(yùn)維,一個(gè)好的微服務(wù)架構(gòu)需要同時(shí)關(guān)注開(kāi)發(fā)和運(yùn)維兩個(gè)方面。本系列書(shū)分上下兩冊(cè),上冊(cè)偏開(kāi)發(fā),下冊(cè)偏運(yùn)維。 您適合看這本書(shū)嗎? 如果您還沒(méi)聽(tīng)說(shuō)過(guò)微服務(wù),或者您聽(tīng)說(shuō)了但不知道它究竟是什么,或者您正在嘗試微服務(wù)的實(shí)踐,那么這本書(shū)就非常適合您。不管您是一名開(kāi)發(fā)人員還是一名運(yùn)維人員,如果您向往成為一名優(yōu)秀的微服務(wù)架構(gòu)師,那么這本書(shū)更加值得您反復(fù)閱讀和實(shí)踐。 本書(shū)是如何組織的? 第1 章:微服務(wù)架構(gòu)設(shè)計(jì)概述。 從為什么需要微服務(wù)架構(gòu)開(kāi)始講起,接著描述微服務(wù)架構(gòu)是什么,以及微服務(wù)架構(gòu)有哪些特點(diǎn),最后以如何搭建微服務(wù)架構(gòu)來(lái)結(jié)束本章。本章是全書(shū)的概述,從一個(gè)宏觀的視角來(lái)講解微服務(wù),為后續(xù)章節(jié)搭建了一個(gè)骨架。 第2 章:微服務(wù)開(kāi)發(fā)框架。 本章我們將使用流行的 Spring Boot 來(lái)搭建微服務(wù)開(kāi)發(fā)框架,對(duì) Spring Boot 是什么,以及如何使用 Spring Boot 都做了描述,此外還對(duì) Spring Boot 的重要產(chǎn)品級(jí)特性做了相關(guān)介紹。通過(guò)學(xué)習(xí)本章,大家可掌握 Spring Boot 的基本使用方法,并具備開(kāi)發(fā)微服務(wù)接口的技能。 第3 章:微服務(wù)網(wǎng)關(guān)。 本章我們將學(xué)習(xí) Node.js 技術(shù),描述 Node.js 是什么,以及如何使用 Node.js,此外還對(duì)Node.js 的重要高級(jí)特性做了補(bǔ)充。最后我們將使用 Node.js 搭建一個(gè)微服務(wù)網(wǎng)關(guān)基礎(chǔ)框架,后續(xù)章節(jié)會(huì)對(duì)此框架進(jìn)行擴(kuò)展。 第4 章:微服務(wù)注冊(cè)與發(fā)現(xiàn)。 本章我們將學(xué)習(xí) ZooKeeper 框架,從認(rèn)識(shí) ZooKeeper 開(kāi)始,到如何使用 ZooKeeper。最后我們將使用 ZooKeeper 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的服務(wù)注冊(cè)組件,并結(jié)合第3 章中介紹的微服務(wù)網(wǎng)關(guān)框架,使用 Node.js 實(shí)現(xiàn)一個(gè)服務(wù)發(fā)現(xiàn)組件。 第5 章:微服務(wù)封裝。 本章我們將學(xué)習(xí) Docker 技術(shù),從了解 Docker 是什么開(kāi)始,到如何使用 Docker,并通過(guò)手工和Dockerfile 的方式構(gòu)建 Docker 鏡像,此外還會(huì)介紹 Docker Registry 的使用方法,最后將以 Spring Boot 與 Docker 做一個(gè)整合來(lái)結(jié)束本章。通過(guò)學(xué)習(xí)本章,大家可熟練使用 Docker,為后續(xù)自動(dòng)化運(yùn)維提供基礎(chǔ)。 第6 章:微服務(wù)部署。 本章是上冊(cè)的最后一章,我們將使用 Gitlab 管理項(xiàng)目源碼,使用 Jenkins 搭建持續(xù)集成系統(tǒng),最后基于 Jenkins + Gitlab + Docker 搭建一款微服務(wù)的自動(dòng)化部署平臺(tái)。通過(guò)學(xué)習(xí)本章,大家可將開(kāi)發(fā)與部署更加高效地銜接起來(lái)。 我要致謝的人 我要把這本書(shū)送給我的女兒,雖然她根本就看不懂,因?yàn)樗挥腥龤q。記得在她剛出生那年,我開(kāi)始寫(xiě)技術(shù)博客;在她一歲那年,我開(kāi)始做開(kāi)源項(xiàng)目;在她兩歲那年,我開(kāi)始寫(xiě)自己的第一本書(shū);在她三歲之時(shí),這本書(shū)出版了。為了自己的事業(yè),我借用了陪伴她成長(zhǎng)的時(shí)間,這個(gè)時(shí)間是我這輩子都無(wú)法償還給她的,希望她長(zhǎng)大后能看到我送給她的這本書(shū),或許她會(huì)理解我現(xiàn)在所做的一切。 我最想感謝的人還是我的妻子,她為了料理家務(wù)和照顧女兒,選擇放棄自己的事業(yè),全力支持我的事業(yè),這種“放棄自己,成全他人”的精神,我是無(wú)法做到的。我有這樣的好妻子,讓我感到無(wú)比驕傲,同時(shí)我也需要給自己更高的目標(biāo),回報(bào)她對(duì)我的付出。 十年前我離開(kāi)自己的家鄉(xiāng),獨(dú)自來(lái)到上海打拼,這些年很少陪伴在自己父母的身邊,因?yàn)楣ぷ魈Χz忘了對(duì)父母的問(wèn)候,我很愧疚自己所做的一切。感謝我的父母對(duì)我的無(wú)私付出,以及對(duì)我事業(yè)的認(rèn)可與鼓勵(lì),希望他們看到這本書(shū)后能為我感到高興。 感謝與我一起創(chuàng)業(yè)的伙伴們,大家能在一起共事是一種緣分,他們?cè)诠ぷ魃辖o我提供了許多幫助,和他們一起工作是我最開(kāi)心的事情,我也能感受到自己在成長(zhǎng)。他們還為本書(shū)提供了專(zhuān)業(yè)的建議,以及為本書(shū)提供了大量寶貴的實(shí)踐經(jīng)驗(yàn)。 感謝電子工業(yè)出版社博文視點(diǎn)的陳曉猛編輯,在寫(xiě)作過(guò)程中曉猛多次鼓勵(lì)我,他曾說(shuō)“寫(xiě)書(shū)就是登山”,每當(dāng)我寫(xiě)不動(dòng)了,想放棄了,他就會(huì)鼓勵(lì)我“快到山頂了”,他無(wú)形中成為了我的“鼓勵(lì)師”,讓我順利地寫(xiě)完了這本書(shū)。 感謝為這本書(shū)做評(píng)審的專(zhuān)家們,他們的專(zhuān)業(yè)態(tài)度讓我非常感動(dòng)。為了給讀者提供更多的價(jià)值,他們給我提供了大量的建議,這些建議對(duì)我的幫助非常大,讓我在后續(xù)寫(xiě)作道路上更有經(jīng)驗(yàn)了。 感謝一直支持我的讀者們,沒(méi)有你們一路的陪伴,我會(huì)失去寫(xiě)作的動(dòng)力和方向。 最后我想說(shuō)的是:我并不是微服務(wù)架構(gòu)專(zhuān)家,我只是一名微服務(wù)架構(gòu)的實(shí)踐者,只想把自己實(shí)踐的經(jīng)驗(yàn)分享給大家。由于本人學(xué)識(shí)有限,難免會(huì)有不足之處,還請(qǐng)讀者不吝賜教。 黃勇 2016 年7 月27 日于上海
黃勇,現(xiàn)任特贊公司 CTO,曾任阿里巴巴公司系統(tǒng)架構(gòu)師。對(duì)微服務(wù)架構(gòu)與大數(shù)據(jù)技術(shù)有深入研究,具有豐富的網(wǎng)站架構(gòu)設(shè)計(jì)經(jīng)驗(yàn)與項(xiàng)目管理經(jīng)驗(yàn),擅長(zhǎng)敏捷開(kāi)發(fā)模式。國(guó)內(nèi)開(kāi)源軟件推動(dòng)者之一,活躍于“開(kāi)源中國(guó)”社區(qū)網(wǎng)站,Smart 開(kāi)源框架創(chuàng)始人,圖書(shū)《架構(gòu)探險(xiǎn):從零開(kāi)始寫(xiě)Java Web框架》作者。熱愛(ài)技術(shù)交流,樂(lè)于分享自己的工作經(jīng)驗(yàn)與生活感悟。
第1章 微服務(wù)架構(gòu)設(shè)計(jì)概述
1.1 為什么需要微服務(wù)架構(gòu) 1.1.1 傳統(tǒng)應(yīng)用架構(gòu)的問(wèn)題 1.1.2 如何解決傳統(tǒng)應(yīng)用架構(gòu)的問(wèn)題 1.1.3 傳統(tǒng)應(yīng)用架構(gòu)還有哪些問(wèn)題 1.2 微服務(wù)架構(gòu)是什么 1.2.1 微服務(wù)架構(gòu)概念 1.2.2 微服務(wù)交付流程 1.2.3 微服務(wù)開(kāi)發(fā)規(guī)范 1.2.4 微服務(wù)架構(gòu)模式 1.3 微服務(wù)架構(gòu)有哪些特點(diǎn)和挑戰(zhàn) 1.3.1 微服務(wù)架構(gòu)的特點(diǎn) 1.3.2 微服務(wù)架構(gòu)的挑戰(zhàn) 1.4 如何搭建微服務(wù)架構(gòu) 1.4.1 微服務(wù)架構(gòu)圖 1.4.2 微服務(wù)技術(shù)選型 1.5 本章小結(jié) 第2章 微服務(wù)開(kāi)發(fā)框架 2.1 Spring Boot 是什么 2.1.1 Spring Boot的由來(lái) 2.1.2 Spring Boot的特性 2.1.3 Spring Boot相關(guān)插件 2.1.4 Spring Boot的應(yīng)用場(chǎng)景 2.2 如何使用Spring Boot框架 2.2.1 搭建Spring Boot開(kāi)發(fā)框架 2.2.2 開(kāi)發(fā)一個(gè)簡(jiǎn)單的Spring Boot應(yīng)用程序 2.2.3 運(yùn)行Spring Boot應(yīng)用程序 2.3 Spring Boot生產(chǎn)級(jí)特性 2.3.1 端點(diǎn) 2.3.2 健康檢查 2.3.3 應(yīng)用基本信息 2.3.4 跨域 2.3.5 外部配置 2.3.6 遠(yuǎn)程監(jiān)控 2.4 本章小結(jié) 第3章 微服務(wù)網(wǎng)關(guān) 3.1 Node.js是什么 3.1.1 Node.js快速入門(mén) 3.1.2 Node.js應(yīng)用場(chǎng)景 3.2 如何使用Node.js 3.2.1 安裝Node.js 3.2.2 使用Node.js開(kāi)發(fā) Web應(yīng)用 3.2.3 使用Express框架開(kāi)發(fā)Web應(yīng)用 3.2.4 搭建Node.js集群環(huán)境 3.3 使用Node.js搭建微服務(wù)網(wǎng)關(guān) 3.3.1 什么是微服務(wù)網(wǎng)關(guān) 3.3.2 使用Node.js實(shí)現(xiàn)反向代理 3.4 本章小結(jié) 第4章 微服務(wù)注冊(cè)與發(fā)現(xiàn) 4.1 ZooKeeper是什么 4.1.1 ZooKeeper樹(shù)狀模型 4.1.2 ZooKeeper集群結(jié)構(gòu) 4.2 如何使用ZooKeeper 4.2.1 運(yùn)行ZooKeeper 4.2.2 搭建ZooKeeper集群環(huán)境 4.2.3 使用命令行客戶端連接ZooKeeper 4.2.4 使用Java客戶端連接ZooKeeper 4.2.5 使用Node.js客戶端連接ZooKeeper 4.3 實(shí)現(xiàn)服務(wù)注冊(cè)組件 4.3.1 設(shè)計(jì)服務(wù)注冊(cè)表數(shù)據(jù)結(jié)構(gòu) 4.3.2 搭建應(yīng)用程序框架 4.3.3 定義服務(wù)注冊(cè)表接口 4.3.4 使用ZooKeeper實(shí)現(xiàn)服務(wù)注冊(cè) 4.3.5 服務(wù)注冊(cè)模式 4.4 實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)組件 4.4.1 定義服務(wù)發(fā)現(xiàn)策略 4.4.2 搭建應(yīng)用程序框架 4.4.3 使用Node.js實(shí)現(xiàn)服務(wù)發(fā)現(xiàn) 4.4.4 服務(wù)發(fā)現(xiàn)優(yōu)化方案 4.4.5 服務(wù)發(fā)現(xiàn)模式 4.5 本章小結(jié) 第5章 微服務(wù)封裝 5.1 Docker是什么 5.1.1 Docker簡(jiǎn)介 5.1.2 虛擬機(jī)與Docker對(duì)比 5.1.3 Docker的特點(diǎn) 5.1.4 Docker系統(tǒng)架構(gòu) 5.1.5 安裝Docker 5.2 如何使用Docker 5.2.1 Docker鏡像常用操作 5.2.2 Docker容器常用操作 5.2.3 Docker命令匯總 5.3 手工制作Java鏡像 5.3.1 下載JDK 5.3.2 啟動(dòng)容器 5.3.3 提交鏡像 5.3.4 驗(yàn)證鏡像 5.4 使用Dockerfile構(gòu)建鏡像 5.4.1 了解Dockerfile基本結(jié)構(gòu) 5.4.2 使用Dockerfile構(gòu)建鏡像 5.4.3 Dockerfile指令匯總 5.5 使用Docker Registry管理鏡像 5.5.1 使用Docker Hub 5.5.2 搭建Docker Registry 5.6 Spring Boot與Docker整合 5.6.1 搭建Spring Boot應(yīng)用程序框架 5.6.2 為Spring Boot應(yīng)用添加Dockerfile 5.6.3 使用Maven構(gòu)建Docker鏡像 5.6.4 啟動(dòng)Spring Boot的Docker容器 5.6.5 調(diào)整Docker容器內(nèi)存限制 5.7 本章小結(jié) 第6章 微服務(wù)部署 6.1 Jenkins是什么 6.1.1 Jenkins簡(jiǎn)介 6.1.2 自動(dòng)化發(fā)布平臺(tái) 6.1.3 安裝Jenkins 6.2 搭建GitLab版本控制系統(tǒng) 6.2.1 GitLab簡(jiǎn)介 6.2.2 安裝GitLab 6.2.3 將代碼推送至GitLab中 6.3 搭建Jenkins持續(xù)集成系統(tǒng) 6.3.1 創(chuàng)建構(gòu)建任務(wù) 6.3.2 手工執(zhí)行構(gòu)建 6.3.3 自動(dòng)執(zhí)行構(gòu)建 6.4 使用Jenkins實(shí)現(xiàn)自動(dòng)化發(fā)布 6.4.1 自動(dòng)發(fā)布jar包 6.4.2 自動(dòng)發(fā)布Docker容器 6.5 本章小結(jié)
序一
微服務(wù),應(yīng)用開(kāi)發(fā)的新起點(diǎn) 研究現(xiàn)在的軟件體系,不難發(fā)現(xiàn):現(xiàn)在的軟件專(zhuān)家們?nèi)孕枰c大量的需求、設(shè)計(jì)、代碼的細(xì)節(jié)打交道。出于項(xiàng)目實(shí)施時(shí)間、投入資源等方面的限制,軟件往往以實(shí)現(xiàn)若干具體的用戶功能需求為目標(biāo)。專(zhuān)家們沒(méi)有時(shí)間,也沒(méi)有精力去追求軟件的美學(xué)目標(biāo)。日復(fù)一日,隨著用戶功能需求的變化,軟件項(xiàng)目成為大量代碼的隨機(jī)而無(wú)序的堆積,奇丑無(wú)比。許多功能成一旦完成項(xiàng)目,就恐避之不及,不愿再去碰自己幾個(gè)月來(lái)夜以繼日的勞動(dòng)成果。 黃勇的《架構(gòu)探險(xiǎn):輕量級(jí)微服務(wù)架構(gòu)》一書(shū),融合了軟件設(shè)計(jì)的最新理念,系統(tǒng)性介紹了微服務(wù)的設(shè)計(jì)、開(kāi)發(fā)、運(yùn)維等各方面,書(shū)中不僅僅是技術(shù)的描述和講解?吹近S勇在技術(shù)方面這么多年的不斷積累和提煉,我很欣慰。 微服務(wù)的興起和移動(dòng)應(yīng)用的快速發(fā)展相對(duì)應(yīng)。移動(dòng)應(yīng)用的基本框架是事件和響應(yīng),用戶在碎片化的時(shí)間和地點(diǎn),按自己的節(jié)奏完成綜合起來(lái)是一個(gè)復(fù)雜的事情。這不同于傳統(tǒng)軟件,往往是流程和復(fù)雜業(yè)務(wù)驅(qū)動(dòng)的過(guò)程和算法。移動(dòng)計(jì)算所需要的跨界溝通和協(xié)作,在傳統(tǒng)應(yīng)用架構(gòu)中則很難實(shí)現(xiàn),而這恰恰是微服務(wù)的優(yōu)勢(shì)所在。微服務(wù)從技術(shù)的視角,使用各種協(xié)議和框架,便于不同開(kāi)發(fā)者軟件碎片之間的協(xié)同工作。但是各種軟件交互協(xié)議并不稀缺,總是不斷地出現(xiàn)各種協(xié)議的標(biāo)準(zhǔn)。微服務(wù)的成功使用,需要注意微服務(wù)在軟件重用方面的能力,正是這種能力,使得微服務(wù)的使用更加具有普遍的意義。不同于傳統(tǒng)的構(gòu)件或服務(wù),微服務(wù)的調(diào)用參數(shù)接口具有更大的融合性和靈活性。微服務(wù)的調(diào)用,不需要拘泥于嚴(yán)格的數(shù)據(jù)類(lèi)型,而是遵循更高層次的語(yǔ)法結(jié)構(gòu)。特別是應(yīng)用軟件走向人工智能的時(shí)代,微服務(wù)將更深的演化帶來(lái)更智能的微服務(wù)對(duì)接。微服務(wù)對(duì)于傳統(tǒng)的過(guò)程式軟件,是一個(gè)破壞性的改變。這一特征既給了微服務(wù)無(wú)限的想象空間,也給實(shí)施帶來(lái)了很多挑戰(zhàn)。并不是每個(gè)應(yīng)用,特別是成熟領(lǐng)域的軟件應(yīng)用都適合微服務(wù)的改造。但是對(duì)于移動(dòng)應(yīng)用領(lǐng)域和跨應(yīng)用跨企業(yè)的對(duì)接,是一個(gè)很必要的選擇。 我早年寫(xiě)了一些關(guān)于 SOA 和“面向構(gòu)件”方面的東西,有人問(wèn)我:“SOA和微服務(wù)有何差異?”我認(rèn)為:SOA 的核心還是企業(yè)級(jí)應(yīng)用。最大的差異,是微服務(wù)對(duì)于調(diào)用參數(shù)的宏定義,語(yǔ)義的適應(yīng)性,使得微服務(wù)的復(fù)用性大大提升。比較有意思的是,新的微服務(wù)調(diào)用參數(shù)體系,和普元EOS非常類(lèi)同,15年前我們就是這樣設(shè)計(jì)的。微服務(wù)是SOA后的一個(gè)突破性的東西,不是簡(jiǎn)單的落地,SOA 本身也有落地,比如普元的EOS就是SOA落地后的產(chǎn)品。SOA到微服務(wù)一方面是網(wǎng)絡(luò)協(xié)議的提升,更加適應(yīng)跨應(yīng)用跨企業(yè)的服務(wù)調(diào)用。還有人問(wèn)我:“構(gòu)件和微服務(wù)到底有什么區(qū)別?”我認(rèn)為:構(gòu)件是裝配、開(kāi)發(fā)的視角,一臺(tái)機(jī)器由一個(gè)個(gè)構(gòu)件裝配而成;服務(wù)是運(yùn)行、傳動(dòng)的視角,能量從活塞到輪胎傳播。微服務(wù)用代碼來(lái)開(kāi)發(fā),但微服務(wù)可以當(dāng)成一個(gè)構(gòu)件裝配到應(yīng)用。兩邊視角不同,但是微服務(wù)給了軟件模塊更多生命力。構(gòu)件是靜態(tài)的,服務(wù)是動(dòng)態(tài)的。 這本書(shū)對(duì)于微服務(wù)架構(gòu)的介紹非常完整,如果你和你們的企業(yè)正在開(kāi)發(fā)移動(dòng)應(yīng)用,或者對(duì)已有的應(yīng)用正在規(guī)劃架構(gòu)性的重構(gòu),這本書(shū)很值得一讀。 黃柳青 序二 微服務(wù),我們?nèi)绾闻c你相處 微服務(wù)來(lái)了,有了“服務(wù)”這兩個(gè)字,這注定又是個(gè)一說(shuō)就明白、一舉例就糊涂、一討論就吵架的概念。微服務(wù)的出現(xiàn)有其必然的商業(yè)背景和架構(gòu)哲學(xué),如何更好地認(rèn)識(shí)微服務(wù)的內(nèi)涵、如臂使指地應(yīng)用微服務(wù)架構(gòu),還是有著很多挑戰(zhàn)的,這也許就是本書(shū)被命名為“架構(gòu)探險(xiǎn)”的原因。 企業(yè)數(shù)字化轉(zhuǎn)型驅(qū)動(dòng)架構(gòu)升級(jí) 互聯(lián)網(wǎng)經(jīng)濟(jì)深刻改變了我們身邊的商業(yè)環(huán)境,消費(fèi)者的生活方式日益數(shù)字化,人們可以在任何時(shí)間、任何地點(diǎn)利用線上、線下渠道體驗(yàn)無(wú)縫購(gòu)物,運(yùn)用社交媒體表達(dá)自我,企業(yè)也在運(yùn)用多種技術(shù)手段,發(fā)揮數(shù)字化潛力,改善客戶聯(lián)系,促進(jìn)企業(yè)業(yè)務(wù)模式的轉(zhuǎn)型。Gartner認(rèn)為,數(shù)字化就是把人、事、物和商業(yè)聯(lián)系起來(lái),建立新的商業(yè)模式。未來(lái)的企業(yè)都將是IT企業(yè),IT將從后臺(tái)走向前臺(tái),從ERP、CRM等內(nèi)部流程優(yōu)化為主的業(yè)務(wù),逐步轉(zhuǎn)向內(nèi)外兼修的模式,從而實(shí)現(xiàn)商業(yè)創(chuàng)新。 這一變化要求IT架構(gòu)更加靈活地與上下游企業(yè)協(xié)作,更加快速地響應(yīng)客戶的個(gè)性化需求,更加彈性地應(yīng)對(duì)無(wú)時(shí)不在的客戶請(qǐng)求并提供良好的客戶體驗(yàn),同時(shí)云計(jì)算、大數(shù)據(jù)等技術(shù)的出現(xiàn)也為上述改變提供了新的技術(shù)選擇,我們正面臨B/S多層架構(gòu)出現(xiàn)后新的一次架構(gòu)升級(jí),而微服務(wù)架構(gòu)就在這個(gè)架構(gòu)升級(jí)過(guò)程中應(yīng)運(yùn)而生。 分而治之的哲學(xué)是微服務(wù)的理論基礎(chǔ) 把大的問(wèn)題分解為容易解決的小問(wèn)題,找到小問(wèn)題的解決辦法,再來(lái)解決大問(wèn)題,這就是分而治之的哲學(xué)。正如萬(wàn)事萬(wàn)物由分子、原子組成一樣,軟件也可以分解為基本單元,以這樣的基本單元進(jìn)行開(kāi)發(fā)、測(cè)試、維護(hù),是解決大規(guī)模系統(tǒng)建設(shè)的思路。分而治之首先要解決如何分的問(wèn)題,企業(yè)軟件的分法應(yīng)該是以業(yè)務(wù)驅(qū)動(dòng)的,而不是以技術(shù)驅(qū)動(dòng)的,也就是分解為獨(dú)立的業(yè)務(wù)邏輯,而這樣的不可再分的業(yè)務(wù)邏輯就是微服務(wù)。 凡事有一利必有一弊,細(xì)分為微服務(wù)后,勢(shì)必帶來(lái)部署、測(cè)試、信息集成難度的提高,分而治之除了“分”,還需要“治”。傳統(tǒng)恐龍型ERP是一個(gè)面向組織的軟件,完備、復(fù)雜、響應(yīng)變化慢,適合業(yè)務(wù)穩(wěn)定的情況,而在數(shù)字化時(shí)代,客戶個(gè)性化的要求讓我們從這種面向組織的軟件逐漸演變?yōu)槊嫦騻(gè)體的軟件。例如,從前的EHR軟件是為人力資源部門(mén)服務(wù)的,整體開(kāi)發(fā)、整體實(shí)施,而現(xiàn)在我們會(huì)從個(gè)體的角度規(guī)劃軟件,可以先從招聘專(zhuān)員開(kāi)始做一個(gè)面試管理的流程,逐步推出新的流程,完善現(xiàn)有的流程。這些面向個(gè)體的流程就是微應(yīng)用,企業(yè)應(yīng)用將由無(wú)數(shù)個(gè)微應(yīng)用組成。微服務(wù)則是一個(gè)技術(shù)概念,能更好地解決微應(yīng)用的技術(shù)實(shí)現(xiàn)問(wèn)題,是一個(gè)事物的不同側(cè)面,所謂“橫看成嶺側(cè)成峰,遠(yuǎn)近高低各不同”,微服務(wù)和微應(yīng)用是事物的一體兩面。正因?yàn)槲⒎⻊?wù)實(shí)際就是一個(gè)業(yè)務(wù)邏輯,因此做好微服務(wù)需要從微應(yīng)用的維度考慮,將分解開(kāi)的邏輯形成一個(gè)整體,要從多渠道接入、客戶體驗(yàn)、數(shù)據(jù)管理、應(yīng)用交付、運(yùn)維全方位的視角考慮,這就是分而治之中實(shí)現(xiàn)“治”的體驗(yàn),也是微服務(wù)架構(gòu)需要解決的問(wèn)題。 站在SOA的肩膀上踐行微服務(wù) 微服務(wù)是一個(gè)新概念,但這絕不是一個(gè)全新架構(gòu),更不是一個(gè)包治百病的架構(gòu)。由于有服務(wù)二字,很容易讓人聯(lián)想到面向服務(wù)架構(gòu)(SOA),其實(shí)微服務(wù)架構(gòu)屬于應(yīng)用技術(shù)架構(gòu),和以 B/S 為代表的三層架構(gòu)相對(duì)應(yīng),強(qiáng)調(diào)將巨石型應(yīng)用拆分為由微服務(wù)組成的應(yīng)用,在數(shù)據(jù)上也視情況從集中的存儲(chǔ)拆解為更小的存儲(chǔ)單元。而SOA屬于企業(yè)架構(gòu)的范疇,從企業(yè)架構(gòu)出發(fā)把業(yè)務(wù)分解為不同領(lǐng)域的服務(wù),不同物理系統(tǒng)提供不同服務(wù),注重系統(tǒng)之間通過(guò)服務(wù)互聯(lián)互通的規(guī)范,對(duì)服務(wù)如何實(shí)現(xiàn)并不關(guān)注。因此,面向服務(wù)架構(gòu)的服務(wù)應(yīng)該是一個(gè)業(yè)務(wù)意義的服務(wù),而微服務(wù)是系統(tǒng)中的技術(shù)服務(wù),更關(guān)注服務(wù)的實(shí)現(xiàn),雖然提供了業(yè)務(wù)意義的服務(wù),但是不能混為一談。微服務(wù)使用也不是無(wú)限度的,事實(shí)上由于數(shù)據(jù)一致性等問(wèn)題的限制,不能無(wú)限度拆分微服務(wù),可以把微服務(wù)分為系統(tǒng)對(duì)外提供的遠(yuǎn)程服務(wù)、系統(tǒng)內(nèi)部的遠(yuǎn)程服務(wù)和系統(tǒng)內(nèi)部的本地服務(wù),顯式聲明、明確職責(zé)。事實(shí)上,在企業(yè)架構(gòu)上使用 SOA 支撐業(yè)務(wù),而在應(yīng)用技術(shù)架構(gòu)上使用微服務(wù)架構(gòu),是一個(gè)合適的選擇。 黃柳青博士是我和黃勇共同的導(dǎo)師,他在2004年所著的《軟件的涅槃》一書(shū)中指出:“互聯(lián)網(wǎng)時(shí)代的企業(yè)應(yīng)用定義,正發(fā)生革命性的變化…橫向的部門(mén)互動(dòng)、實(shí)時(shí)的企業(yè)間互動(dòng)、多樣的交互渠道、靈活的業(yè)務(wù)規(guī)則,使得原有意義上的獨(dú)立應(yīng)用不復(fù)存在…對(duì)軟件設(shè)計(jì)者來(lái)說(shuō),能直觀地分割并具有最小內(nèi)部耦合的軟件結(jié)構(gòu)是簡(jiǎn)約之美…美的軟件是軟件企業(yè)與軟件開(kāi)發(fā)者的終極目標(biāo)”,那時(shí)候他把這種全新的軟件生產(chǎn)模式稱(chēng)為“面向構(gòu)件”;仡^看來(lái),微服務(wù)正是“面向構(gòu)件”在數(shù)字化時(shí)代的解讀,用微服務(wù)架構(gòu)實(shí)現(xiàn)軟件之美,加速企業(yè)數(shù)字化轉(zhuǎn)型。 焦烈焱,普元CTO
你還可能感興趣
我要評(píng)論
|