- 微服務架構深度解析:原理、實踐與進階
- 王佩華編著
- 4160字
- 2021-07-07 16:03:54
1.1 微服務架構介紹
1.1.1 背景介紹
目前不僅各大互聯網公司已經在大規模地應用微服務架構,而且傳統行業也逐漸接受了這種架構模式,紛紛開始采用微服務架構構建業務系統。為什么微服務架構會如此受歡迎?微服務架構是設計而來還是演變而來的呢?要了解這些問題,我們需要從現代經濟模式和企業組織架構入手來了解微服務架構崛起的時代背景。
Niels Pflaeging在Organize for Complexity一書中通過“浴缸曲線”(見下圖)將西方從20世紀到現在的經濟模式劃分為三個時代:本地市場和用戶定制化的“手工藝時代”;通過機械規模化提升效率和比拼成本,市場廣闊而缺乏競爭的“泰勒工業時代”;以知識工人為主體,新興行業涌現、施壓,從而帶來市場需求快速變化的“全球經濟時代”。

在“手工藝時代”,產品的價值創造完全取決于掌握技藝的手工藝者,局部市場、高度動態化、定制化是這個時代的特點,但這種模式很難做到規模化地生產和持續地輸出價值。在“泰勒工業時代”,主流的組織是上傳下達的“命令控制型”組織,更適合簡單、重復的規模化生產,但這種組織架構的不足是對市場響應慢,在應對復雜變化方面十分脆弱。而在“全球經濟時代”,由新興行業帶領,逐漸興起更多扁平或分散的復雜的自適應組織,這種架構模式更加傾向于跨職能混搭和協作,和市場直接對接,可以快速靈活地響應市場變化。
可以說,組織、系統架構和技術之間隱含著映射關系。從組織所采用的技術棧和架構特征可以快速推斷出組織的業務模式和組織架構方式。單體架構、垂直架構、集中式數據庫常見于泰勒型組織;而云計算、微服務、DevOps等技術更加適合于復雜的自適應組織。同時,技術架構反過來也受限于強勢的組織架構和企業管理文化約束。
回顧早期的軟件系統,企業采用單體架構可以快速滿足業務的簡單訴求,然而隨著項目規模的擴大、業務模塊的耦合、組織人員的膨脹,使得單體架構冗余而數量龐大的代碼越來越無法適應企業靈活應對變化的需求,大量緊耦合的代碼導致應用的模塊界限日益模糊,業務發展急需匹配高可用、可擴展、隔離性好、復用性強的應用系統架構,而傳統的單體架構顯然無法滿足企業的需求。
在Microservice Pattens一書中,作者使用餐飲應用FTGO(Food to Go)舉例,說明了系統是如何一步步走向單體地獄的。系統的過度復雜使得業務邏輯耦合、開發速度緩慢、交付周期長、難以擴展,這給開發人員帶來了極大的挫折感,生產效率也隨之大幅下降。單體架構在運行狀態下,出現故障難以隔離,局部異常問題往往會影響整個系統的正常運行,最終導致整體服務的不可用,給業務人員造成的收入損失、給客戶造成的糟糕體驗都讓人無法忍受。
正是在這樣的時代背景和業務訴求下,微服務架構成為了解決復雜問題的靈丹妙藥。微服務架構在應對需求的變化、容錯處理、服務復用及擴展、提升開發效率、簡化交互等方面都有明顯的優勢。同時,敏捷、DevOps、持續集成/持續交付、容器技術、Spring Cloud框架、輕量級服務、領域驅動設計等的涌現也為微服務架構的發展奠定了基礎。
綜上所述,持續快速響應市場、高度動態化、應對復雜場景的能力已經成為企業的核心競爭力,企業越來越需要一個能夠面對變化、并且能夠主動擁抱變化的軟件架構,而微服務架構正是在這樣的時代大背景下逐漸發展壯大起來的。
1.1.2 微服務的定義
微服務并沒有一個明確的官方定義,它可以解釋為一種架構編程思維,更多地被描述為一種架構風格。微服務架構的概念可以說來源于技術專家多年的工作積累和最佳實踐總結,是通過不斷發展、演進逐漸形成的。
架構演進論
在“技術雷達”里,微服務最早以“Micro-service”,而非“MicroService”出現,從架構演進的角度來說,微服務是從SOA(Services Oriented Architecture,面向服務架構)發展演進而來的,是更先進的細粒度的SOA實現方式。
SOA和微服務本質上都是分布式的架構模式,但是傳統的基于ESB(Enterprise Service Bus,企業服務總線)的SOA架構和微服務架構要解決的問題其實并不相同。在J2EE(Java 2 Platform Enterprise Edition,Java企業級應用平臺)的企業架構中,ESB在異構系統的集成方面發揮功能。而微服務架構更多地采用輕量級的通信協議,圍繞業務進行服務拆分、解耦、復用、隔離,實現細粒度的分布式服務構建和管理。
微服務架構對傳統SOA架構最大的改變是強化端點(Endpoints)和弱化通道(Dumb Pipe),拋棄了ESB過度復雜的業務規則、編排、消息路由等功能。微服務強調服務的自治性,服務應用從一開始就可以獨立地進行開發和演進。另外,微服務間的通信應盡可能地輕量化,微服務在SOA的基礎上更加關注細粒度服務的獨立性、可擴展性、伸縮性和容錯性等。
最佳實踐論
微服務的另外一種定義來源于架構大師們多年的最佳實踐總結,Martin Fowler于2014年在他自己的博文中首次提出微服務的定義,概括總結如下:
“微服務架構”是一種將單個應用程序作為一套小型服務開發的方法,服務之間相互協調、互相配合,每個服務運行在其獨立的進程中,并以輕量級機制(通常采用HTTP協議)進行交互通信。這些服務是圍繞業務功能構建的,它們可以通過全自動部署機制進行獨立部署。微服務采用去中心化的管理理念、可以用不同的編程語言編寫,并使用不同的數據存儲技術。總結起來微服務有以下幾大特征:
● 通過服務組件化。
● 圍繞業務能力組織。
● 是產品不是項目。
● 智能端點和啞管道。
● 去中心化治理。
● 去中心化數據管理。
● 基礎設施自動化。
● 為失效設計。
● 演進式設計。
可以看出,Martin Fowler試圖將微服務定義為一個一般化的架構“最佳實踐”集合。微服務的這些特征也很好地融合了領域驅動設計、自動化、DevOps、容器等先進的技術實踐、架構理念和方法論。
與此同時,微服務的架構風格被描述為一種可以實現業務功能松散耦合(Loosely Coupled)的、具備一定服務邊界(Bounded Context)的服務集合。這種架構風格使得大型、復雜的應用實現CI/CD(Continuous Integration/Continuous Delivery,持續集成/持續交付)成為可能,并且技術棧可以獨立發展演進。
歸根結底,微服務本質上還是一種分布式系統架構。它強調系統應該按照業務領域邊界做細粒度的拆分和部署;它剔除了SOA中的企業服務總線,使用輕量級、標準化的HTTP(REST API)協議進行交互集成。微服務架構有利于應用應對業務的快速變化和規模化發展,通過對軟件復雜性的有機治理,使系統易于有序化重構及擴展。
1.1.3 微服務與云原生
云原生(Cloud Native)可以理解為一系列技術及思想的集合,既包含微服務、容器等技術載體,也包含DevOps(開發與運維的合體)的組織形式和溝通文化。企業采用基于云原生的架構進行構建、運行、管理現代應用的技術模式能夠平滑而快速地將業務遷移到云上,享受云的高效性和按需伸縮的能力。
云原生的提出
“效率”:天下武功、唯快不破,面對激烈的市場競爭,企業把服務產品快速交付的能力作為制勝的法寶。云原生架構的提出與應用的快速開發、快速交付的能力密不可分。作為對比,與傳統企業為應用提供和部署軟件按周、按月來計算,互聯網公司經常在一天內可以進行上百次發布。這種快速迭代和部署是建立在云基礎設施和自動化持續交付能力之上的。
“彈性”:隨著用戶規模和需求的增長,我們的應用需要能夠快速擴展,提高服務能力。傳統企業依靠購買硬件的方式來提升和擴展服務能力,而云原生架構可以通過虛擬化的技術實現按需擴展,動態地擴展服務實例以滿足計算、存儲、服務資源的彈性需求。
“可靠”:服務僅僅做到快速交付和彈性擴展是遠遠不夠的,還需要兼顧系統的穩定性、可用性、持久性,而這種特征與服務的容錯能力、故障隔離能力、可視化能力、系統快速恢復能力緊密相關,也就是系統所謂的“反脆弱”能力。現代應用如果想在這些“非功能需求”上得到保障,就需要采用云原生技術和云原生基礎設施保障服務的高可用性。
云原生與微服務
“云原生”的本質和目標是一種應用模式,它能夠幫助企業快速、持續、可靠、規模化地交付軟件,其中關鍵的支撐組件總結如下。
● 容器化的抽象封裝:標準化代碼和服務,每個部分(應用程序、進程等)都封裝在自己的容器中,有助于復用和資源隔離。實現方式代表有Docker、rkt。
● 動態管理:通過集中式的編排和調度系統來動態管理及優化資源。實現方式代表有Kubernetes、Swarm和Mesos。
● 面向微服務:應用程序基于微服務架構,顯著提升開發效率、提高架構演進的靈活性和可維護性。實現方式代表有Spring Boot、Spring Cloud。
從云原生的代表組件可以看出,云原生的主要組成技術包括容器、服務編排管理和微服務技術。云原生可以說是從概念上統一了構建、交付、運行現代應用的最佳實踐集合。在運行環境上,強調應用程序的運行環境是以容器和Kubernetes為主的云基礎設施;在流程管理上,主要配合使用持續集成、持續發布以及DevOps能力;在軟件開發上,基于微服務架構構建現代應用程序和軟件。雖然微服務架構也可以運行在傳統虛擬機或物理機上,但是微服務架構的最佳運行載體是以容器為代表的云原生環境。
云原生架構
云原生架構的思想和特征可以通過云原生12要素表達,我們在后面的章節中會詳細講解12要素的主要內容,從實踐的角度,作為最早踐行Cloud Native的Netflix,在云原生架構的目標、原則和措施等方面進行了詳盡描述:
● 不可變性。使用易失效的基礎設施來構建高敏捷(Highly Agile)、高可用(Highly Available)服務。其目的是為了提高伸縮性(Scalability)、可用性(Availability)、敏捷性(Agility)、效率(Efficiency)。
● 關注點分離。通過微服務架構實現關注點分離,避免出現“決策瓶頸”。實際上,實現關注點分離有助于提升系統的可擴展性和可用性。
● 反脆弱性。默認所有的依賴都可能失效,在設計階段就要考慮如何處理這些失效問題。為了讓系統更強壯,Netflix會不斷地攻擊自己、主動破壞,以提醒技術人員系統要進行反脆弱性設計。
● 高度信任的組織。Netflix基于信任的管理風格,相信自己的員工可以做出正確的決策,倡導給基層員工自主決策權。
● 共享。在Netflix,管理是比較透明的,共享能夠促進技術人員的成長。
結合云原生的特征和云原生的架構實踐,我們將云原生架構圖描述如下(見下圖),從架構層面來說,Cloud Native是構建在不可變基礎設施(以容器技術為代表)和以微服務架構技術為基礎的分布式系統之上的,這里的云包括私有云、公有云和混合云。微服務架構作為云原生概念的核心組成部分,本質上就是保證我們更好地適應云環境下的高效開發和運維。

云原生成熟度
對于系統采用云原生架構的程度,我們可以用云原生成熟度模型進行精確的等級劃分和判斷,成熟度模型一共包含4個等級(從Level 0到Level 3成熟度逐級遞增),從這些等級劃分可以看到開發和運行應用程序的原則、模式和具體技術實踐。如果你所在公司正在進行微服務的改造或者云原生架構的遷移,可以參考如下表所示的成熟度模型正確地評估你所在組織的云原生架構等級。

續表
