微服務設計方法

概述

服務就是表明特定功能的軟件實體, 是不依賴於任何上下文或外部服務的自治構件.微服務設計就是軟件設計的一個子範疇, 它主要是指如何設計這樣的服務來知足需求, 而這個服務是微小且自治的, 知足微服務的若干特徵。php

先看看傳統軟件設計的流程: 需求分析--概要設計--詳細設計。css

軟件設計

需求分析和整理

對須要作詳細的分析, 一是功能性需求html

功能性需求:java

  • 用例
  • 場景
  • 驗收測試用例

非功能性需求:數據庫

  • 高可用性
  • 高性能
  • 伸縮性
  • 擴展性
  • 伸縮性
  • 安全性
  • 穩定性
  • 健壯性
  • 可測試性

以用戶登陸與註冊爲例, 咱們來分析其用例 Use case 和用戶故事 User Story緩存

用例 Use case

除了使用繪圖工具和畫用例圖, 還有幾種方法經過腳原本生成用例圖安全

一是使用在線網站 yuml.me

https://yuml.me/608ca377ruby

 
use case

UML 生成腳本以下網絡

[User]-(Sign In) [User]-(Sign Out) [User]-(Sign Up) [User]-(Forget Password) [User]-(Change Password) (Sign In)>(Remember Me) (Sign Up)>(Send Verification Email) (Forget Password)>(Send Reset Password Email) (Change Password)<(Send Reset Password Email) [Admin]^[User] [Admin]-(Add User) [Admin]-(Delete User) [Admin]-(Lock User) [Admin]-(Change Password Policy) 

二是使用是經過 plantuml 來生成

http://plantuml.com/ 上下載 plantuml.jar , 而後用以下命令生成用例圖數據結構

java -jar plantuml.jar usecase.txt

示例UML 生成腳本以下

@startuml

User -> (Sign In)
User --> (Sign Out) 
User --> (Sign Up)
User --> (activate)
User --> (forget/reset password)
:Admin: ---> (lock user) :Admin: ---> (add user) :Admin: ---> (delete user) @enduml 

三是使用graphviz

先安裝graphviz, 再運行以下命令

dot usecase1.gv -Tpng -o usecase1.png

示例UML生成腳本以下

digraph G {
    rankdir=LR;

    subgraph clusterUser {label="User"; labelloc="b"; peripheries=0; user}; user [shapefile="stick.png", peripheries=0]; signin [label="Sign In", shape=ellipse]; signout [label="Sign Out", shape=ellipse]; signup [label="Sign Up", shape=ellipse]; user->signin [arrowhead=none]; user->signout [arrowhead=none]; user->signup [arrowhead=none]; } 

用戶故事 User Story

User Story 講究 INVEST 原則

  • "I" ndependent (of all others) 獨立的
  • "N" egotiable (not a specific contract for features) 可協商的
  • "V" aluable (or vertical) 有價值的
  • "E" stimable (to a good approximation) 可估量的
  • "S" mall (so as to fit within an iteration) 足夠小的
  • "T" estable (in principle, even if there isn't a test for it yet) 可測試的

以用戶註冊 Sign Up 爲例, 能夠拆分爲以下子用戶故事

  1. 做爲一個未註冊用戶, 我想輸入個人電子郵件地址和密碼,註冊到站點

1.1 我必須輸入合法和郵件地址,符合密碼策略的密碼以及一致的驗證碼進行註冊
默認的密碼策略是最低8個字符, 必須包含大小寫字母和至少一個數字

# Story Priority Estimation Deadline Comments
1.1.1 生成驗證碼 P3 2 MD 2018-10-15 防光學識別
1.1.2 顯示註冊表單 P1 1 MD 2018-10-10  
1.1.3 郵件地址格式驗證 P1 1 MD 2018-10-10 客戶端和服務端都要驗證
1.1.4 比較兩次輸入的密碼是否相同 P1 2 M
H 2018-10-10  
1.1.5 驗證密碼是否符合密碼策略 P2 1 MD 2018-10-10  
1.1.6 驗證輸入的驗證碼 P3 2 MD 2018-10-12  
1.1.7 檢查是否已有相同的郵件地址存在 P1 1 MD 2018-10-12  
1.1.8 輸入驗證無誤後存入數據庫,狀態爲pending P2 2 MD 2018-10-13  
1.1.9 生成此用戶的激活連接 P2 2 MD 2018-10-15  
1.1.10 向註冊郵箱發送一封確認郵件 P2 2 MD 2018-10-15  

1.2 個人註冊郵箱會收到一封驗證郵件, 提示我點擊註冊鏈接, 從而激活個人註冊賬戶

1.3 當我完成激活後會自動跳到站點的首頁, 提示我進行登陸

概要設計

基於上面所定義的驗收測試用例, 進行軟件服務的整體設計,

先劃分模塊,以及模塊之間的關係和交互.

先讓咱們來看看微服務的典型架構 -- 六邊形架構(Hexagonal Architecture),又稱爲端口和適配器架構風格

傳統的分層架構咱們很是熟悉

  1. 表現層
  2. 業務層
  3. 數據層

而六邊形架構更增強調對外提供服務的接口適配


 
 
  1. 領域層(Domain Layer):位於最內層的核心層,純粹的核心業務邏輯,通常不包含任何技術實現或引用。
  2. 端口層(Ports Layer):領域層以外,負責接收與用例相關的全部請求,這些請求負責在領域層中協調工做。端口層在端口內部做爲領域層的邊界,在端口外部則扮演了外部實體的角色。
  3. 適配器層(Adapters Layer):端口層以外,負責以某種格式接收輸入、及產生輸出。

詳細設計

詳細設計就是把整體設計落到實處, 通常咱們會繪製以下的 4+1 視圖

 
 
  1. 邏輯視圖(Logical View),設計的對象模型。
  2. 進程視圖(Process View),捕捉設計的併發和同步特徵。
  3. 部署視圖(Deployment View),描述了軟件到硬件的映射,反映了分佈式特性。
  4. 實現視圖(Implementation View),描述了在開發環境中軟件的靜態組織結構。

四加一的一是指咱們以前提到的用例視圖

  1. 用例視圖(Use-Case View),該視圖是其餘視圖的依據

領域驅動服務設計

軟件的領域有多廣, 微服務的領域就有多廣. 基本上咱們可分爲兩大類

  1. 非功能領域的通用服務

它指對應於非功能需求的, 通用的, 可重用的服務類型, 好比系統認證服務, 緩存服務, 數據存儲服務, 以及在雲平臺上經常使用的註冊服務, 分佈式鎖服務, 消息隊列服務等等

微服務構建有其自身特色, 尤爲是相比單體服務, 分佈式系統使得咱們在容錯和高可用方面必須考慮周詳, 有些共通的原則, 模式和實踐, 咱們在系統設計須要熟練掌握, 並在實踐中不斷根據度量數據進行演進和調優.

這些和具體的業務關係不大, 不管你是作電商的 仍是作網絡會議的, 基本上都會用到.

  • 服務註冊和發現
  • 服務網關和編排
  • 服務度量和基於度量的自動化運維
  • 服務安全,跟蹤和審計
  • 服務可用性相關模式: 分流, 限流, 斷流
  • 等等

這些通用模塊以後再展開來說

  1. 業務功能領域的專用服務

技術常常更新換代,語言層出不窮,這些都會過期, 淘汰和更新換代, 能夠業務邏輯及商業模型不會輕易廢棄,由於它是企業安身立命,生存和賺錢的根本,須要當心維護,應用戶的需求,企業將來的發展而加強和改進。

而商業模型和業務邏輯如何能映射到軟件系統中呢?答案就是領域模型,它是軟件設計的核心,指導着咱們如何實現,如何編碼。

所謂領域主要就是指業務邏輯,規則和流程所對應的的軟件設計模型,對於那些重要的,複雜的業務模型稱爲核心域,相對次要的模型稱爲支撐子域,這些領域都有一個邊界上下文,使用一種通用語言來描述, 而領域的邊界,彼此之間的關係以及集成方式使用上下文映射圖來表示.

領域驅動設計概述

領域驅動設計採用的架構不一而足,視具體案例狀況而定。好比分層架構,端口和適配器,SOA,REST,CQRS,事件驅動(管道和過濾器,長時間處理過程,事件源)

領域模型的基礎是實體和值對象,而對於它們的處理以及流程控制更適合用領域服務來表示,而領域事件在不一樣的服務和系統之間用於集成和交互頗有用。以模塊來劃分領域對象,以聚合來整合相關的對象,以工廠來建立對象,以資源庫來存取對象,這些都是領域驅動設計中的核心。

每一個領域都有其專有的知識體系和業務場景, 服務必然是針對某個業務場景, 直接或者間接地爲業務提供服務

  1. 使用通用語言
    在領域專家和技術人員之間使用統一的語言來描述業務邏輯, 使用規範統一的術語,協議,各類文檔和圖表

  2. 作好領域的劃分和建模
    領域可分爲

  • 核心子域:核心的業務邏輯和流程
  • 支撐子域:支持核心業務的運轉
    *通用子域: 基礎設施和通用的工具或管理系統, 好比安全驗證, 用戶管理等
  1. 對領域對象進行細分
  • 分析聚合根實體
  • 識別根實體和範圍和邊界
  1. 定義限界上下文
  • 根據業務場景,領域的劃分來定義系統和邊界和上下文
    微服務與上下游服務的交互與依賴關係

微服務設計模板

1. 整體介紹

1.1 需求
1.1.1 業務需求和目標
需求分析, 用戶場景及用例圖

1.1.2 技術需求: 容量需求,高可用性,安全性,伸縮性

1.2 背景
1.2.1 業務背景
1.2.2 技術背景: 當前架構, 容量, 侷限和性能瓶頸

2. 設計

2.1 整體架構
整體框圖

2.2 備選方案

2.3 領域設計
主要的領域對象, 流程以及實體關係圖

2.4 範圍與影響
所影響的範圍以及對於其餘上下游組件的影響

2.5 詳細設計

2.5.1 接口描述
2.5.2 邏輯描述
2.5.3 數據結構
2.5.4 侷限與限制
2.5.5 性能問題
2.5.6 設計約束
2.5.7 意外狀況處理

3. 依賴條件

3.1 平臺
3.2 數據庫
3.3 其餘服務及其 SDK

4. 部署

4.1 配置
4.2 安裝
4.3 部署及驗證

5. 度量

5.1 關鍵因素 KPI
5.2 度量設計
5.3 度量工具

6. 測試方案

6.1 測試用例
6.2 API 測試方案
6.3 集成測試和端到端測試方案
6.4 性能測試方案

7. 問題與風險

當前存在的問題與可能存在的風險

8. 參考文檔和連接

相關文章
相關標籤/搜索