Spring Cloud 微服務實戰筆記
微服務知識
傳統開發所有業務邏輯都在一個應用中, 開發,測試,部署隨着需求增加會不斷為單個項目增加不同業務模塊;前端展現也不局限於html視圖模板的形式,后端向前端支持需要更多的接口模塊。
隨着需求增多,項目變大,單體系統部署在一個進程內部,往往修改很小的功能,為了部署上線也會影響其他功能。后期維護成本會變得越來越大,難以控制。
微服務架構
中不同模塊拆分成不同服務,都能獨立部署和擴展,運行在自己的進程內,有穩定的邊界,更新也不會影響其他服務運營。而且由於是獨立部署的,可以更准確的為每個服務評估性能容量,也更容易發現系統瓶頸位置。
微服務帶來的問題
微服務架構
有如此多優點,單也因為服務的拆分引入了許多問題。
- 運維人員需要維護的進程數量增多了, 所以需要
自動化的工具
。 - 服務拆分了,但業務邏輯的依賴不會消除,只是從
單體應用的代碼依賴
變為了服務間的通信依賴
, 所以要保證接口的正確調用,需要完善的接口和版本管理工具
。 - 由於服務獨立部署在各自進程內,所以它們間通信需要考慮
網絡延遲
,分布式事務
,異步消息
,容錯性
等。
微服務實施
服務調用
在微服務架構
中通常通過兩種方式互相通信:
- 使用
HTTP
的RESTFUL API
或輕量級消息發送協議, 實現消息傳遞和服務調用的觸發 - 通過輕量級消息總線上傳消息,類似
RabbitMQ
提供可靠異步交換.
去中心化管理
在實施微服務架構時,希望每一個服務都管理其自由的數據庫,這就是數據管理的去中心化。
但隨之而來數據一致性也成了需要解決的問題直以,分布式事務
本身實現難度就非常大,所以在微服務架構中,強調在各個服務之間進行無事務
的調用,對數據一致性,只要求數據在最后處理狀態一致即刻;若在過程中發現錯誤, 通過補償機制來進行處理,使得錯誤數據能夠達到最終的 一 致性。
以下內容摘自我的
領域驅動設計(DDD:Domain-Driven Design)
筆記傳統架構,數據一般是強一致性的,我們通常會使用數據庫事務保證一次操作的所有數據修改都在一個數據庫事務里,從而保證了數據的強一致性。在分布式的場景,我們也同樣希望數據的強一致性,就是使用分布式事務。但是眾所周知,分布式事務的難度、成本是非常高的,而且采用分布式事務的系統的吞吐量都會比較低,系統的可用性也會比較低。所以,很多時候,我們也會放棄數據的強一致性,而采用最終一致性;
CQRS(Command Query Responsibility Segregation)架構 - 命令查詢的責任分離, 則完全秉持最終一致性的理念。這種架構基於一個很重要的假設,就是用戶看到的數據總是舊的。比如秒殺的場景,當你下單前,也許界面上你看到的商品數量是有的,但是當你下單的時候,系統提示商品賣完了。
容錯設計
單體應用中, 一般不存在單個組件故障而其他部件還能運行的情況,通常是一掛全掛。
在微服務架構中,當部分服務存在故障,而導致沒有返回,線程掛起等待,直到超時才能釋放。正常服務頻繁調用故障服務,導致大量線程被掛起,從而出現故障蔓延。
所以晶塊檢測出故障源並京可能自動恢復服務很關鍵。通常希望每個服務中實現監控和日志記錄,比如服務狀態,斷路器狀態,吞吐量,網絡延遲等關鍵數據的儀表盤。
思想轉變
設計服務時,需要學習領域驅動設計,細致的分出每個服務和相關邊界。
實施微服務
的團隊,每個小組都應該以做產品的方式,對服務的整個生命周期負責。
Spring Cloud 介紹
Spring Cloud
是基於Spring Boot
的微服務架構開發工具,它為微服務中涉及的配置管理
,服務治理
, 斷路器
, 智能路由
, 微代理
, 控制總線
, 全局鎖
,決策競選
,分布式會話
和集群狀態管理
等操作提供了簡單的開發方式。
常用子項目:
Spring Cloud Config
配置管理工具, 支持使用Git存儲 配置內容, 可以使用它實現應用配置的外部化存儲, 並支持客戶端配置信息刷新、 加密/ 解密配置內容 等Spring Cloud Netflix
核心組件,對多個Netflix OSS
套件進行整合Eureka
服務治理組件,包含服務注冊中心、 服務注冊與發現機制的實現。Hystrix
容錯管理組件,實現斷路器模式,幫助服務依賴中出現的延遲和為故障提供強大的容錯能力。Ribbon
客戶端負載均衡的服務調用組件。Feign
基於Ribbon
和Hystrix
的聲明式服務調用組件。Zuul
網關組件,提供智能路由,訪問過濾等功能。Archaius
外部化配置組件
Spring Cloud Bus
事件、消息總線。用於傳播集群中的狀態變化或事件, 以觸發后續的處理, 比如用來動態刷新配置等。Spring Cloud Cluster
針對ZooKeeper
,Redis
,Hazelcast
,Consul
的選舉算法和通用狀態模式的實現。Spring Cloud Consul
服務發現與配置管理工具。Spring Cloud Stream
通過Redis
,Rabbit
或Kafka
實現的消費微服務,通過簡單的聲明式模型來發送和接收消息。Spring Cloud Security
安全工具包,提供在Zuul
代理中對OAuth2
客戶端請求的中繼器。Spring Cloud Sleuth
分布式跟蹤實現,可以完美整合Zipkin
Spring Cloud ZooKeeper
服務發現與配置管理工具Spring Cloud Starters
基於Spring Boot
風格項目的基礎依賴模塊。