主頁 > 軟體設計 > 除了微服務,我們還有其他選擇嗎?

除了微服務,我們還有其他選擇嗎?

2021-12-08 09:31:50 軟體設計

除了微服務,我們還有其他選擇嗎?

你好,我是看山,

前面我們聊了微服務的話題,現在微服務已經是業內通識,但凡系統開發、系統設計,必然采用微服務架構,或者宣稱是微服務架構,

但大家有沒有想過,微服務架構不是一開始就有的,如果追溯歷史,微服務最早在 2005 的云計算博覽會,由 Peter Rodgers 博士提出(那時候稱為微 Web 服務(Micro-Web-Service)),到了 2014 年,Martin Fowler 與 James Lewis 共同提出微服務(Micron-Service)的概念,算是對概念歸納總結,天下一統,這一年也被稱為微服務元年,

看山的小屋

那就要問了,在 2014 年之前呢?大家用啥架構?再往前呢?上次互聯網大潮的時候,大家又是用啥?我們今天來聊聊這段歷史,可能你會對現在習以為常的架構,產生一些新的看法,在架構上,可以有更多的選擇,

人人喊打的單體架構

單體架構,人人都說這種架構不好,為什么不好呢?真的不好嗎?可能真相并不是你認為的那樣簡單,

當前來說,如果有人說某個系統是單體架構,一定會有人投來懷疑的眼神,有的會帶著些許不可思議,甚至帶有一絲鄙夷,但是不得不說,單體架構(又稱巨石系統,Monolithic)是整個軟體發展程序中,出現時間最早、應用范圍最廣的一種架構風格,從另一個方面,原來本沒有單體架構這個稱呼,只是后來有了微服務架構,為了區分,才把所有“自包含”的系統稱為單體架構,

人人喊打的單體架構構

上面這個圖就是單體架構,所謂“自包含”,簡單說就是自給自足,所有業務功能靠自己,不依賴其他業務系統,其優點有下面這些:

  • 不涉及行程間通信,效率可控;
  • 不依賴網路通訊,可以規避不可靠的網路通訊帶來難以預知的故障;
  • 開發生態良好,目前的 IDE 對單體架構的支持更好;
  • 編碼重構容易,單體架構完全的自控制,只要修改自己即可,不需要上下游支持;
  • 端到端測驗簡單,因為沒有上下游依賴,測驗起來更加方便,部署一套環境,就可以實作當前功能的完全測驗;
  • 部署簡單,只要打包成 EAR、WAR、JAR 等需要的運行包,扔進服務器就能跑;
  • 運維簡單,一個行程運行的服務,無論是日志還是運行態,都能夠很簡單的監控;
  • 橫向擴展容易,前面一個負載均衡器做代理,后面可以無限擴展,

從這個角度,只要單機優勢明顯,就不該把單體架構視為地獄,

所謂“成也蕭何敗也蕭何”,統一“集中”成就了單體架構,難以“隔離”也稱為了單體架構最大的弊端,這里將隔離簡單分為開發期隔離和運行期隔離,

單體架構省去了行程間通信、性能損失這些麻煩事,但因為在一個行程中執行,如果內部的某處邏輯例外,可能會造成整個系統的崩潰,最常見的記憶體溢位,可能僅僅是一個不相干的功能查了全表,整個系統都都會宕掉,

系統崩潰

運行期沒有辦法隔離,升級的時候也沒有辦法隔離,想要對某些模塊功能升級,只能重啟整個服務,還要擔心會不會有沒有覆寫測驗的點,提前做好預案,掛好停機維護頁,

因此,一個成功的單體架構系統隱含了一個要求,需要一個對系統完全了解的大腦(一個人或一組人),大腦可以總控系統的開發、升級、運行,把控這個系統的每個細節,實作系統中的各個組件、模塊有很高的品質,從而保障系統可在其生命周期內可以穩定的運行,

比如,SAP 和 Hyperion,妥妥的單體架構,作為國際化的軟體公司,為什么不對它們升級改造?是能力不行,還是技術不行?是沒有必要,所以,單體架構也不是一無是處,一切都要在合適的前提下評價,

開疆拓土的 SOA 架構

都說 SOA 架構太重,但他是開創服務化江山的鼻祖,

開疆拓土的 SOA 架構

單體架構對團隊的要求較高,隨著團隊的擴大,必然會有短板或薄弱的環節,或者是組織、或者是個人,這樣就會給系統代理風險,于是,很多前輩就開始思考,一個龐然大物難以維護,那就分為治之,拆分成多個規模小一些的單體架構,彼此之間通過某種方式互動,這種方案被稱為面向服務架構(SOA,Service-Oriented Architecture),

SOA 在 1994 年就被提出,這種架構風格是自然演化來的,只不過當時沒有足夠的條件支持,一直只能處于理論階段,后來隨著 webservice 等技術的提出,才有了技術支撐,到 2006 年,OSOA 成立,共同指定 SOA 架構相關行業標準,這套架構有了理論、技術、規范等一系列約定,從而真正落地,

SOA 架構開疆拓土,開創了很多目前也在使用的概念,比如服務注冊/發現、服務治理、系統隔離、服務編排等,是不是覺得這些概念很熟悉,是的,在微服務架構中,同樣有這些概念的身影,SOA 架構又自己的一套風格,使用下面一些組件實作普適的方法論:

  1. 采用 SOAP 作為遠程呼叫的協議;
  2. 利用 ESB(Enterprise Service Bus,企業服務總線)實作各個子系統之間的通信互動;
  3. 使用 BPM(Business Process Management,業務流程管理系統)實作業務流程編排;
  4. 使用 SDO(Service Data Object,服務資料物件)來訪問和表示資料;
  5. 使用 SCA(Service Component Architecture,服務組件架構)來定義服務封裝的形式和服務運行的容器;
  6. ……

SOA 架構是各大軟體服務商共同愿景下的產物,總結出了一套自上而下的軟體研發方法論,期望能夠解決軟體開發程序中的所有問題,有些類似于八股文,規定好起承轉合,只要按照要求來,系統就不會出現太多問題,

愿景雖好,但是卻忽略了一點,一套大而全的架構體系,不是所有公司都能夠支撐起來的,有時候,大而全不如小而美,但是,我們不能否認 SOA 架構對于面向服務理論的貢獻,在某些場景下的企業內部,SOA 是能夠快速打破資訊孤島的重要手段,

另立門戶的微服務架構

本來是作為 SOA 的一種簡化方案,結果直接發動宣武門之變,逼著 SAO 禪讓,

另立門戶的微服務架構

如開篇所說,微服務架構是在 2005 年提出,在 2014 年崛起,經歷了將近 10 年的時間,之所以沒有得到太多重視,是因為 2014 年之前,微服務只是在作為 SOA 架構的簡化版出現,直到 2014 年才作為獨立的架構風格,與 SOA 架構劃清界限,

Martin Fowler 與 James Lewis 在合寫的 《Microservices》 對微服務下了定義:“微服務是一種通過多個小型服務組合來構建單個應用的架構風格,這些服務圍繞業務能力而非特定的技術標準來構建,各個服務可以采用不同的編程語言,不同的資料存盤技術,運行在不同的行程之中,服務采取輕量級的通信機制和自動化的部署機制實作通信與運維,”

文中還提出了微服務架構的 9 個核心特征:

  1. 通過服務來實作獨立自治的組件(Componentization via Services)
  2. 圍繞業務能力構建(Organized around Business Capability)
  3. 產品化思維(Products not Projects)
  4. 強終端弱管道(Smart Endpoint and Dumb Pipe)
  5. 分散治理(Decentralized Governance)
  6. 資料去中心化(Decentralized Data Management)
  7. 基礎設施自動化(Infrastructure Automation)
  8. 容錯性設計(Design for Failure)
  9. 演進式設計(Evolutionary Design)

由于微服務架構是從 SOA 架構中演化而來,所以很多的表現形式都是一致的,從《Microservices》對微服務架構全面細致闡述之后,也算是將微服務架構與 SOA 架構徹底劃清界限,

在筆者看來,微服務架構與 SOA 架構最大的不同在于對于實作的約束,SOA 架構有一套完整的規約,微服務架構只有建議,追求的是根據實際情況自由變化,簡單的理解就是“想怎么玩就怎么玩”,比如通信協議,SOA 架構明確要求使用 SOAP 通信協議;微服務架構只要求使用輕量級的 RPC 協議,這個選擇就比較寬泛了,常見的就有 HTTP(一般采用 Restful 風格)、gRPC、Dubbo、Thrift、Motan2 等等,

自由意味著可以根據實際情況變化,需要什么引入什么,哪種技術能更好的解決問題就使用哪種技術,在 Java 堆疊中,也出現了 SpringCloud Netflix 和 SpringCloud Alibaba 之類的全家桶組件,作為開發者,只需要在需要的時候添加依賴即可,

從架構師的角度,自由帶來的是約束力的下降,同時也缺少了規約的指導性,我們需要更加了解系統本身,也要更加了解各種技術的優缺點,才能夠在架構設計時,更好的權衡利弊,做好取舍,加油,少年,

架構師養成計劃

我們來看下微服務中的基礎組件:彈性伸縮、服務發現、配置中心、服務網關、負載均衡、服務安全、跟蹤監控、降級熔斷等等,其實從本質來說,這些組件都是業務無關的,實作軟體開發程序中,可以將這些與業務隔離開,也就是所謂的“透明化”,

比如服務發現,可選的方案包括 Nginx、HAProxy、DNS、Eureka、Nacos、KubeDNS,但是我們真的關心嗎?不需要,只需要知道我們要進行網路呼叫,有一個目標即可,至于這個目標是通過哪種方式發現、傳輸、尋址,都與我們要實作的功能無關,那就將服務發現與業務剝離,通過承載服務的運行環境處理,這就是所謂的邊車模型,

邊車模型

微服務之所以應用普及,不僅僅在于其獨特優勢,還與容器化技術的普及有密切關系,微服務與 Docker 虛擬化的高效結合,相當于給了微服務二次加速的動力,資源調度 Kubernetes 的成功,可以認為是直接實作了曲速推進,先進的理念還需要先進的技術實作,

有待成熟的無服務架構

有想要快,還想要簡單,那就不要服務了,隨便寫個函式跑跑得了,

有待成熟的無服務架構

就目前而言,絕大部分的系統開發都是為了解決業務問題,在這個程序中,我們需要選擇一些業務無關的技術組件,有時候,我們受限于研發環境,需要的某種技術組價不存在時,需要采購部署,或者使用替代方案,這就會分散我們的注意力,

于是,很多云服務商提出了無服務架構,無服務架構將系統開發涉及的資源分為兩部分:后端設施(Backend)、函式(Function),對應的就是 BaaS(Backend as a Service,后端即服務)和 FaaS(Function as a Service,函式即服務),

這種不能算是架構風格,只能算是一種系統開發程序中的美好愿景,讓開發者只需要關注業務,需要的基礎設施全部由云服務提供,不需要考慮運行容器、基礎設施的部署、服務器運行能力等,只要將開發好的代碼上傳,就可以擁有一個可運行的系統,

但是愿景雖好,但是與自己掌控部署的區別僅在于對于基礎設施的管控程度上,除非出現重大變革,否則這種架構很難像微服務架構一樣普適,但是對于小程式、小型 web 網站、咨詢平臺等模板化的小型系統,采用這種架構還是有很大優勢的,

文末總結

本文從架構演進的角度分析了單體架構、SOA 架構、微服務架構、無服務架構的適用場景,作為架構師,我們在選擇架構師,不應該一味追求主流,也不能盲從大廠的思路,我們要根據自身情況權衡利弊,找到適合的架構風格,

推薦閱讀

  • 什么是微服務?
  • 微服務編程范式
  • 微服務的基建作業
  • 微服務中服務注冊和發現的可行性方案
  • 從單體架構到微服務架構
  • 如何在微服務團隊中高效使用 Git 管理代碼?
  • 關于微服務系統中資料一致性的總結
  • 實作DevOps的三步作業法
  • 系統設計系列之如何設計一個短鏈服務
  • 系統設計系列之任務佇列
  • 軟體架構-快取技術
  • 軟體架構-事件驅動架構

你好,我是看山,游于碼界,戲享人生,如果文章對您有幫助,請點贊、收藏、關注,我還整理了一些精品學習資料,關注公眾號「看山的小屋」,回復“資料”即可獲得,

個人主頁:https://www.howardliu.cn
個人博文:除了微服務,我們還有其他選擇嗎?
CSDN 主頁:https://kanshan.blog.csdn.net/
CSDN 博文:除了微服務,我們還有其他選擇嗎?

👇🏻歡迎關注我的公眾號「看山的小屋」,領取精選資料👇🏻

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

標籤:其他

上一篇:【Linux】行程理解

下一篇:上線專案 Docker部署專案到服務器總結

標籤雲
其他(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