吴忠躺衫网络科技有限公司

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

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

3天內不再提示

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

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

前言

談到軟件系統設計的方法論,在代碼層面,有我們熟悉的23種 設計模式 (design pattern),對應到架構層面,則有所謂的 架構模式 (architecture pattern)。它們分別從微觀和宏觀的角度指導著我們設計出良好的軟件系統,因此,作為一個軟件工程師,我們不僅要熟悉設計模式,對常見的架構模式也要熟稔于心。正如看到一個設計模式的名字腦里就能浮現出大致的結構圖,當我們看到一個架構模式的名字時,也要馬上想到對應的架構圖及其基本特點。比如,當談到分層架構時,我們就應該想起它的架構圖是怎樣的、有哪些出色的架構特征(architecture characteristics)、系統是如何部署的、數據存儲的策略是哪種、等等。

一般地,架構模式大致可以分成兩類, 單體架構 (monolithic architecture)和 分布式架構 (distributed architecture)。本系列文章將會介紹以下8種常用的架構模式:

單體架構

  • 分層架構(Layered architecture)
  • 管道架構(Pipeline architecture)
  • 微內核架構(Microkernel architecture)

分布式架構

  • 基于服務的架構(Service-based architecture)
  • 事件驅動架構(Event-driven architecture)
  • 基于空間的架構(Space-based architecture)
  • 面向服務的架構(Service-oriented architecture)
  • 微服務架構(Microservices architecture)

軟件設計中的謬誤

在介紹架構模式前,我們先談談軟件設計中的 謬誤 (fallacy)。所謂謬誤,就是在設計軟件系統,特別是分布式系統時,我們先入為主地假設它們是正確,但實際上并非如此的一些觀念。這些觀念都是我們在設計軟件時考慮不周的體現。

謬誤1:網絡是可靠的

圖片

網絡是不可靠的

很多軟件工程師常常假設網絡是可靠的,但實際并非如此。相比20年前,現在的網絡會可靠很多,但是仍然具有很大的不確定性。如上圖所述,Serivce B可能完全是正常運行的,但是因為網絡的問題,Service A發出的請求無法到達Service B。一種更糟糕的場景是,Service B可以收到Service A的請求,并處理了相關的數據,但是網絡問題導致了Service A無法收到Service B的響應,從而造成了 數據不一致 。網絡的不可靠也是為什么系統中常常出現服務通信超時、服務熔斷等的原因。

總而言之,如果假設網絡是可靠的,那么我們設計出來的軟件系統將會是不可靠的。

謬誤2:時延是0

圖片

時延不為0

如上圖所示,服務內組件間的函數/方法級別的調用,耗時是微妙,甚至是納秒級別;但是服務間的遠程調用(比如REST、消息隊列、RPC),耗時會是微秒級別,甚至在異常場景會達到了秒級!在設計系統,特別是分布式系統時,時延是一個無法被忽視的因素,我們必須清楚系統的平均時延,否則設計出來的方案可能根本不可行。比如,假設系統中服務間通信時延為100ms,如果一個請求的調用鏈涉及到10個服務,那么該請求的時延將會是1000ms!這么高的平均時延對于一般系統來說是完全無法接受的。

進行系統設計時,考慮平均時延還不夠,更重要的是95th和99th百分點 。一個系統的平均時延可能僅僅只有數十毫秒,但是95th百分點的時延卻達到了數百毫秒,很多時候,這也恰恰成為了拖垮整系統性能的那塊“短板”。

謬誤3:帶寬是無限的

圖片

帶寬是有限的

在單體架構中,業務流程都在單服務內閉環,消耗的帶寬很少甚至為0,因此帶寬并不是主要關注點。一旦將系統拆分成分布式架構,一個業務流程可能涉及多個服務間的通信,帶寬就成了必須考慮的因素。 帶寬的不足,會導致網絡變慢,從而影響系統的時延(謬誤2:時延是0)和可靠性(謬誤1:網絡是可靠的)

如上圖所示,假設在一個Web系統中,Service A負責處理前端請求,Service B負責管理用戶信息(包括姓名、性別、年齡等45個屬性)。Service A每處理一個請求都需要向Service B查詢用戶姓名(200 bytes),而在一次請求中,Service B卻返回了用戶的所有信息(500 kb)。如果系統每秒處理2000次請求,每次請求消耗500 kb帶寬,那么每秒消耗的總帶寬會是1 Gb!如果Service B僅僅返回必須的姓名,那么同等條件下,每秒消耗的總帶寬僅僅是400 kb。

此類問題就是所謂的 stamp coupling ,解決方法也很多,比如在請求中添加屬性選擇,使用GraphQL替代REST。 相比于這些技術手段,更重要的是確定服務間通信所需的最小數據集,并在進行系統設計時將其作為一個重點關注的因素

謬誤4:網絡是安全的

圖片

網絡是不安全的

VPN、防火墻等的廣泛使用,使得很多工程師在設計系統時忽略了“ 網絡是不安全的 ”這一重要原則。特別是從單體架構演進到分布式架構以后,系統被攻擊的概率將會大大增加。 因此,在分布式系統中,每個服務都必須是安全的endpoint,這樣才能確保任何未知或惡意的請求都被攔截掉 。當然,安全是有代價的,這也是像微服務架構這類細服務粒度的系統,一次業務請求中調用鏈過長后性能極速下降的重要原因。

謬誤5:網絡拓撲一成不變

圖片

網絡拓撲是時常變化的

這里的網絡拓撲指的是系統運行時所涉及到的網絡設備,包括所有的路由器、防火墻、集線器、交換機等。很多工程師會假設網絡拓撲是固定的,然而并非如此。

假設如下場景,為架構師的你在周一早上回到公司后,發現組內同事都在為系統中所有的服務間通信都在不斷出現響應超時現象而抓狂,但奇怪的是周末并沒有做服務變更。經過幾個小時的攻關后,你發現周一凌晨2點時有過一次網絡升級,而恰恰是這次“次要”的網絡升級,推翻之前設計系統時的時延假設,從而觸發了本次事故。

因此, 軟件工程師也需要與網絡管理員時常聯系,確保在每次網絡升級前都明確網絡拓撲的變更點,從而做出相應的調整

謬誤6:只有一個網絡管理員

網絡管理員往往不止有一個,特別是在“云”時代,數據中心分散在多個地域,理所當然也存在著多個局域網。運行在“云”上的系統很有可能跨越多個數據中心,因此工程師們應當感知各個數據中心的網絡管理員對網絡的相關操作,提前做出應對措施,避免出現因網絡拓撲變更(謬誤5:網絡拓撲一成不變)而導致的服務通信超時,甚至觸發服務熔斷。

謬誤7:通信成本為0

圖片

通信成本不為0

這里的通信成本并非指網絡時延,而是指每增加一次服務間調用所導致的的花銷。很多工程師在設計系統時常常忽視掉通信成本,大家都在鼓吹分布式架構相對了單體架構的優越性,卻忘記了它帶來的服務器、防火墻、網關等硬件的數量增加,這些都是白花花的銀子。

因此,在進行系統設計時,我們也應該將硬件資源和網絡拓撲納入考慮因素。

謬誤8:網絡是同質的

圖片

網絡并非同質的

很多工程師都會假設網絡是同質的,也就是所有的網絡設備都來自同一硬件廠商,這當然也是一個謬誤。實際上, 一個大的通信網絡中,硬件設備往往來自于不同的廠商,這得益于網絡協議標準的統一 。廠商間設備的協作測試畢竟不會太充分,在一些特殊場景下極有可能存在網絡丟包,從而影響了網絡的可靠性(謬誤1:網絡是可靠的)、時延(謬誤2:時延是0)以及帶寬(謬誤3:帶寬是無限的)。

一切從“大泥球”開始

“大泥球”架構是著名的反模式架構,最初在1997年由Brian Foote 和 Joseph Yoder提出。在“大泥球”架構里,系統沒有進行內部的模塊劃分,代碼耦合嚴重,調用關系混亂,就像一個大的泥球。如上圖所示,每一個點代表一個類,紅線則表示類之間的耦合關系。這樣的架構對需求變更極不友好,往往牽一發而動全身,而且在部署、可測試性、性能等方面也存在著很多問題。所有的架構師都在極力避免“大泥球”的出現,但很不幸的是,它仍然在實際項目中很常見,特別是項目伊始,代碼質量和結構還沒被嚴格管控起來前。

有反模式的出現,必然就有解決它的方法,這便是架構模式,從下一篇文章開始,我們將逐個介紹常見的8種架構模式。

總結

跟設計模式類似,架構模式是軟件工程師們多年來在架構設計方面的經驗總結。每種架構模式并沒有絕對的優劣之分,我們不能說微服務架構就一定比單體分層架構優越,它們都有著各自的應用場景。分布式架構比單體架構有著更好的可擴展性、容錯性,但也帶來了更高的復雜性,比如分布式事務。因此,我們應該熟知各個架構模式的特點,這樣才能在特定的業務場景使用合適的架構模式。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 分布式
    +關注

    關注

    1

    文章

    924

    瀏覽量

    74610
  • 架構
    +關注

    關注

    1

    文章

    519

    瀏覽量

    25552
  • 系統設計
    +關注

    關注

    0

    文章

    154

    瀏覽量

    21656
收藏 人收藏

    評論

    相關推薦

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

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

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

    什么是微服務架構 簡單地說,微服務是系統架構上的種設計風格, 它的主旨是將個原本獨立的系統拆
    的頭像 發表于 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和微服務網關是個層面的東西,個談到是
    的頭像 發表于 05-04 14:11 ?5911次閱讀
    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次下載

    什么是微服務架構

    在Medium,我們的技術堆棧始于2012年的單片Node.js應用程序。我們已經構建了幾個衛星服務,但我們還沒有制定個系統地采用微服務架構的策略。隨著系統變得越來越復雜并且團隊不斷
    的頭像 發表于 02-24 11:15 ?1385次閱讀
    什么是<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>(四)

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

    本文要介紹的是 服務架構 (Service-Based Architecture, SBA )。 SBA 可以看成是單體架構微服務
    的頭像 發表于 05-10 17:02 ?885次閱讀
    <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 ?1471次閱讀

    docker微服務架構實戰

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

    設計微服務架構的原則

    微服務種軟件架構策略,有利于改善整體性能和可擴展性。你可能會想,我的團隊需不需要采用微服務,設計微服務
    的頭像 發表于 11-26 08:05 ?636次閱讀
    設計<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>的區別和落地實踐
    百家乐官网投注打三断| 百家乐是个什么样的游戏| 百家乐去澳门| 百家乐正负计| 太阳城百家乐怎样开户| 12倍百家乐官网秘籍| 网络百家乐官网游赌博| 百家乐官网破解赌戏玩| 免费百家乐官网计划工具| 蓝盾百家乐赌场| 大发888下载网站| 米易县| 有破解百家乐官网仪器| 大赢家百家乐66| 下载百家乐的玩法技巧和规则| 威尼斯人娱乐会所| 博乐市| 破战百家乐官网的玩法技巧和规则 | 大发888赌场是干什么的| 博彩娱乐场| 百家乐官网娱乐场开户注册| 网上百家乐官网赌| 百家乐路技巧| 得荣县| 24山 分金 水口 论 吉凶| 网上百家乐公司| 网上最好赌博网站| 金字塔百家乐官网的玩法技巧和规则| 百家乐经验在哪找| 大发888优惠代码| 金城百家乐官网玩法| 真人百家乐娱乐场| 大发888客服电话| 百家乐官网推广| 百家乐英皇娱乐场| 在线真钱游戏| 在线百家乐官方网| 大发888在线服务| 王牌百家乐官网的玩法技巧和规则| 大发888手机版客户端| 百家乐官网游戏辅助|