一 柳沙、微服務(wù)概覽
微服務(wù)———SOA的一種實踐蔓罚。
- 小即是美:小的服務(wù)代碼少,bug也少,易測試,易維護(hù),也更容易不斷迭代完善的精致進(jìn)而美妙。
- 單一職責(zé):一個服務(wù)也只需要做好一件事,專注才能做好寥殖。
- 盡可能早地創(chuàng)建原型:盡可能早的提供服務(wù)AP,建立服務(wù)契約,達(dá)成服務(wù)間溝通的一致性約定,至于實現(xiàn)和完善可以慢慢再做宙暇。
- 可移植性比效率更重要:服務(wù)間的輕量級交互協(xié)議在效率和可移植性二者間,首要依然考慮兼容性和移植性。
1. 微服務(wù)定義
- 原子服務(wù)
- 獨立進(jìn)程
- 隔離部署
- 去中心化服務(wù)治理
缺點:
- 基礎(chǔ)設(shè)施的建設(shè)备绽、復(fù)雜度高
2. 微服務(wù)不足
- 微服務(wù)應(yīng)用是分布式系統(tǒng)券坞,由此會帶來固有的復(fù)雜性。開發(fā)者不得不使用 RPC 或者消息傳遞肺素,來實現(xiàn)進(jìn)程間通信恨锚;此外,必須要寫代碼來處理消息傳遞中速度過慢或者服務(wù)不可用等局部失效問題倍靡。
- 分區(qū)的數(shù)據(jù)庫架構(gòu)猴伶,同時更新多個業(yè)務(wù)主體的事務(wù)很普遍。這種事務(wù)對于單體式應(yīng)用來說很容易,因為只有一個數(shù)據(jù)庫他挎。在微服務(wù)架構(gòu)應(yīng)用中筝尾,需要更新不同服務(wù)所使用的不同的數(shù)據(jù)庫,從而對開發(fā)者提出了更高的要求和挑戰(zhàn)雇盖。
- 測試一個基于微服務(wù)架構(gòu)的應(yīng)用也是很復(fù)雜的任務(wù)忿等。
- 服務(wù)模塊間的依賴,應(yīng)用的升級有可能會波及多個服務(wù)模塊的修改崔挖。
- 對運維基礎(chǔ)設(shè)施的挑戰(zhàn)比較大贸街。
3. 按業(yè)務(wù)組織服務(wù)
大前端(移動/Web) =》 網(wǎng)關(guān)接入 =》業(yè)務(wù)服務(wù) =》平臺服務(wù) =》基礎(chǔ)設(shè)施(PaaS/Saas) 開發(fā)團(tuán)隊對軟件在生產(chǎn)環(huán)境的運行負(fù)全部責(zé)任
4.去中心化
- 數(shù)據(jù)去中心化
- 治理去中心化
- 技術(shù)去中心化
5.基礎(chǔ)設(shè)施自動化
- CICD:Gitlab + Gitlab Hooks + k8s
- Testing:測試環(huán)境、單元測試狸相、API自動化測試
- 在線運行時:k8s薛匪,以及一系列 Prometheus、ELK脓鹃、Conrtol Panle
6.可用性 & 兼容性設(shè)計
- 隔離
- 超時控制
- 負(fù)載保護(hù)
- 限流
- 降級
- 重試
- 負(fù)載均衡
Be conservative in what you send, be liberal in what you accept. 發(fā)送時要保守逸尖,接收時要開放。按照伯斯塔爾法則的思想來設(shè)計和實現(xiàn)服務(wù)時瘸右,發(fā)送的數(shù)據(jù)要更保守娇跟,意味著最小化的傳送必要的信息,接收時更開放意味著要最大限度的容忍冗余數(shù)據(jù)太颤,保證兼容性苞俘。
二 、微服務(wù)設(shè)計
1. API Gateway
2. Mircoservice 劃分
- Business Capability 由公司內(nèi)部不同部門提供的職能龄章。例如客戶服務(wù)部門提供客戶服務(wù)的職能吃谣,財務(wù)部門提供財務(wù)相關(guān)的職能。
- Bounded Context 限界上下文是 DDD 中用來劃分不同業(yè)務(wù)邊界的元素做裙,這里業(yè)務(wù)邊界的含義是“解決不同業(yè)務(wù)問題”的問題域和對應(yīng)的解決方案域岗憋,為了解決某種類型的業(yè)務(wù)問題,貼近領(lǐng)域知識锚贱,也就是業(yè)務(wù)仔戈。
CQRS,將應(yīng)用程序分為兩部分:命令端和查詢端拧廊。命令端處理程序創(chuàng)建杂穷,更新和刪除請求,并在數(shù)據(jù)更改時發(fā)出事件卦绣。查詢端通過針對一個或多個物化視圖執(zhí)行查詢來處理查詢耐量,這些物化視圖通過訂閱數(shù)據(jù)更改時發(fā)出的事件流而保持最新。 在稿件服務(wù)演進(jìn)過程中滤港,我們發(fā)現(xiàn)圍繞著創(chuàng)作稿件廊蜒、審核稿件趴拧、最終發(fā)布稿件有大量的邏輯揉在一塊,其中稿件本身的狀態(tài)也有非常多種山叮,但是最終前臺用戶只關(guān)注稿件能否查看著榴,我們依賴稿件數(shù)據(jù)庫 binlog 以及訂閱 binlog 的中間件 canal,將我們的稿件結(jié)果發(fā)布到消息隊列 kafka 中屁倔,最終消費數(shù)據(jù)獨立組建一個稿件查閱結(jié)果數(shù)據(jù)庫脑又,并對外提供一個獨立查詢服務(wù),來拆分復(fù)雜架構(gòu)和業(yè)務(wù)锐借。