遷移到微服務架構能夠為公司的市場帶來激動人心的機會,因為它為使用者帶來更加快速的新功能釋出。你知道未來公司的成功取決於是否遷移到微服務架構,但你該如何去做呢?

幸運的是一些早期的微服務實踐者已經慷慨的分享了他們在微服務方面的實踐,以及貢獻了原始碼。Adrian Cockcroft – Netflix 的雲架構師,他見證了 Netflix 從100人的傳統應用研發團隊,研發一個 DVD 租賃系統的巨石應用,演進到多個獨立的小團隊,支援500個微服務,每天1.2億人觀看的視訊網站。

.

什麼是微服務架構?

Cockcroft 將微服務定義為:A microservices architecture as a service‑oriented architecture composed of loosely coupled elements that have bounded contexts. 這裡有兩個核心概念,一是 Loosely Coupled,二是 Bounded Context。

 Loosely Coupled(鬆耦合) 意思是:

  1. 可以獨立的更新每個服務

  2. 更新一個服務無需要求改變其他服務

如果你有一堆小的服務但不能獨立更新,那也不叫微服務,因為這些服務並沒有鬆耦合。原因之一,是有的公司將應用拆分了,但並沒有拆分資料庫,所有的應用仍然訪問同一個資料庫,你需要為每個服務拆分資料庫。

Bounded Contexts  概念來自 Eric Evans 寫的 Domain Driven Design 這本書 。微服務需要有明確的邊界性,你可以只關注自身軟體的釋出,而無需考慮誰在依賴你的釋出版本,因為微服務和它的消費者嚴格通過 API 進行互動,不共享資料結構、資料庫、POJO 等等。基於契約的微服務規範要求服務介面是穩定的,而且向下相容。

設計微服務架構的最佳實踐

為每個微服務建立一個獨立的資料儲存

不要為微服務提供共享的後端資料儲存。每個團隊有選擇最適合資料庫的自由。將資料庫拆分會讓資料管理變得複雜,因為獨立的資料儲存很容易出現數據不一致的問題,外來鍵很容易被意外的破壞。你需要工具來做主資料管理(MDM),為後端服務修復不一致的問題。例如:你需要檢查所有儲存使用者 ID 的資料庫,確保每個資料庫都有完整的使用者 ID 的記錄,不能存在某個資料庫沒有某個記錄的情況。你可以自己實現這個工具,也可以用商業關係資料庫的系統工具,但通常這些工具都有很多門檻,並且不易擴容。

將程式碼的成熟度保持在相同的水平

將程式碼的成熟度保持在相同的水平,如果你想增加或者重寫某個已經穩定服務的微服務,最好的辦法,是保留已有穩定執行的服務不變,建立一個新的微服務。這是符合了 Immutable Infrastructure Principle,這本書的不可變基礎設施理論。這樣你可以遞進式的部署和測試新的程式碼,直到程式碼足夠穩定, 高效執行,沒有任何效能問題和部署失敗問題的時候,你可以把程式碼 Merge 回之前的服務,完成新功能的開發。

為每個微服務提供獨立的構建

為每個微服務提供獨立的構建,這樣每個服務可以構建,獨立釋出,其他的服務依賴你的知識 Release 倉庫裡的某一個版本,他可以自行決定是升級你的最新版本,還是繼續使用舊版本。這樣帶來的是小團隊的獨立性,每個團隊可以自己決定釋出的週期,自己負責線上的問題。

組織結構變化

在微服務架構中,除了應用的重構,組織的結構也會發生變化,為了讓微服務的團隊實現獨立自運營,公司必須成立專門的基礎平臺部門,也叫 SRE,這個部門為公司的研發團隊提供統一的製品庫管理,CI 工具(Jenkins 等),部署工具和運維,監控平臺,以及應用的高可用保障。這樣每個團隊才能做到獨立釋出自己的服務。

部署到容器

部署微服務到容器裡很重要,因為這意味著你只需要一個工具即可部署所有內容。一旦將微服務放在容器裡,容器部署工具便知道如何部署它,無需考慮容器是什麼型別。

視伺服器為無狀態

對待伺服器,特別是直接服務於使用者的伺服器,應該把它看成是一個原子服務裡的某個持續變化的成員,你不需要去單獨的考慮某個機器的狀態,他們都應該提供一樣的功能,無需區別對待。

你唯一應該考慮的是他們能否支撐你的業務量。你可以使用自動擴容的方式將這些服務啟動或者關閉。如果其中某個服務 Down 掉了,應該由新的例項來進行替代。一定要避免某個服務存在特殊的功能,從而成為單點故障點。

Cockcroft 的理論是:你應該將伺服器看成是奶牛場裡的牛,而不是寵物。單個的奶牛是用唯一編號標記,而寵物用名字標記。如果你的機器使用名字標記,並且處理某種特殊的應用,如果這個機器 Down 掉了,所有人都會受到影響。

相反,如果你將機器看成是奶牛場裡的奶牛, 你只關心每天生產出多少牛奶,如果某天發現牛奶產量比平時少了,你只需找到這頭有問題的奶牛,把它替換掉。

基於 NGINX 平臺的 Netflix 部署架構

Netflix 是開源版 NGINX 的資深使用者。2011年,Netflix 也成為 NGINX 公司的第一個企業使用者,作為高效能 HTTP 處理的方案,NGINX and NGINX Plus 已經為 Netflix 公司提供每秒幾千-幾百萬併發請求的支援。

參考資料:

https://www.nginx.com/blog/microservices-at-netflix-architectural-best-practices/

作者:王青

目前任職 JFrog 中國首席架構師,之前在 IBM,HPE,愛奇藝,新浪,VIPKID 等公司做過研發和架構,是有十多年開發經驗的網際網路老兵,專注於軟體生命週期管理,微服務架構,雲原生應用,容器化等領域。

歡迎轉載,但轉載請註明作者與出處。謝謝!