Spring響應式微服務: Spring Boot 2 + Spring 5+Spring Cloud 實戰
鄭天民 著
2019.6出版
雲原生基礎理論
雲原生所需要的能力和特徵
The Twelve Factors
12-Factors經常被直譯爲12要素,也被稱爲12原則,描述如何利用雲平臺提供的便利來開發更具可靠性和擴展性、更加易於維護的雲原生應用。
另外還有補充的三點:
- API聲明管理
- 認證和授權
- 監控與告警
雲原生應用的三大特徵:
- 容器化封裝:
以容器爲基礎,提高整體開發水平,形成代碼和組件重用,簡化雲原生應用程序的維護。在容器中運行應用程序和進程,並作爲應用程序部署的獨立單元,實現高水平資源隔離。 - 動態管理:
通過集中式的編排調度系統來動態的管理和調度。 - 面向微服務:
明確服務間的依賴,互相解耦。
雲原生架構的原則
雲原生架構的重點是通過橫向擴展、分佈式處理,以及自動更換故障組件來實現彈性和擴展。
雲原生架構的高層次元素
- 系統的功能需求(它應該做什麼,例如“以這種格式處理訂單…”);
- 非功能性要求(如“每分鐘至少處理 200 個訂單”);
- 約束(超出變更範圍的內容,例如“訂單必須在我們現有的大型機系統上更新”)。
谷歌雲原生架構的 5 條原則
- 原則 1:自動化設計
- 原則 2:善用狀態
- 原則 3:支持託管服務
- 原則 4:深入實踐防禦
- 原則 5:架構不止
自動化雲原生系統的一些常見領域:
- 基礎設施:
使用 Google Cloud Deployment Manager 或 Terraform 之類的工具,自動創建基礎設施並對其進行更新; - 持續集成 / 持續交付(CI/CD):
使用 Google Cloud Build 、 Jenkins 和 Spinnaker 等工具自動構建、測試和部署構成系統的軟件包。不僅應該自動部署,還應該努力實現金絲雀測試和回滾等過程的自動化; - 伸縮性(Scale Up/Down):
除非系統負載幾乎從未發生變化,否則應該根據負載的增加自動擴展系統,並根據負載的持續下降進行收縮。通過擴展,可以確保服務仍然可用,並通過按比例收縮來降低成本。這對於大型應用程序(如公共網站)以及具有不規則負載的較小應用程序(例如在某些時段非常繁忙但在其他時間幾乎不使用的內部應用程序)來說是很有意義的。對於有時幾乎沒有流量並且可以容忍一些初始延遲的應用程序,甚至應該考慮將其收縮爲零(刪除所有正在運行的實例,並在下次需要時重新啓動應用程序); - 監控和自動恢復:
應該從一開始就在雲原生系統中納入監控和日誌記錄。日誌記錄和監視的數據流可以很自然地用於監視系統的運行狀況,除此之外還可以有許多用途。例如,它們可以對系統的使用和用戶的行爲(有多少人在使用系統,他們在使用什麼部分,他們的平均延遲時間是多少等)提供有價值的見解。其次,它們可以通過彙總來衡量整個系統的健康狀況(例如,磁盤又快滿了,它的填寫速度比平時快嗎?磁盤使用量和服務佔用之間的關係是什麼?等等)。最後,它們是添加自動化理想的地方,當磁盤要填滿時,可以自動調整磁盤大小以保持系統正常運行,而不僅僅只記錄錯誤。
領域驅動設計
基本概念
- 通用語言 ubiquitous language
- 限界上下文 boundary context:語義和語境上的邊界
- 子域 sub-domain
- 上下文映射 context maping
子域類型
- 核心域
- 支撐子域
- 通用子域
上下文映射的種類
- 合作關係
- 共享內核
- 客戶供應商
- 跟隨者
- 防腐層
- 開放主機服務
- 已發佈語言
- 各行其道
戰術設計
- 聚合根
- 領域事件
- 事件風暴
設計的技術維度
- 聚合 aggregate
- 領域事件 domain event
領域劃分原則
- 服務關聯度原則
- 業務能力職責單一原則
- 領域名字代表的自然語言上下文保持互相獨立
- 讀寫分離原則
- 組織關係原則
微服務劃分原則
- 垂直劃分優先原則
- 持續演進原則
- 服務自治,接口隔離原則
- 自動化驅動原則
服務拆分策略
- 前後端拆分
- 把經常變更的部分拆分
- 把公共的部分進行拆分
- 根據業務拆分
- 根據領域模型拆分
服務設計核心標準
- 服務無狀態 service statelessness
- 服務可重用 service reusability
- 服務可發現 service discoverability
- 服務自治 service autonomy
- 服務松耦合 service loose coupling
服務集成模式
- 接口集成
- RPC
- REST
- Message
- ESB
- 數據集成
- 共享數據庫 shared database
- 數據複製 Data replication
- 客戶端集成
- 外部集成
微服務核心組件
- 服務通訊
- 事件驅動
- 負載均衡
- 服務路由
- API網關
- 配置管理
服務註冊與發現
組件名 | 語言 | CAP | 一致性算法 | 服務健康檢查 | 對外暴露接口 |
---|---|---|---|---|---|
Eureka | Java | AP | 無 | 可配支持 | HTTP |
Consul | Go | CP | Raft | 支持 | HTTP/DNS |
Zookeeper | Java | CP | Paxos | 支持 | 客戶端 |
etcd | Go | CP | Raft |