這裏並非介紹微服務概念,如須要了解微服務,能夠閱讀Fowler-Microservices文章。本博客假定咱們已開始使用微服務解耦單體應用,用來提高可部署性和可擴展性。html
當咱們在系統範圍內部署大量的微服務時,一個新的挑戰產生了,單體應用部署時不會發生。這篇文章將針對這些新的挑戰,在系統範圍內部署大量微服務時定義一套操做模型(operations model)。數據庫
這篇文章分爲以下幾個部分:安全
1. 前提條件服務器
當在系統範圍內須要部署大量微服務時,須要什麼條件呢?架構
根據Flower的文章,以下是咱們想要獲得的:負載均衡
(Source:http://martinfowler.com/articles/microservices.html)微服務
然而,在開始發佈大量微服務替換單體應用以前,咱們須要實現以下這些前置條件:工具
下面簡要描述每個前置條件。ui
1.1 目標架構spa
首先,咱們須要分區微服務。例如,咱們能夠垂直分解微服務。
也能夠水平上應用領域驅動分解。以下是一個目標架構:
備註:這僅僅是一個範例目標架構,你可使用徹底不一樣的架構。核心時在開始部署微服務以前,須要有簡歷一個目標架構。不然,你最終的架構有可能像一團麪條同樣,甚至比現有的單體應用更加糟糕。
1.2 持續交付
咱們假定已經有了一套可持續交付的發佈工具,以便咱們能夠高效地反覆發佈微服務。
(Source: http://www.infoq.com/minibooks/emag-devops-toolchain)
1.3合適的組織
最後,咱們須要採用合適的組織結構,避免和Conway法則相沖突。Conway法則以下:
Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.
(Source: http://martinfowler.com/articles/microservices.html)
2. 擴展
接下來是本文關注的要點:
當咱們分解單體應用,並使用大量的微服務替換時,在系統範圍內會發生什麼呢?
(1) 大量的部署單元
將產生須要的小的微服務,而不是以前的一個大的單體應用,這將須要管理和跟蹤大量的部署單元。
(2) 微服務將同時暴露和調用服務
在系統範圍內,大部分的微服務彼此是互相鏈接的。
(3) 一些微服務暴露外部API
這些微服務將負責包含其餘的微服務不容許外部訪問。
(4) 系統根據動態
新的微服務部署,替換老的服務。現有的微服務新增實例,知足增加的負荷。這意味着微服務將比之前更高的頻率增長和下線。
(5) 平均故障時間(MTBF)將降低
在系統範圍內,故障發生頻率將更頻繁。軟件組件將不時發生問題。大量部署的微服務將比以前部署的單體應用出現問題的可能更高。
3. 問題
微服務模型將致使一些重要的運行時相關的問題:
(1) 微服務如何配置以及是否正確?
針對少許的應用程序,處理配置不是主要的問題,如使用配置文件或者在數據庫中的配置表。在大量的微服務部署到大量的服務器上時,這一配置訪問將變得很是複雜。這將致使大量的小的配置文件或者數據配置表遍及整個系統,使得難以高效可靠地維護。
(2) 什麼微服務部署了,部署在哪裏了?
在只有少許服務部署時,管理部署的主機和端口仍是比較簡單的。可是當有大量的微服務部署時,這些服務或多或少須要持續變動,如手工維護將變得很是麻煩。
(3) 如何維護路由信息?
在動態系統範圍中,服務消費方也是一個挑戰。尤爲是路由表或者消費配置文件,須要手工更新。在微服務不斷新增新的主機/端口時,將沒有時間手工維護。交付時間將會延長,而且手工維護出錯的風險也會增長。
(4) 如何防止失敗鏈?
因爲微服務之間是相互鏈接的,須要關注系統範圍內的失敗鏈。例如,一個被其餘衆多微服務依賴的微服務失敗了,其餘依賴的微服務也可能開始失敗。若是沒有合適處理,大量微服務將受到這個單一失敗的微服務所影響,致使一個脆弱的系統。
(5) 如何驗證全部的微服務已上線且在運行中?
跟蹤少許應用的運行狀態是比較簡單的,可是如何驗證全部的微服務是健康的,且準備好接收請求?
(6) 如何跟蹤服務之間的消息?
如何應對組織開始接到關於一些流程執行失敗?什麼微服務到致使這一問題的根本緣由?例如,訂單12345卡住了,咱們如何知道是由於微服務A沒法訪問,仍是由於微服務B在發送一個訂單確認消息以前,須要手工批准。
(7) 如何確保僅僅API服務暴露給外部?
例如咱們如何避免外部未受權的請求,對內部微服務的訪問?
(8) 如何保證API服務的安全?
這不是針對微服務的特定問題,可是保護對外暴露的微服務仍然是很是重要的。
4. 須要的組件
爲了解決上述的一些問題,新的操做和管理功能是必須的。針對上述問題,建議的解決方案包括以下組件:
(1) 中心配置服務Central Configuration Server
咱們須要一箇中心配置管理,而不是針對每個部署單元(微服務)有一個本地配置。此外,咱們還需一個配置API,微服務用來獲取配置信息。
(2) 服務發現服務 Service Discovery Server
咱們須要服務發現功能,微服務在啓動時,經過API本身註冊,而不是手工跟蹤微服務部署的主機和端口。
(3) 動態路由和負載均衡 Dynamic Routing and Load Balancer
基於服務發現功能,路由組件使用discovery API 查詢請求的微服務部署在哪裏;在被請求的服務部署了多個實例的狀況下,負載均衡組件能夠決定路由請求到特定的實例。
(4) 電路斷路器 Circuit Breaker
爲了不失敗鏈問題,咱們須要養分Circuit Breaker模式,詳細信息能夠參考 Fowler-Circuit Breaker的文章。
(5) 監控 Monitoring
基於電路斷路器,咱們能夠監控微服務的狀態,同時收集運行時統計數據,獲知服務的健康狀態和當前使用率。這些信息能夠收集並顯示在dashboard上,並針對配置閾值設置自動報警。
(6) 中心日誌分析 Centralized Log Analysis
爲了跟蹤消息,並檢測微服務什麼時候故障,咱們須要一箇中心日誌分析功能,能夠訪問服務器並收集每個微服務的log文件。日誌分析功能保存log信息在中心數據庫中,並提供了查詢和dashboard功能。備註:爲了查找相關的消息,全部微服務須要在log消息中使用相關的id,這點很重要。
(7) 邊緣服務 Edge Server
爲了對外部暴露API 服務,並阻止對內部微服務的未受權訪問,咱們須要一個邊緣服務(Edge Server),全部外部的訪問都通過邊緣服務器。基於前面的服務發現組件,邊緣服務器能夠重用動態路由和負載均衡功能。邊緣服務器做爲一個動態和有效的反向代理,在內部系統更新時,沒必要手動更新。
(8) OAuth 2.0保護的API
建議OAuth 2.0 標準保護暴露的API服務。應用OAuth 2.0 有以下效果:
1/一個新組建做爲OAuth Authorization Server;
2/API服務做爲OAuth Resource Server;
3/外部API消費方做爲OAuth Clients;
4/邊緣服務器(Edge Server)做爲OAuth Token Relay;
(4.1)做爲OAuth Resource Server;
(4.2)將外部請求中的OAuth Access Tokens傳遞給API 服務;
備註:OAuth 2.0 標準可能經過OpenID Connect標準來補充完善,提供更好的受權功能。
5. 參考模型
總而言之,微服務須要一套包含上述支持服務的基礎設施,微服務使用它們的API來交互。下圖描繪了這一基礎設施:
備註:爲了減小上圖中交互的複雜度,微服務和支持服務的交互並無畫出來。
6. 下一步
在接下來的文章中,咱們將描述和演示如何實現上述建議的參考模型。
英文原文連接: