微服務如今辣麼火,業界流行的對比的卻都是所謂的Monolithic單體應用,而大量的系統在十幾年前都是已是分佈式系統了,那麼微服務做爲新的理念和原來的分佈式系統,或者說SOA(面向服務架構)是什麼區別呢?
咱們先看相同點:前端
那麼差異在哪?數據庫
微服務架構的精髓在切分編程
分佈式設計第一原則 -- 「不要分佈你的對象」
若是咱們將兩路(同步)通訊與小/微服務結合使用,並根據好比「1個類=1個服務」的原則,那麼咱們實際上回到了使用Corba、J2EE和分佈式對象的20世紀90年代。遺憾的是,新生代的開發人員沒有使用分佈式對象的經驗,所以也就沒有認識到這個主意多麼糟糕,他們正試圖重複歷史,只是此次使用了新技術,好比用HTTP取代了RMI或IIOP。
一個簡單的圖書管理系統確定無需微服務架構。既然採用了微服務架構,那麼面對的問題空間必然是比較宏大,好比整個電商、CRM。後端
如何拆解服務呢?
使用什麼樣的方法拆解服務?業界流行1個類=1個服務、1個方法=1個服務、2 Pizza團隊、2周能重寫完成等方法,可是這些都缺少實施基礎。咱們必須從一些軟件設計方法中尋找,面向對象和設計模式適用的問題空間是一個模塊,而函數式編程的理念更多的是在代碼層面的微觀上起做用。
Eric Evans 的《領域驅動設計》這本書對微服務架構有很大借鑑意義,這本書提出了一個能將一個大問題空間拆解分爲領域和實體之間的關係和行爲的技術。目前來講,這是一個最合理的解決拆分問題的方案,透過限界上下文(Bounded Context,下文簡稱爲BC)這個概念,咱們能將實現細節封裝起來,讓BC都可以實現SRP(單一職責)原則。而每一個微服務正是BC在實際世界的物理映射,符合BC思路的微服務互相獨立鬆耦合。設計模式
微服務架構是一件好事,逼着你們關注設計軟件的合理性,若是原來在Monolithic中領域分析、面向對象設計作很差,換微服務會把這個問題成倍的放大
以電商中的訂單和商品兩個領域舉例,按照DDD拆解,他們應該是兩個獨立的限界上下文,可是訂單中確定是包含商品的,若是貿然拆爲兩個BC,查詢、調用關係就耦合在一塊兒了,甚至有了麻煩的分佈式事務的問題,這個關聯如何拆解?BC理論認爲在不一樣的BC中,即便是一個術語,他的關注點也不同,在商品BC中,關注的是屬性、規格、詳情等等(實際上商品BC這個領域有價格、庫存、促銷等等,把他做爲單獨一個BC也是不合理的,這裏爲了簡化例子,你們先認爲商品BC就是商品基礎信息), 而在訂單BC中更關注商品的庫存、價格。因此在實際編碼設計中,訂單服務每每將關注的商品名稱、價格等等屬性冗餘在訂單中,這個設計解脫了和商品BC的強關聯,兩個BC能夠獨立提供服務,獨立數據存儲架構
小結
微服務架構首先要關注的不是RPC/ServiceDiscovery/Circuit Breaker這些概念,也不是Eureka/Docker/SpringCloud/Zipkin這些技術框架,而是服務的邊界、職責劃分,劃分錯誤就會陷入大量的服務間的相互調用和分佈式事務中,這種狀況微服務帶來的不是便利而是麻煩。
DDD給咱們帶來了合理的劃分手段,可是DDD的概念衆多,晦澀難以理解,如何抓住重點,合理的運用到微服務架構中呢?
我認爲以下的幾個架構思想是重中之重框架