微服務操作模型

来源:http://www.cnblogs.com/rickie/archive/2017/03/12/6538158.html
-Advertisement-
Play Games

當我們在系統範圍內部署大量的微服務時,一個新的挑戰產生了,單體應用部署時不會發生。這篇文章將針對這些新的挑戰,在系統範圍內部署大量微服務時定義一套操作模型(operations model)。這篇文章分為如下幾個部分: 前提條件;擴展;問題;需要的組件;參考模型;下一步; ...


這裡並不是介紹微服務概念,如需要瞭解微服務,可以閱讀Fowler-Microservices文章。本博客假定我們已開始使用微服務解耦單體應用,用來提升可部署性和可擴展性。

當我們在系統範圍內部署大量的微服務時,一個新的挑戰產生了,單體應用部署時不會發生。這篇文章將針對這些新的挑戰,在系統範圍內部署大量微服務時定義一套操作模型(operations model)。

這篇文章分為如下幾個部分:

  1. 前提條件;
  2. 擴展;
  3. 問題;
  4. 需要的組件;
  5. 參考模型;
  6. 下一步;

 

1. 前提條件

當在系統範圍內需要部署大量微服務時,需要什麼條件呢?

根據Flower的文章,如下是我們想要得到的:

 (Source:http://martinfowler.com/articles/microservices.html)

 

然而,在開始發佈大量微服務替換單體應用之前,我們需要實現如下這些前置條件:

  • 目標架構;
  • 持續交付工具;
  • 合適的組件結構;

下麵簡要描述每一個前置條件。

1.1   目標架構

首先,我們需要分區微服務。例如,我們可以垂直分解微服務。

  • 核心服務(Core services)-處理業務數據的持久化和實施業務邏輯和其他規則;
  • 組合服務(Composite services)-組合服務指編排一組核心服務實現一個特定任務,或者從一組核心服務中聚合信息;
  • API services – 向外暴露功能,例如允許第三方使用底層功能創建新的應用;

 

也可以水平上應用領域驅動分解。如下是一個目標架構:

備註:這僅僅是一個範例目標架構,你可以使用完全不同的架構。核心時在開始部署微服務之前,需要有簡歷一個目標架構。否則,你最終的架構有可能像一團麵條一樣,甚至比現有的單體應用更加糟糕。

 

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. 下一步

在接下來的文章中,我們將描述和演示如何實現上述建議的參考模型。

 

英文原文鏈接:

An operations model for Microservices

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本視頻為activiti工作流的web流程設計器整合視頻教程 整合Acitiviti線上流程設計器(Activiti-Modeler 5.21.0 官方流程設計器) 本視頻共講了兩種整合方式 1. 流程設計器和其它工作流項目分開部署的方式 2. 流程設計器和SSM框架項目整合在一起的方式 視頻大小 ...
  • 很多人都需要與微信的api對接。 今天我這裡就分享全套的企業微信api介面的代碼。 關於微信api,網上已經有很多實現的了。 但是我今天之所以還寫這個,是因為網上基本上找不到面向對象的api介面實現的編程,幾乎都是“面向過程”的。 本文章的代碼,也許能帶給你極大的方便,以及非常方便的擴展和應用。 ...
  • 需求分析: 有個廠家,下麵有很多代理商(商戶或門頭等),之前商戶進貨、庫存、銷售、客戶資料等記錄在excel表格中 或者無記錄,管理比較混亂,盈利情況不明。不能有效瞭解店鋪經營情況和客戶跟蹤記錄 廠家也不能實時瞭解下麵代理商的經營狀況和庫存情況 解決方案: 本系統角色主要分兩個層級:總管理(廠家), ...
  • 功能概要:數據定時更新,可查詢歷史數據。詳細說明:1、現在有個排行榜需要幾分鐘更新一次,所以我使用了windows服務定時運行;一次的數據量在30萬左右,這樣可能到下次更新時本次的任務沒有運行完成,所以遇到這種情況就等待下次任務觸發時再運行更新。 2、當運行更新時,不斷有數據插入到榜單表,為了不影響 ...
  • 閉包是一個比較抽象的概念,尤其是對js新手來說.書上的解釋實在是比較晦澀,對我來說也是一樣. 但是他也是js能力提升中無法繞過的一環,幾乎每次面試必問的問題,因為在回答的時候.你的答案的深度,對術語的理解以及js內部解釋器的運作方式的描述,都是可以看出你js實際水平的.即使你沒答對,也能讓考官對你的 ...
  • 世界上本來沒有設計模式。用的人多了,也就成了設計模式。所以,我們不是嚴格按照它的定義去執行,可以根據自己的實際場景、需求去變通。領悟了其中的思想,實現屬於自己的設計模式。 你肯定有過這樣的體會。某某時候,聽人說起**模式。這麼牛逼,回去得看看。結果仔細一看原來自己早就是這麼用了,只是不知道它還有個這... ...
  • 一、Java的起源 最初是為家用電器設計的,因為其特點適合於internet, 於是通過internet成為一種計算語言,一個平臺,一個網路計算的架構。 二、Java平臺分類 ①JavaSE適用於普通PC及筆記本電腦,為其他JAVA程式的開發和運行提供了最基本的技術支持。 ②JAVAEE適用於企業級 ...
  • 武俠小說練功講究打通任督二脈。程式設計練到一定程度也講究打通任督二脈。好奇心強的同學可以搜搜“打通任督二脈有什麼感覺”。 spring的任督二脈ApplicationContext 最經典的任督二脈莫過於java中spring中的ApplicationContext。用慣spring的都會覺得,這裡 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...