從更宏觀的軟件構建視角切入來總結微服務構建的最佳實踐
微服務構建進階
本節我們將從更宏觀的軟件構建視角切入來總結微服務構建的最佳實踐,宗旨是指導開發者合理地設計和構建可演進式的系統架構。
軟件構建
下圖是經過幾十年的實踐積累,研究人員給出的軟件開發過程中各種不同關鍵活動的時間順序。
上述活動獨立拿出來都可以作爲軟件工程中的主題加以討論,而 “軟件構建” 作爲軟件開發中的核心活動顯然具有更重要的地位。
軟件構建要重視代碼質量,因爲源碼是軟件唯一的精準描述和最終產物,敏捷的開發流程也強調可閱讀的代碼大於規格文檔的理念。
源碼可以增強軟件工程的可管理性,源碼的質量和可讀性是決定軟件能否持續演進的重要因素。
軟件構建使用高層架構設計指導系統的編程開發約束。高質量的架構可以使構建活動更加容易,使複雜的系統分解成爲可管理、獨立、層次化的軟件集合;而糟糕的架構設計將使你的構建活動舉步維艱、困難重重,嚴重影響系統的後期維護和擴展。下圖是我們總結的高質量架構原則。
微服務構建實踐
微服務構建傾向於使用領域驅動設計模式,從技術實現的層面遵循並實踐高質量的軟件架構原則,目標是持續快速地滿足業務需求,支撐靈活的軟件工程流程,實現成本可控及高效的價值交付。我們可以將業務目標、高質量軟件架構原則、微服務構建實踐三者的關係表述如下圖所示。
如果對微服務構建實踐從時間維度做進一步細化,我們可以將其劃分爲微服務架構定義、架構落地、規模化發展三個階段設計。在微服務架構定義階段,我們使用領域驅動設計的方法論來完成對業務的建模及服務邊界的接口定義。與傳統的基於技術實現的分層架構模式不同,領域驅動設計更加關注業務,它在實際業務場景中通過業務邊界的識別對領域服務進行界限劃分;微服務架構強調功能職責單一、圍繞業務組織團隊、輕量級的集成交互機制等特性,都與領域驅動設計模式概念高度一致、不謀而合。
在微服務架構落地階段,需要一個具備承載業務、簡單生產就緒的軟件底座技術來啓動和運行我們的業務服務,在技術選型上,Spring Boot 基於約定優於配置的編程範式,可以極大地提升軟件開發人員的工作效率。同時成熟的社區支持、廣大的開發羣體、全面完整的技術框架支撐都是 Spring Boot 成爲微服務架構落地的首選技術棧。
在微服務架構規模化發展階段,服務治理成爲解決系統複雜性、可用性、可觀測性、可靠性、容錯性、關注點分離的關鍵技術。在技術選型上,我們使用 Spring Cloud 技術生態作爲微服務的治理體系。
此外,服務集成交互機制、後端數據一致性、容器技術、持續集成、持續交付、監控治理都是微服務構建和規模化管理需要重點關注的技術領域。
微服務架構的發展趨勢是將更多的公共組件、模塊能力、橫切關注點下沉到基礎設施。軟件構建的複雜性從業務層轉移到基礎設施層,通過將業務代碼與技術架構解耦,實現業務價值的快速交付。
微服務架構反模式
前面介紹了微服務的一些好的設計模式和實踐,下面列舉一些微服務架構的反模式,這樣我們可以在微服務構建過程中更好地進行取捨。
微服務劃分粒度越小越好
微服務粒度的大小並沒有統一的業界標準,並非越小越好。服務劃分的主要依據是業務屬性,組織層級、團隊規模、代碼規模、業務複雜度都對服務粒度劃分產生影響。
內聚不相關功能服務服務必須清楚地與業務能力保持一致,不應該試圖做一些超出範圍的事。功能隔離問題對架構治理而言至關重要,否則它會破壞敏捷性、性能和可擴展性,導致創建一個緊耦合、無法擴展演進的架構。
不重視自動化
隨着微服務規模的擴大,自動化集成和交付成爲微服務交付的關鍵。微服務的目標是驅動敏捷,爲我們提供所需的自動化工具。
服務架構分層
團隊過度關注技術層面的內聚,而不是功能相關的重用。這樣會形成一個由橫向團隊管理的人造物理層,導致交付依賴。
手動配置環境
當我們創建的服務越來越多時,服務的配置管理會面臨失控的風險。大部分生產部署不順利的情況都是由於配置錯誤造成的,手動管理配置信息在微服務架構下將變得越來越困難。
未使用版本控制
在微服務的世界裏,複雜度會隨着服務數量的增加而增加。制定一個版本控制策略可以使服務的消費者輕鬆遷移,並且服務提供者可以透明地部署變更而不產生級聯影響。
缺少 API 網關
每個服務都要單獨實現鑑權、過濾等功能,正確的做法是集中管理和監控部分非功能性問題。API 網關可以編排跨功能的微服務,同時實現共享服務的複用。
服務依賴第三方系統
當服務依賴第三方系統時,服務就不是松耦合的了。要讓服務有獨立性,交付的每個服務都必須具備獨立的測試套件。
小結
領域驅動設計可以保證業務模型和代碼模型的一致性,把業務與技術複雜性分離,通過邊界劃分來控制業務的複雜性,目前微服務架構的興起帶來了實現領域驅動設計的最佳實踐環境。軟件構建過程本質上是一個複雜的過程,這種複雜性伴隨在軟件工程的整個生命週期。使用微服務架構、領域驅動的軟件建模模式可以讓我們找到這種複雜性問題的解決之道。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/jqewTfb31k0VTZO3bcxmxw