03-微服務架構構建之微服務拆分

文章目錄

  • 前言
  • 一、微服務拆分的原則
  • 二、微服務拆分的時機
  • 三、微服務拆分的方法
  • 總結


前言

微服務架構是將一個單體應用程序拆分為一個個獨立且保持松耦合的服務的一種架構方式,每個服務有著獨立的數據庫并且能獨立運行部署。微服務架構的構建過程中,第一步也是最為重要的一步是進行服務拆分。只有將微服務按照合理的方式進行拆分,才能確保整個項目能夠高效而正確地運行。


一、微服務拆分的原則

微服務拆分原則有以下幾個:

  1. 單一職責原則:每個微服務應該有一個明確的職責范圍,只負責自己的一部分業務功能,不涉及其他職責。

  2. 服務自治原則:每個微服務應該具備自我管理、獨立部署、獨立伸縮、獨立運維的能力,不與其他服務強依賴。

  3. 服務可復用原則:每個微服務應該是可復用的,可以為其他服務提供通用的服務功能。

  4. 服務粒度原則:微服務應該按照業務功能劃分,而不是按照技術、數據結構等因素劃分,保持服務規模適度。

  5. 服務高內聚、低耦合原則:微服務內部業務功能高度內聚,與其他服務之間耦合度低,便于分布式部署和獨立開發、維護。

  6. 服務易于測試原則:每個微服務應該具備自我測試的能力,包括單元測試、接口測試、集成測試等多種形式,確保服務質量。

  7. 服務可擴展原則:每個微服務應該能夠按照業務需求進行擴展,包括水平擴展和垂直擴展兩種方式,以應對高并發、大流量等場景。

同樣,也可以參考一下,這篇文章對服務拆分原則的理解。以下摘自該文章。

  1. 使用有界上下文。

  2. 確定核心域并保持競爭優勢。

  3. 對通用域進行成本優化。

  4. 考慮支持領域。

  5. 引入反腐層。

  6. 識別數據通信模式。

  7. 引入事件驅動架構。

  8. 使API簡潔明了。

  9. 將相關的微服務合并為更大的服務。

  10. 引入無縫開發支持工具。

不管是哪種拆分原則,目標都是需要將相同或相似的服務聚合在一起,形成一個獨立的自治服務。

二、微服務拆分的時機

通過《02-微服務架構的概念與優缺點》可以了解到微服務架構具備很多的優點,能夠有效解決項目業務擴大所帶來的問題。然而,并非所有公司都適合采用微服務架構,尤其是規模較小且業務相對固定的公司。對于這些公司來說,從服務層面,他們不會有更多變化,通過優化現有服務即可滿足需求。從成本方面,構建微服務架構,需要很多資源和配套的中間件。因此,對于那些規模較大,業務服務復雜度高,同時業務也在不斷更新或新增的項目,微服務架構則是非常適合的選擇。

在確定使用微服務架構后,服務的拆分是一項重要任務。根據拆分原則,我們可以在恰當的時機進行服務拆分。然而,根據行業經驗來看,并不建議在項目構建初期進行服務拆分。主要原因有以下幾點:

  1. 項目構建初期,服務單一,數據量較少,及時是單體系統都可以支撐業務。

  2. 項目構建初期,服務沒有形成體系,更沒有規模服務,很難做到微服務的單一職責和服務自治。

  3. 業務架構不夠成熟,目前提供的服務,很有可能會優化,甚至更改技術棧重構。

因此,項目構建初期無需將其拆分,因為強行拆分此時可能會產生適得其反的效果。而遇到下面這些情況就可以進行服務拆分了。

  1. 項目足夠成熟并且業務穩定,團隊成員不斷擴大并且目前的服務想要擴展很難。只有在項目成熟的情況下,業務專家才可以從精確的劃分出業務領域,進而將各個服務分解到業務領域內,最終形成各自獨立的微服務。

  2. 項目要求CI/CD(持續集成/持續交付)。尤其是很多新興的互聯網公司,要求系統在盡可能不停機的情況下,還需要持續上線新的功能。使用敏捷開發,可以更好地讓開發者在完成周期形的業務交付,而DevOps則可以將這些代碼,進行自動化測試、構建和集成,不斷的完成新的需求提交,并保證代碼的質量和穩定性。

  3. 正式運行的項目,部分服務需要停機。當上線一些有問題的服務時,將該部分服務停機,這個情況對單體應用是非常有困難的。而微服務架構中,可以對存在問題的微服務進行下線處理,從而達到快速解決問題的目的。


三、微服務拆分的方法

在掌握了準確的微服務拆分時機和有了強有力的拆分原則后,拆分方法將成為下一個關鍵環節。現在微服務拆分的方法有很多種,常見的包括:

  1. 按業務功能拆分:將整個系統按照不同的業務模塊進行拆分,每個模塊對應一個微服務。這種方式能夠有效地降低系統的復雜度,提高系統的可維護性和可擴展性。

  2. 按數據拆分:將整個系統的數據按照不同的領域進行拆分,每個領域對應一個微服務。這種方式能夠提高系統的性能和可擴展性。

  3. 按用戶界面拆分:將整個系統按照不同的用戶界面進行拆分,每個用戶界面對應一個微服務。這種方式能夠實現快速迭代和響應用戶需求的能力。

  4. 按技術棧拆分:將整個系統按照不同的技術棧進行拆分,每個技術棧對應一個微服務。這種方式能夠提高開發效率和降低系統的復雜度。

  5. 按性能拆分:將整個系統按照不同的性能需求進行拆分,每個需求對應一個微服務。這種方式能夠提高系統的性能和可擴展性。

從行業經驗來看,可以確定領域驅動設計(Domain Driven Design,簡稱DDD)在微服務拆分方面具有顯著優勢。

DDD是一種軟件開發方法論,它強調將軟件劃分為不同的領域,每個領域都由一個核心模型驅動。 微服務架構的核心概念是將單一的應用程序拆分為一組小型、自治的服務。而DDD則提供了一種方法來設計這些微服務的邊界和交互。 領域驅動設計引入了領域模型的概念,該模型描述了業務領域的核心概念和實體,而不關注技術實現細節。這使得團隊可以專注于業務邏輯,而不被底層技術細節所干擾。 通過將領域模型作為微服務拆分的基礎,可以確保每個微服務都是高內聚的,并且只關注自己領域內的業務邏輯。這種拆分方式使得每個微服務都能夠獨立開發、部署和維護,從而提高了系統的可伸縮性和可靠性。 此外,DDD還強調了領域驅動設計的語言在業務團隊和開發團隊之間的溝通和理解的重要性。通過共享統一的語言和概念,可以確保業務需求能夠準確地傳達給開發團隊,并且開發團隊能夠將其轉化為可行的技術解決方案。 因此,DDD是一種非常適合成為微服務拆分的方法論。它能夠幫助開發人員更好地理解業務需求,找到合適的服務邊界,構建高質量的領域模型和微服務。


總結

以上就是今天要講的關于微服務拆分的全部內容。通過了解微服務的拆分時機并掌握拆分原則,我們可以選擇合適的拆分方式,從而順利進行微服務的拆分。微服務的拆分時機一般是在系統龐大、業務復雜或者團隊擴大的情況下,以應對系統的瓶頸和團隊協作的問題。同時,在進行微服務拆分時,我們需要遵循一些原則,如單一職責原則、服務自治原則等,以確保拆分后的服務具有清晰的職責和松耦合的關系。最后,要根據實際情況選擇合適的拆分方式,提出使用領域驅動設計作為方法論的優勢。只有通過這樣的準備和選擇,才能夠順利進行微服務的拆分工作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/206759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/206759.shtml
英文地址,請注明出處:http://en.pswp.cn/news/206759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

偷竊別人的密碼

在工作中都用到virtual machine吧,同事之間還互相借用機器,或者不借用但憑借自己的域賬號能登錄任意機器,而且每個域賬號都有sudo權限? 那你要小心了! 因為我可以輕易記錄下每個ssh登錄到我機器,或者我在…

uniapp 輸入框輸入時,會將內容頂上去的解決方案

// 設置頁面最小高度 export const setPageMinHeight () > {return {position: relative,min-height: uni.getSystemInfoSync().windowHeight px} }頁面使用: import {setPageMinHeight} from "/utils/uniUtil";data() {return {minHeight: setPag…

Unity 狀態系統

狀態系統 原理食用方法Demo 原理 #mermaid-svg-lUbxJ8eMP3KqrEhY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-icon{fill:#552222;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-text{fill:#55…

官方officevisio在線安裝包

在線安裝包,在線就是要有網絡環境,你能搜到這篇博客,就初步具備網絡環境 visio在線安裝包.zip官方版下載丨最新版下載丨綠色版下載丨APP下載-123云盤 在線安裝包如下,雙擊執行安裝即可,可供選擇的64/32位 軟件的激活與…

netty使用

支持協議 TCP/UDPHTTP/HTTPSWebSocketSPDY/HTTP2MQTT/CoAP 服務端 常用類 ServerBootstrap 服務端配置類 //設置線程組、parentGroup處理連接、childGroup處理I/O group(EventLoopGroup parentGroup, EventLoopGroup childGroup) //Channel通過何種方式獲取新的連接(NioSe…

【擴散模型】ControlNet從原理到實戰

ControlNet從原理到實戰 ControlNet原理ControlNet應用于大型預訓練擴散模型ControlNet訓練過程ControlNet示例1 ControlNet與Canny Edge2. ControlNet與Depth3. ControlNet與M-LSD Lines4. ControlNet與HED Boundary ControlNet實戰Canny Edge實戰Open Pose 小結參考資料 Cont…

Linux系統上RabbitMQ安裝教程

一、安裝前環境準備 Linux:CentOS 7.9 RabbitMQ Erlang 1、系統內須有C等基本工具 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz socat2、下載安裝包 1)首先&a…

[linux] kaggle 數據集用linux下載

你可以通過以下步驟獲取Kaggle的下載鏈接并在Linux中進行下載: 首先,確保你已經安裝了Python和Kaggle API。如果沒有安裝,你可以通過以下命令安裝: pip install kaggle 接著,你需要在Kaggle網站上獲取API Token。登錄…

時間相關類

內容 JDK7時間相關類JDK8時間相關類 第一章 Date類 1.1 Date概述 java.util.Date類 表示特定的瞬間,精確到毫秒。 繼續查閱Date類的描述,發現Date擁有多個構造函數,只是部分已經過時,我們重點看以下兩個構造函數 public Dat…

【PyTorch】 暫退法(dropout)

文章目錄 1. 理論介紹2. 實例解析2.1. 實例描述2.2. 代碼實現2.2.1. 主要代碼2.2.2. 完整代碼2.2.3. 輸出結果 1. 理論介紹 線性模型泛化的可靠性是有代價的,因為線性模型沒有考慮到特征之間的交互作用,由此模型靈活性受限。泛化性和靈活性之間的基本權…

Docker構建自定義鏡像

創建一個docker-demo的文件夾,放入需要構建的文件 主要是配置Dockerfile文件 第一種配置方法 # 指定基礎鏡像 FROM ubuntu:16.04 # 配置環境變量,JDK的安裝目錄 ENV JAVA_DIR/usr/local# 拷貝jdk和java項目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo…

Java基礎50題: 21.實現一個方法printArray, 以數組為參數,循環訪問數組中的每個元素,打印每個元素的值.

概述 實現一個方法printArray, 以數組為參數,循環訪問數組中的每個元素,打印每個元素的值. 代碼 public static void printArray(int[] array) {for (int i 0; i < array.length; i) {System.out.println(array[i] " ");}System.out.println();}public static…

【數據結構c實現】順序表實現

文章目錄 線性表線性表的順序實現結點結構結點初始化增配空間Inc打印順序表show_list線性表長度length尾部插入push_back頭部插入push_front尾部刪除pop_back頭部刪除pop_front按位置插入insert_pos按值查找find按位置刪除delete_pos按值刪除delete_val排序sort(冒泡&#xff1…

云上業務DDoS與CC攻擊防護實踐

案例背景&#xff1a;DDoS攻擊來勢洶洶&#xff0c;云上業務面臨威脅 某網絡科技有限公司&#xff0c;SaaS化創業公司&#xff0c;業務基于云上開展。其業務主要為各大網站提供安全驗證服務&#xff0c;且市場占有率較高&#xff0c;服務客戶遍布金融、直播、教育、電商等多個領…

【日常總結】mybatis-plus WHERE BINARY 中文查不出來

目錄 一、場景 二、問題 三、原因 四、解決方案 五、拓展&#xff08;全表全字段修改字符集一鍵更改&#xff09; 準備工作&#xff1a;做好整個庫備份 1. 全表一鍵修改 Stage 1&#xff1a;運行如下查詢 Stage 2&#xff1a;復制sql語句 Stage 3&#xff1a;執行即可…

100. 相同的樹(Java)

目錄 解法&#xff1a; 官方解法&#xff1a; 方法一&#xff1a;深度優先搜索 復雜度分析 時間復雜度&#xff1a; 空間復雜度&#xff1a; 方法二&#xff1a;廣度優先搜索 復雜度分析 時間復雜度&#xff1a; 空間復雜度&#xff1a; 給你兩棵二叉樹的根節點 p 和…

L1-028:判斷素數

題目描述 本題的目標很簡單&#xff0c;就是判斷一個給定的正整數是否素數。 輸入格式&#xff1a; 輸入在第一行給出一個正整數N&#xff08;≤ 10&#xff09;&#xff0c;隨后N行&#xff0c;每行給出一個小于231的需要判斷的正整數。 輸出格式&#xff1a; 對每個需要判斷的…

Kotlin(十五) 高階函數詳解

高階函數的定義 高階函數和Lambda的關系是密不可分的。在之前的文章中&#xff0c;我們熟悉了Lambda編程的基礎知識&#xff0c;并且掌握了一些與集合相關的函數式API的用法&#xff0c;如map、filter函數等。另外&#xff0c;我們也了解了Kotlin的標準函數&#xff0c;如run、…

vuepress-----22、其他評論方案

vuepress 支持評論 本文講述 vuepress 站點如何集成評論系統&#xff0c;選型是 valineleancloud, 支持匿名評論&#xff0c;缺點是數據沒有存儲在自己手里。市面上也有其他的方案, 如 gitalk,vssue 等, 但需要用戶登錄 github 才能發表評論, 但 github 經常無法連接,導致體驗…

[wp]“古劍山”第一屆全國大學生網絡攻防大賽 Web部分wp

“古劍山”第一屆全國大學生網絡攻防大賽 群友說是原題杯 哈哈哈哈 我也不懂 我比賽打的少 Web Web | unse 源碼&#xff1a; <?phpinclude("./test.php");if(isset($_GET[fun])){if(justafun($_GET[fun])){include($_GET[fun]);}}else{unserialize($_GET[…