主頁 > 軟體設計 > 「萌新指南」SOA vs. 微服務:What’s the Difference?

「萌新指南」SOA vs. 微服務:What’s the Difference?

2021-09-01 17:00:54 軟體設計

實話實說,在我還沒有實習之前,我是連 SOA 是啥都不知道的,只聽說過微服務,畢竟微服務實在太火了,想不知道都難,我覺得實習的時候肯定也是微服務,進組之后發現是 SOA 架構,當時都懵了,看了很多檔案做了很多筆記都還是不太明白 SOA 是啥,后來又困惑于 SOA 和微服務的區別是啥,我還去翻了一下《鳳凰架構》這本書,遺憾的是,由于我剛剛接觸 SOA,微服務也沒有實際上手過,所以盡管周志明老師的文字已經非常小白向,但是我還是沒能懂 SOA 和微服務到底有啥實質上的區別,

這倆天看見了 IBM 的一篇文章,真的醍醐灌頂,本文對這篇文章的部分段落進行翻譯,然后結合之前看過的資料加入一些自己的理解,原文地址在這里,感興趣的小伙伴可自行去閱讀英文原文哈:https://www.ibm.com/cloud/blog/soa-vs-microservices

什么是 SOA

SOA 的全稱是 Service-Oriented Architecture面向服務的架構,注意這是一種架構哈,我剛開始還以為是跟 Dubbo 一樣的這種框架,hhh,這里為我的無知道歉,

SOA 是一種全企業范圍(enterprise-wide)的應用軟體開發方法,其核心在于利用可重復使用的軟體組件(software components)或服務(services),在 SOA 軟體架構中,每項服務都由執行特定業務功能所需的代碼(code)和資料集(data integrations)組成

In SOA software architecture, each service is comprised of the code and data integrations required to execute a specific business function

更通俗點來說,SOA 就是把系統按照實際業務拆分成剛剛好大小的、合適的、獨立部署的模塊,各個模塊包含各自所需的代碼和資料集,并且每個模塊之間相互獨立,

?? 舉個例子,一個銀行網站可能會包含以下幾種服務:檢查客戶的信用、登錄網站或處理抵押貸款申請,這三種服務分別包含與各自業務相關的代碼和資料集,

從代碼層面直觀來說,每個服務由以下三個部分組成:

  1. interface 介面:暴露給消費者使用的介面
  2. contract 契約:規定了服務提供者和服務消費者應該如何互動
  3. implementation 介面實作:介面的具體實作

SOA 于 20 世紀 90 年代末出現,是應用開發和集成發展的重要階段,在 SOA 架構火起來之前,將單體應用程式(monolithic application)與另一個系統中的資料或功能連接起來需要復雜的點對點集成(point-to-point integration),并且一旦出現一個新專案,開發人員又得為這個新開發專案重新創建這些集成,而通過 SOA 將這些通用功能暴露出來(或者說共享出來),開發人員就無需每次都要重新寫一遍重復代碼了,

當然,這種方式既是一種好處,也是一種風險,由于很多應用程式都共享訪問了某個服務,那如果這個服務出現問題了,這些應用程式也會受到級聯影響,

?? 舉個通俗點的例子:(來自知乎高贊,稍作修改:光太狼 - https://www.zhihu.com/question/42061683)

比如現我有一個資料庫,一個 JavaWeb 的網站客戶端,一個安卓 App 客戶端,一個 IOS 客戶端,

現在我要從這個資料庫中獲取注冊用戶串列,如果按照單體應用程式的設計思想,那么就是這樣的思路:JavaWeb里面寫一個查詢方法從資料庫里面查資料然后在網頁顯示,安卓 App 里面寫一個查詢方法查詢后在 App 上顯示,IOS 同樣如此,這樣,同樣的一套查詢方法出現了三次,代碼非常冗余,三個地方都有相同的業務代碼,如果需要改動的話三個地方都要改,而且要改的一模一樣,當然問題不止這一個,

于是乎出現了這樣的設計思想,比如用 Java(或者是其他語言皆可)單獨創建一個工程部署在一臺服務器上,并且寫一個方法(或稱函式)執行上述查詢操作,然后使其他人可以通過某種途徑(可以是 HTTP 鏈接,或者是基于 Socket 的 RPC 呼叫)訪問這個方法得到回傳資料,回傳的資料型別是通用的 JSON 或者 Xml 資料,就是說把這個查詢操作封裝到一個工程中去,然后暴露訪問該操作的方式,形成 “服務”(服務介面)

這樣一來,JavaWeb 這邊可以訪問這個服務然后得到資料使用,安卓和 IOS 這里也可以通過這個服務得到資料,而且最重要的是,要修改關于注冊用戶的業務方法只要改這個服務就好了,很好的解耦,同理,其他業務比如商品、廣告等業務都可以單獨形成服務部署在單獨服務器上,

還有一種情況就是一旦哪天突然有一堆人要注冊,假設這堆人僅僅只是注冊而不做其他事情,其他業務比如商品、廣告服務等都不忙,唯獨注冊這個服務壓力很大,而原有的一臺部署了注冊服務的服務器已經承受不了這么高的并發,這時候就可以單獨集群部署這個注冊服務,提供多幾臺服務器提供注冊服務,而其他服務不用動,維持原樣就好了,


當然,以上舉的例子其實并不能完全稱為 SOA,還不夠完整,因為它少了 服務治理 這一環節,

什么是服務治理,就是當服務越來越多,呼叫方也越來越多的時候,它們之間的關系就變得非常混亂,需要對這些關系進行管理,

還是上面的例子,假如我有一個用戶服務,一開始有呼叫方 1 和呼叫方 2 來使用這個服務,后來越來越多,將近上百個呼叫方,這個時候作為服務方,它只知道提供服務,卻不知道具體為誰提供了服務,而對于開發者來說,知道這 N 個呼叫方和 N 個服務方之間的關系是非常重要的,

所以這個時候就需要能進行服務治理的框架,比如 Dubbo + Zookeeper、Spring Cloud 等,有了服務治理功能,我們就能清晰地看到服務被誰誰誰呼叫,誰誰誰呼叫了哪些服務,哪些服務是熱點服務需要配置服務器集群,而對這個服務集群的負載均衡也是服務治理可以完成的重要功能之一,

這個時候就是更加完善一點的 SOA 了,當然,還可以更進一步,加上 服務監控跟蹤 等等之類的,

什么是微服務

?? 直接舉例:一個在線購物網站會有一些不同的功能,比如產品目錄、購物車和下單等等,

使用 SOA 的開發公司一般會將購物網站拆分成主要的業務邏輯組,并將每個部分作為獨立應用分別開發,最后集成到一起,具體開發流程包括事先定義好需要暴露給外部呼叫的服務介面,比如添加購物車操作和下單操作,然后圍繞服務介面進行開發,

這樣,如果其他應用比如火車票模塊也需要下單操作,那么直接呼叫這個服務介面就行了,不用重新添加

各位應該能看出 SOA 這里存在的一個問題,那就是由于圍繞主要的業務邏輯來劃分,所以 SOA 的粒度是比較大的,比如說,我們現在圍繞添加購物車和下單這兩個主要業務邏輯定義了兩個服務介面,但是添加購物車和下單這兩個服務中都存在顯示商品名稱這種粒度比較小的通用功能,這樣,我們就不得不在這兩個服務介面中寫一套差不多的代碼,

使用微服務架構的開發公司會將購物車切分成較小的任務導向服務,不再是購物車應用了,而可能是顯示商品名稱服務、添加/移除商品服務、運費服務、匯率服務和訂單撰寫服務,購物車功能可能也會用到一些常用的服務——它們會用在這整個購物網站的很多地方,比如顯示商品名稱服務、顯示產品圖片服務、查看庫存服務等,通用代碼被封裝成各種服務,待需要時用在各種功能中,

看下面這張網圖,雖然有點不清晰,但是真的很通俗易懂了 ??:

圖片來源 http://blog.sina.com.cn/s/blog_90ad2e8b0102xykv.html

SOA 和微服務的主要區別:范圍

相信大家看完上面的例子也能夠理解了,

這兩種方法的主要區別歸結于范圍 scope,簡單地說,服務型架構(SOA)粒度比較大,服務于企業范圍,而微服務架構粒度比較小,服務于應用范圍,

所以 If you accept the difference in scope, you may quickly realize that the two can potentially complement each other, rather than compete.

兩者是相互補充,而不是競爭

?? 關注公眾號 | 飛天小牛肉,即時獲取更新

  • 博主東南大學碩士在讀,攜程 Java 后臺開發暑期實習生,利用課余時間運營一個公眾號『 飛天小牛肉 』,2020/12/29 日開通,專注分享計算機基礎(資料結構 + 演算法 + 計算機網路 + 資料庫 + 作業系統 + Linux)、Java 技術堆疊等相關原創技術好文,本公眾號的目的就是讓大家可以快速掌握重點知識,有的放矢,關注公眾號第一時間獲取文章更新,成長的路上我們一起進步

  • 并推薦個人維護的開源教程類專案: CS-Wiki(Gitee 推薦專案,現已累計 1.8k+ star), 致力打造完善的后端知識體系,在技術的路上少走彎路,歡迎各位小伙伴前來交流學習 ~ ??

  • 如果各位小伙伴春招秋招沒有拿得出手的專案的話,可以參考我寫的一個專案「開源社區系統 Echo」Gitee 官方推薦專案,目前已累計 900+ star,基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供詳細的開發檔案和配套教程,公眾號后臺回復 Echo 可以獲取配套教程,目前尚在更新中,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/296753.html

標籤:架構設計

上一篇:開源專案 VS Code 插件 CSDN 作業流|Code China

下一篇:面試常備知識-Linux網站架構優化

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more