在開發服務端企業應用時,應用須要支持各類不一樣類型的客戶端,好比桌面瀏覽器、移動瀏覽器以及原生移動應用。應用還須要向第三方提供可訪問的API,並經過Web Service或者消息代理與其它應用實現集成。應用經過執行業務邏輯、訪問數據庫、與其它系統交換信息、並返回一條HTML/JSON/XML響應,來處理請求(HTTP請求與消息)。html
應用採用多層架構或者六角架構,主要由如下幾類不一樣組件構成:web
不一樣邏輯組件分別響應應用中的不一樣功能模塊。數據庫
應用的部署架構是什麼?編程
用 Scale Cube 方法(特別是Y軸擴展)設計應用架構,將應用程序按功能拆分爲一組互相協做的服務。每一個服務實現一組特定、相關的功能。舉例來講,一個應用程序可能由訂單管理服務、客戶管理服務等多個服務構成。後端
服務間的通訊則可由HTTP/REST等同步協議或者AMQP等異步協議實現。服務能夠彼此獨立開發與部署。每一個服務皆有本身的數據庫,從而保證其與其它服務解耦。在必要時,可利用數據庫複製機制或者應用層事件驅動機制,維護數據庫之間的數據一致性。瀏覽器
假設須要構建一款電子商務應用程序,使其可以接收來自客戶的訂單、驗證庫存信息與可用信用額度,然後進行發貨。該應用程序會包含多個組件,其中StoreFrontUI負責實現用戶界面,而其它後端服務則分別負責檢查信用額度、維護庫存信息以及發送訂單。服務器
此應用程序被部署爲一組服務集合。
架構
此類解決方案擁有如下優點:app
但這類解決方案中也存在着如下弊端:框架
採用微服務架構以前,有若干須要解決的問題。
應用此類方案帶來的挑戰在於如何把握好時機。在開發應用程序的最第一版本時,你們每每不會面臨須要使用微服務架構才能解決的問題。另外,使用複雜的分佈式架構會拖慢開發流程。對於初創企業,其面臨的最大挑戰每每在於如何快速發展商業模式及附屬應用。微服務架構中的Y軸拆分方式可能使應用更加難以迅速迭代。可是,若是當面臨須要解決擴展性問題的時候再去進行功能拆分,單體應用的複雜依賴性使其很難被分解爲服務集合。
另外一項挑戰在於如何將系統拆分爲多個微服務。這雖然很棘手但仍是有些可行之策:
在理想狀況下,每項服務都應只面向一小部分職責。(大叔)Bob Martin 曾提出根據單一責任原則(Single Responsibility Principle,簡稱 SRP)進行類的設計。SRP 會用單一變動理由去定義一個類的職責:一個類的狀態變動只能由一個緣由致使。同理,咱們也能夠在微服務設計當中引入 SRP。
另外一項可用於指導服務設計的是Unix工具的設計思路。Unix 提供大量工具選項,包括 grep、cat 以及 find 等等。每種工具都只負責實現一項功能,並且功能良好,它們能夠經過Shell腳本與其它工具結合進而執行復雜的任務。
爲了確保鬆耦合,每一個服務都有獨用的數據庫。維護服務間的數據一致性成爲了挑戰。在多數應用的架構下,2 階段提交和分佈式事務再也不是一個可選項。應用須要採用事件驅動架構,一個服務在其數據發生變化時,對外發佈一個事件,其餘服務訂閱並經過消費這個事件來對應更新本身的數據。有一些可靠的方式能夠實現事件的發佈和數據的更新,好比事件溯源 和事物日誌跟蹤。
另外一個挑戰是進行跨服務的數據的查詢。一個經常使用的解決方式是採用CQRS,維護一份包含重要數據的視圖並經過事件流的方式保持數據的更新。
微服務架構有不少與之相關的模式,單體架構 即是微服務架構的另外一衆選擇。在應用微服務架構時,您還會跟以下這些模式打交道:
衆多大型網站將單體架構發展爲微服務架構,其中包括 Netflix、Amazon 與 eBay 等。
做爲一個熱門視頻流服務,Netflix 利用一套大規模的面向服務的架構來承載高於 30% 的互聯網流量。該公司天天須要處理來自 800 多種設備的 10 億屢次視頻流 API 請求。平均每次 API 調用會在後端服務中產生 6 次後續調用。
Amazon.com 最初採用一套雙層架構。爲了擴展業務規模,其決定遷移至一套由數百項後端服務構成的面向服務的架構。多個應用調用這些服務,其中包括 Amazon.com網站和Web服務API。Amazon.com 網站須要調用 100 到 150 個服務方可獲取到構建一個 Web 頁面所需的所有數據。
做爲拍賣網站,eBay.com 也是從單體架構逐步轉向面向服務的架構。其應用層由多個獨立應用構成。每一個應用負責實現完成一組特定功能的業務邏輯,例如購買或者出售。每一個應用皆利用X軸進行拆分,部分應用(例如搜索)以Z軸進行拆分。eBay.com 還在數據庫層採用了 X、Y 與 Z 軸相結合的擴展方式。