讀《中臺架構(gòu)與實現(xiàn)》

最早是在極客時間知道歐創(chuàng)新老師的,我也是他的課程《DDD實戰(zhàn)課》的訂閱者,后來歐老師基于這門課程做更多的實踐與思考,完成了《中臺架構(gòu)與實現(xiàn):基于 DDD 和微服務(wù)》這本書的寫作,最近剛好讀完了這本書。
中臺、微服務(wù)、DDD,這三個都是比較大的概念,每一個在市面上都有很多相關(guān)的書籍,一本書想要把三者都介紹得非常深入,不太容易,但本書很好地結(jié)合大量的案例將三者串聯(lián)起來,能夠讓我們了解更多概念性內(nèi)容之外,也能指導(dǎo)我們動手進(jìn)行實踐。
從本書的副標(biāo)題:基于 DDD 和微服務(wù),可以得知:
本書是介紹如何采用 DDD 和 微服務(wù)的方式來落地中臺的架構(gòu)和實現(xiàn),是一本偏實踐的書; DDD 和微服務(wù)是相輔相成的,至于為什么,從書中可以找到答案。
中臺最早是阿里在 2015 年提出的,具體故事是這樣的:
馬云當(dāng)時在芬蘭考察一家叫 Supercell 的游戲公司,該公司員工數(shù)不到 200,一年的利潤卻高達(dá) 15 億美金,很重要的原因就是 Supercell 公司把游戲開發(fā)中大量重復(fù)的工作整理出來,開發(fā)成工具供所有人使用,大大提高了效率。馬云深受啟發(fā),回來后便提出了中臺戰(zhàn)略。
中臺大體分為業(yè)務(wù)中臺、數(shù)據(jù)中臺和技術(shù)中臺,但其本質(zhì)都是能力的復(fù)用,說起復(fù)用,作為程序員的我們就非常熟悉了,抽取公共函數(shù)、公共類庫、自研一些中間件或者使用開源中間件,都是為了復(fù)用提高效率,這樣看來,即便我們處在中小公司,「中臺」離我們也沒那么遙遠(yuǎn)。
微服務(wù)架構(gòu)是 Martin Flower 大神在 2014 年提出,這個概念針對的是我們常見的單體應(yīng)用,是為了解決單體應(yīng)用的一些常見問題:
技術(shù)棧受限,新技術(shù)較難引進(jìn); 任何修改需整個部署,持續(xù)交付周期長; 可靠性,一個模塊的問題可能導(dǎo)致整個應(yīng)用的問題。
所以在微服務(wù)的架構(gòu)中,我們可以:
解決復(fù)雜問題,將復(fù)雜的問題分而治之; 不同的微服務(wù)可以使用不同技術(shù)棧,發(fā)揮各家之長; 獨立部署,能更快地迭代,符合敏捷的開發(fā)思想。
但,微服務(wù)也不是銀彈,帶來好處的同時,也勢必會帶來很多的問題,關(guān)于問題在后面的微服務(wù)系列再詳細(xì)來講。
而提到微服務(wù)的框架,最容易想到的就是 Spring Cloud,里面包含一堆解決微服務(wù)架構(gòu)的各種問題的組件,比如:
Eureka:服務(wù)發(fā)現(xiàn); Feign:微服務(wù)之間的遠(yuǎn)程調(diào)用; Hystrix:實現(xiàn)熔斷和限流; Zuul:服務(wù)網(wǎng)關(guān); Sleuth:鏈路追蹤; Connfig:配置中心。
在 dotNET Core 中目前還沒有比較成熟的類似 Spring Cloud 這樣的全家桶(也可能是我還不知道),但通過一些開源組件一樣能夠構(gòu)建微服務(wù)系統(tǒng):
服務(wù)發(fā)現(xiàn):Consul; 鏈路跟蹤:SkyWalking 或 Twitter 的 Zipkin 遠(yuǎn)程調(diào)用:Grpc; 熔斷和限流:Polly; 服務(wù)網(wǎng)關(guān):Ocelot; 配置中心:Apollo;
我們都知道微服務(wù)就是要將一個大的應(yīng)用進(jìn)行拆分,上面提到的組件都是解決拆分后所帶來的的問題,但具體一個復(fù)雜應(yīng)用應(yīng)該怎樣拆分,應(yīng)該按照什么粒度進(jìn)行拆分,在微服務(wù)架構(gòu)中并沒有很好的指引,這時就需要 DDD 了。
DDD 是一種架構(gòu)思想,是由著名建模專家 Eric Evans 在 2004 年提出,分為戰(zhàn)略層面和戰(zhàn)術(shù)層面,在戰(zhàn)略層面,主要講的就是如何進(jìn)行系統(tǒng)拆分。正好彌補(bǔ)了微服務(wù)的不足,所以在近些年微服務(wù)比較火熱的情況下,DDD 也煥發(fā)了第二春。
DDD 中引入了很多的名詞概念:領(lǐng)域、子域、通用域、支撐域、核心域、領(lǐng)域事件、限界上下文、聚合、聚合根、實體、值對象等。初學(xué)者光是弄懂這些概念需要花費很大的功夫,更別提使用 DDD 來進(jìn)行代碼落地了。
在本書中,有關(guān) DDD 我印象很深的就是書中使用桃樹做類比來模擬進(jìn)行領(lǐng)域的分解,將我們熟悉概念和知識類比到 DDD 中陌生的術(shù)語,可以快速地幫助我們理解 DDD 中的各種術(shù)語。
那么中臺,微服務(wù)和 DDD 又是什么關(guān)系呢?這里引用書中的一張原圖:

上面的中臺可以泛指所有的復(fù)雜業(yè)務(wù)系統(tǒng),既然是復(fù)雜系統(tǒng)就需要分而治之,怎么分?就靠 DDD 中的戰(zhàn)略層面的指導(dǎo)思想; 分解完后,再集合 DDD 戰(zhàn)術(shù)層面的思想和微服務(wù)的技術(shù)框架就能很好進(jìn)行代碼落地了。
市面上很多介紹 DDD 的書籍,即便是在講戰(zhàn)術(shù)層面,也很晦澀難懂,看完除了概念更熟悉了點之外,依然不知道怎樣進(jìn)行代碼編寫。而這正是本書的優(yōu)勢所在,除了有標(biāo)準(zhǔn)的代碼模型,還有具體示例的代碼詳解。這也是我看此書覺得比較驚喜的地方。
看完這本書,我依然不敢說我對中臺、DDD 和微服務(wù)有多深的了解,但我相信有了這本書的基礎(chǔ),再去閱讀 Eric Evans 等大神的著作,應(yīng)該能收獲更多、也會更加深入。
