那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從分層架構到微服務架構介紹(五)

jf_78858299 ? 來源:元閏子的邀請 ? 作者:元閏子 ? 2023-05-10 17:02 ? 次閱讀

本文要介紹的是 服務化架構Service-Based Architecture, SBA )。

SBA 可以看成是單體架構和微服務架構之間的一個折中方案,它也是按照業務領域進行服務劃分,但服務劃分的粒度相比微服務要更粗。SBA 與微服務架構一大不同是, 它允許各個服務間共享同一個數據庫實例 ,這也使得 SBA 在架構上既有單體架構的特點,也有分布式架構的特點,顯得更加的靈活。因此, 從單體架構演進到 SBA,會比直接演進到微服務架構更加容易

架構視圖

基礎視圖

SBA 的基礎架構視圖分成 3 部分:

  • User Interface ,作為系統的接入口,接收客戶端的請求,并轉發到業務服務。。
  • Domain Services ,業務服務按照領域進行劃分,分開部署、業務獨立。
  • Database ,服務間共享的數據庫實例,因為數據庫實例只有一個,所以可以支持 ACID 事務。

圖片

使用 SBA 的系統通常只會劃分 4 ~ 12 個服務,避免產生過多的數據庫連接。服務數量不多,也決定了 SBA 中的服務相比微服務架構中的服務有著更粗的粒度。User Interface 與服務間通過遠程通信協議來完成業務往來,常見的通信方式有REST、RPC、消息隊列等。需要注意的是, SBA 是不允許服務間通信的 ,這與微服務架構有著本質的區別。

大多數情況下, SBA 中的服務只有一個或者少量實例 ,與微服務動輒成百上千個實例有著很大的區別。主要是因為 SBA 服務粒度更粗,無法做到像微服務那樣精準的按需擴容,擴容太多反而會導致資源的浪費。

SBA 的另一大特點是允許所有服務共享同一數據庫實例 ,使得它能夠直接將傳統單體架構的那一套 SQL 查詢邏輯、ACID 事務搬過來,讓架構的演進更加的平滑。不過,共享數據也會帶來一些問題,比如數據模型變更的影響范圍更大,后面會在“ 數據拆分” 一節詳細講述。

拆分 User Interface

在大型系統中,單一的 User Interface 可能導致代碼耦合、性能瓶頸等問題,這時候我們可以進一步對它進行拆分。拆分的方法可以是 基于業務領域的拆分 ,業務相關的幾個服務使用同一個 User Interface;或者 基于服務的拆分 ,為每個服務都配備一個 User Interface。

圖片

拆分 Database

類似地,我們也可以對數據庫進行拆分,可以拆分成幾個服務共享一個實例;也可以像微服務架構中那樣,每個服務獨享一個實例。數據庫拆分的原則就是: 確保數據是解耦的,不會被其他服務所依賴 ,避免出現跨庫查詢或服務間通信。

圖片

增加 API 網關

我們也可以在 User Interface 和 Domain Services 之間增加一個 API 網關層,提供流控、鑒權、指標統計、服務發現等公共能力,進一步提升系統架構的安全性、可靠性、可維護性。

圖片

業務服務的設計

SBA 中的服務具有較粗的粒度,因此在業務服務的架構設計上通常也會用到一些單體架構模式,常見的有分層架構和基于領域的 組件化架構

圖片

不管是分層架構還是組件化架構,通常都需要增加一個 API 層,負責編排和轉發來自 User Interface 的業務請求。下面以訂單創建流程作為示例。

假設現在有一個訂單服務 OrderService,當它的 API 層接收到來自 User Interface 的訂單創建請求時,API 層協調會各個組件依次完成如下的幾個業務流程 :

  1. 調用訂單組件,完成訂單ID、訂單內容的生成。
  2. 調用支付組件,完成用戶的扣款。
  3. 調用庫存組件,更新商品的庫存數量。

因為這些業務流程都是在同一個服務內完成,當其中的某個流程異常后,我們很容易通過數據庫的 ACID 事務來完成回滾,從而能夠確保 數據的強一致性

相比在微服務架構之下,訂單創建請求往往需要訂單微服務、支付微服務、庫存微服務之間協作來完成,這就涉及到分布式事務,也即 BASE(Basic Availability, Soft state, Eventual consistency) 事務。BASE 事務更加的復雜,而且無法保證數據的強一致性。

當然,更粗的服務粒度也會帶來 服務可用性問題 ,比如在訂單服務例子中,你會因為訂單ID生成邏輯的變更而升級整個服務,也會因為庫存組件中的一個BUG導致整個服務的故障。

所以,服務粒度的粗與細,實際上也是數據一致性和服務可用性的一次 trade-off

數據拆分

服務間共享數據庫使得系統具有更強的數據完整性和一致性,但簡單的單庫單表數據模型會帶來耦合的問題。

在單庫單表的模型下,我們大概率會這么實現,將與數據庫操作相關的實體對象、SQL 邏輯全部封裝在一個共享的 shared lib 庫上,供所有業務服務復用:

圖片

這樣的實現方式雖然簡單,但是會帶來“ 牽一發而動全身 ”的問題。假設某個服務所用到的某個字段類型需要變化,勢必會修改表結構和 shared lib 庫,而這兩者是所有服務共用的,因此也就會導致所有服務都需要升級重新上線。這樣的耦合會給 SRE 帶來極大的困擾,一點也不 敏捷

更好的方法是 根據業務對數據進行拆分 ,將相對獨立的數據拆分成多個表,每個表都有一個獨立的 lib 庫,對于公共表,則有一個 common lib 庫,各服務按需依賴。對于 common lib 庫的變更,我們還可以通過版本控制來盡量降低影響范圍,但必須在 common lib 進行版本升級時 保持向后兼容

圖片

SBA 雖然是分布式架構,但是也保留了單體架構下的一些特點,在架構上具有較高的靈活性,也使得它在各方面的評分都比較高,沒有明顯的缺點。

SBA 是一個 domain-partitioned 的架構,因此適合使用領域驅動設計來進行領域限界上下文的劃分,進而規劃出業務獨立的服務。服務間業務獨立,而且不會相互間通信,也就意味著具有更好的 Testability

前文有提到過,SBA 雖然支持服務實例擴容,但是更粗的服務粒度會導致擴容的性價比并不高,因此 ScalabilityElasticity 得分不高。

ScalabilityElasticity的差異:

  • Scalability 通常指軟件系統在不中斷業務的前提下,通過 scale-up 或 scale-out 等手段來應對更高業務負載,強調的是軟件系統應對高負載的能力。
  • Elasticity 通常指硬件系統能夠根據實際的業務負載情況,適時增加或減少硬件資源,強調的是硬件資源的高效利用。

總結

如果你打算從單體架構演進到分布式架構,SBA 會是一個不錯的選擇

  • 相比單體架構,SBA 按照業務進行服務拆分,在業務解耦、開發流程敏捷等方面有著明顯的優勢。
  • 相比其他分布式架構,SBA 有著更粗的服務粒度,因此也得以減少了服務間的遠程調用、網絡帶寬消耗,受網絡故障的影響更小。
  • 服務間共享數據庫使得 SBA 支持 ACID 事務,在數據一致性方面具有良好的表現,但我們還是應該盡量按照業務進行分表,避免出現嚴重的數據耦合。
  • 在架構評分上,SBA 各方面評分都不錯,沒有明顯的缺點,是典型的“ 六邊形戰士 ”。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 架構
    +關注

    關注

    1

    文章

    519

    瀏覽量

    25549
  • 微服務架構
    +關注

    關注

    0

    文章

    25

    瀏覽量

    2979
收藏 人收藏

    評論

    相關推薦

    微服務架構和CQRS架構基本概念介紹

    微服務架構現在很熱,到處可以看到各大互聯網公司的微服務實踐的分享總結。但是,我今天的分享和微服務沒有關系,希望可以帶給大家一些新的東西。如果一定要說
    發表于 05-22 09:03

    微服務優勢_微服務架構的好處與不足

    微服務是用一組小服務的方式來構建一個應用,服務獨立運行在不同的進程中,服務之間通過輕量的通訊機制(如RESTful接口)來交互,并且服務可以
    發表于 02-23 11:24 ?4415次閱讀

    什么是微服務架構_微服務架構的優缺點及應用

    什么是微服務架構 簡單地說,微服務是系統架構上的一種設計風格, 它的主旨是將一個原本獨立的系統拆分成多個小型服務,這些小型
    的頭像 發表于 06-02 10:03 ?1.7w次閱讀
    什么是<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>_<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>的優缺點及應用

    SOA架構微服務架構的主要區別

    SOA和微服務架構一個層面的東西,而對于ESB和微服務網關是一個層面的東西,一個談到是架構風格和方法,一個談的是實現工具或組件。SOA架構
    的頭像 發表于 05-04 14:11 ?5909次閱讀
    SOA<b class='flag-5'>架構</b>和<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>的主要區別

    微服務架構有哪些_微服務架構設計模式

    小伙伴們知道常用的微服務架構框架有哪些嗎?上回我們介紹了一些常用的微服務架構設計模式,這次我們就來了解一下一些常用的
    的頭像 發表于 05-17 17:06 ?2.9w次閱讀
    <b class='flag-5'>微服務</b><b class='flag-5'>架構</b>有哪些_<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>設計模式

    微服務架構的特點_微服務架構適用場景

     微服務架構是一項在云中部署應用和服務的新技術。
    的頭像 發表于 05-17 17:28 ?5207次閱讀

    微服務軟件架構應用研究綜述

    自2014年,微服務架構概念經Martin Flower提出以來,受到廣泛關注,為更好了解微服務架構風格,本文首先分析、梳理了軟件架構的發展
    發表于 05-26 09:26 ?2次下載

    分層架構微服務架構介紹(一)

    們看到一個架構模式的名字時,也要馬上想到對應的架構圖及其基本特點。比如,當談到**分層架構**時,我們就應該想起它的架構圖是怎樣的、有哪些出
    的頭像 發表于 05-10 16:55 ?1164次閱讀
    <b class='flag-5'>從</b><b class='flag-5'>分層</b><b class='flag-5'>架構</b><b class='flag-5'>到</b><b class='flag-5'>微服務</b><b class='flag-5'>架構</b><b class='flag-5'>介紹</b>(一)

    分層架構微服務架構介紹(二)

    系統按照功能劃分成前端和后端,分別部署在兩臺服務器上,問題得到了緩解,于是便有了**Client/Server架構**的出現。
    的頭像 發表于 05-10 16:57 ?782次閱讀
    <b class='flag-5'>從</b><b class='flag-5'>分層</b><b class='flag-5'>架構</b><b class='flag-5'>到</b><b class='flag-5'>微服務</b><b class='flag-5'>架構</b><b class='flag-5'>介紹</b>(二)

    分層架構微服務架構介紹(三)

    **管道架構** (Pipeline Architecture),通常也被稱為 **管道-過濾器架構** (Pipes and Filter Architecture),是最常用的架構模式之一
    的頭像 發表于 05-10 16:58 ?705次閱讀
    <b class='flag-5'>從</b><b class='flag-5'>分層</b><b class='flag-5'>架構</b><b class='flag-5'>到</b><b class='flag-5'>微服務</b><b class='flag-5'>架構</b><b class='flag-5'>介紹</b>(三)

    分層架構微服務架構介紹(四)

    微內核架構 (Microkernel Architecture),也被稱為 **插件式架構** (plug-in architecture),作為一個在幾十年前就被創建出來的架構模式,它如今仍然被
    的頭像 發表于 05-10 17:00 ?811次閱讀
    <b class='flag-5'>從</b><b class='flag-5'>分層</b><b class='flag-5'>架構</b><b class='flag-5'>到</b><b class='flag-5'>微服務</b><b class='flag-5'>架構</b><b class='flag-5'>介紹</b>(四)

    springcloud微服務架構

    Spring Cloud是一個開源的微服務架構框架,它提供了一系列工具和組件,用于構建和管理分布式系統中的微服務。它基于Spring框架,旨在通過簡化開發過程和降低系統復雜性來幫助開發人員構建彈性
    的頭像 發表于 11-23 09:24 ?1468次閱讀

    docker微服務架構實戰

    的容器化技術,為微服務架構的實施提供了強大的支持。本文將介紹Docker微服務架構的實戰經驗,包括Docker的概述、
    的頭像 發表于 11-23 09:26 ?688次閱讀

    設計微服務架構的原則

    微服務是一種軟件架構策略,有利于改善整體性能和可擴展性。你可能會想,我的團隊需不需要采用微服務,設計微服務架構有哪些原則?本文會給你一些靈感
    的頭像 發表于 11-26 08:05 ?635次閱讀
    設計<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>的原則

    架構與設計 常見微服務分層架構的區別和落地實踐

    架構風格越傾向于清晰的職責定位,且讓領域模型成為架構的核心。 基于這些架構風格,在軟件架構設計過程中又有非常多的架構
    的頭像 發表于 10-22 15:34 ?312次閱讀
    <b class='flag-5'>架構</b>與設計 常見<b class='flag-5'>微服務</b><b class='flag-5'>分層</b><b class='flag-5'>架構</b>的區別和落地實踐
    大发888娱乐游戏| 总玩百家乐官网有赢的吗| 大发888帐号注册| 百家乐官网色子玩法| 崇明县| 凯斯娱乐| 爱婴百家乐官网的玩法技巧和规则 | 大发888bet游戏平台| 索罗门百家乐官网的玩法技巧和规则| 真人百家乐作| 百家乐官网平注常赢打法| 太阳城酒店| 巨星百家乐官网的玩法技巧和规则 | 六合彩摇奖结果| 网络百家乐可靠吗| 优博娱乐城| 百家乐视频无法显示| 百家乐官网筹码素材| 百家乐娱乐真人娱乐| 最新百家乐官网电脑游戏机| 赌球网址| 阴宅24水口| 湘潭县| 百家乐论坛博彩啦| 线上百家乐官网赌法| 大发888手机版下载安装| 太阳百家乐官网管理网| 祥云县| 没费用百家乐分析器| 百家乐官网网站可信吗| 德州扑克单机版下载| 波音百家乐现金网| 百家乐官网对子计算方法| 水果机小游戏| 百家乐软件官方| 永利百家乐官网游戏| 百家乐博弈之赢者理论| 新梦想百家乐官网的玩法技巧和规则| 乐九国际| 财神百家乐的玩法技巧和规则| 老k百家乐官网的玩法技巧和规则 KTV百家乐官网的玩法技巧和规则 |