主頁 > 軟體設計 > 微服務架構 | 服務架構的演進

微服務架構 | 服務架構的演進

2022-10-11 07:20:56 軟體設計

hi,這里桑小榆,

本篇,我們開始探討微服務架構這塊內容,并打算專門寫一個微服務的專欄,寫微服務的知識體系其實早有動機,把微服務架構知識梳理完整,由于很多因素沒能開展開來,所以一直擱置了,

這次,我繼續持大道至簡的思想,來探討微服務架構的全面內容,盡管我們在實際作業中并沒有用到這塊內容,本職本分或許是螺絲釘角色,但微服務的熱門程度以及發展趨勢,迫切使你很有必要了解這塊內容,并當作知識儲備起來,也許有朝一日在面試中或者和碼友談論時也能夠有些觀點,

我們先不直接引出微服務的概念,我們先了解一下軟體架構的演進,畢竟了解一個事務最好的出發點是了解它的背景,由來以及發展,為后續了解微服務更加的得心應手,

單體架構

在早期90年代互聯網發展中,產生了軟體工程,并催生了以C語言為代表的面向物件的高級語言,同時,單體架構也由此產生,我相信從事it行業的小伙伴對單體架構并不陌生,當時軟體概念還沒普及,面對需求更多以一個單體專案開發的功能模塊,所有的代碼邏輯耦合在一起,一兩個人就可以負責所有的功能業務開發,對于當時的用戶使用量來說,單體架構足夠應付,

單體架構的方式,直接干練,到目前為止使用量也不在少數,畢竟這種架構方式也符合人類便捷思維的一種方式,類似的提出面向物件思想之前,使用的面向程序思想,一個功能按照有序的順序一步步撰寫有序呼叫,這也是人們傾向的思考思維,

很明顯,我們能夠看到單體架構的優勢:

易于開發,直接使用開發工具創建一個專案即可入手開發,

易于部署,開發完之后,直接打包部署在適應的服務器,例如:apache,iis,tomcat等,

易于擴展,需要擴展的功能我們也可以直接下手開發,甚至可以將專案打包多份運行在多臺服務器實作負載均衡,

然而,以現在用戶使用量的角度來看單體架構,它的弊處也隨處可見,

龐大的單體代碼庫,會嚇倒自己和同事,也會嚇跑新手,一時接手也需要花不少時間去逐個理解,單體架構龐大之后沒有清晰的模塊劃分,可能會隨著時間推移,且每個人代碼習慣也會面臨不一樣,導致模塊被分解,整體代碼變得越來越難理解,代碼的質量也逐漸下降,也就是我們俗稱的“shit mountain,”誰碰誰倒霉!

IDE過載較大,面臨成堆的代碼量,你可能早上高興上班,啟動專案的時間就已經喝了兩杯咖啡了,或許新同事的不正確操作引來一堆紅色警告,上午時間沒了,血壓也上去了,

持續部署的困難,面臨大型單體應用程式,剛開始開發完很順利,部署也很順利,然而,產品經理每次經過你的崗位,面帶微笑,提了一堆需求給你,今晚改完發布,

改完之后你需要重新部署整個應用程式,有時還得先中斷其他后臺任務,無論受不受你當前更改的影響,最終導致問題的概率增加,

或許因為新需求改動了組件,一部署即error警告,此時整個專案便無法運行,或許你在代碼里不小心寫了一行讓cpu飆升的代碼,導致服務器宕機整個服務也無法使用了,真讓人頭大,

擴展應用程式可能變得困難,單體架構擴展只能在本身程式里擴展,我們雖然可以通過復制部署到多臺服務器或者云服務來部署實作負載均衡,并根據負載數量來調整實體數量(也就是拷貝部署多少個服務),

但是在與資料互動時,所有服務始終都是使用一個資料庫訪問所有資料,這很顯然降低了快取效率并增加了記憶體消耗和IO流量,也就是資料訪問量上來了,本該走快取了卻直接跑去訪問資料庫,大量訪問資料庫的同時需要頻繁調度記憶體以及頻繁輸送資料,這將會是很糟糕的情況,

擴展開發的障礙,單體應用也會阻礙擴展開發,到了一定規模之后,我們很難將UI,商品,庫存分開獨立開發,都將在一個應用程式里開發,任何一個出問題或者拖延了開發周期都將會影響到整個的服務,團隊也將必須協調開發作業和重新部署,

需要對技術堆疊做出長期承諾,開發單體程式被迫使你在開發之初時選擇的技術堆疊要保持一致,如果我們當初選擇了C#開發,那么后期想使用Go開發,那么將會是一件困難的事情,因為單體程式很難兼容其他的技術堆疊使用,要么將選擇重構,面對龐大的單體程式重構一堆“shit mountain”將會面臨不小的挑戰,

說了單體應用的諸多缺點,并不是我在找茬,它本身不是缺點,是在于面對型應用和超大型應用的出現(單純應用的龐大,用戶數并不龐大),以及用戶量劇增時體現出來的不適用性,迫切需要新的且適應的架構方式來解決我們的麻煩,

垂直架構

于是,垂直架構出現了,也成為豎井式架構,可能有伙伴沒聽過垂直架構,這也是架構演進的一種必然趨勢,面對單體架構的不足,架構師們很顯然會從單體架構里按照業務做垂直劃分成多個單體應用,此時由原來的單體應用變成了多單體應用部署,所謂的垂直就是在一個應用里,根據業務來劃分獨立的模塊,每個業務模塊做專一的事情并沒有直接的關聯,

 

將龐大的系統進行劃分多個單體應用,可以很好地實作流量分擔,解決一定程度的并發問題,

可以針對不同模塊進行優化,將減少因為一個改動影響整個系統的麻煩,

更加方便水平擴展,也就是多個單體里每個單體拷貝副本部署到多個服務器里,更好地實作負載均衡,容錯率也顯著提高,

單體之間相互獨立,互不影響,針對不同模塊進行優化,不會因為一個組件或者一個error導致整個系統崩潰,面對新增業務的迭代更加高效,

然而,雖然是將一個單體拆分為多個單體,但是必然需要服務之間互相呼叫,如果某個服務的埠或者ip發生改變,呼叫的系統也需要手動更改,偏向硬編碼,

搭建集群時,我們拆分的多個單體應用并拷貝副本部署多套服務搭建在一起共同作業,集群之后看似一個完整的個體應用實則內部多個節點互相協同負載作業均衡,但是,垂直架構的集群將會面臨內外網負載的問題,遷移機器時影響呼叫方的路由,導致路徑故障無法正常使用,

服務之間的呼叫方式存在不統一,基于httpclient,webservice等介面的協議不統一,

服務監控不夠健全,除了依靠埠、行程監控這些能夠提供監控,其余呼叫的成功率、失敗率、耗時等等指標性的是沒有的,

所以面對現有的瓶頸,且伴隨互聯網的急劇發展,應用的使用逐漸普及挨家挨戶,用戶規模呈指數級增長,垂直架構雖然能夠應付應用的龐大,但是很難滿足承載海量用戶的需求,并且隨著分布式理論和分布式技術的日漸成熟,面向服務架構(SOA)開始出現,并廣泛應用于大型的系統上,

 

面向服務架構

面向服務架構(SOA),可以理解為一個組件模型,將應用程式按照不同功能單元(稱為服務)進行拆分,使得這些服務之間定義良好的介面和協議聯系起來,

 

它的宗旨在于將程式或軟體組件構建為服務,提供一種發布可用服務機制,包括它們的功能和輸入輸出(I/O)要求,并且控制這些服務的正常使用以及避免安全和治理問題,

看到這里,你會發現面向服務架構對于應用的拆分相比于垂直機構的拆分,顆粒度粗細上明顯細了一個量級,

面向服務架構的模式主要有兩種,一種是企業服務總線(ESB)為代表的SOA,另一種是RPC為代表的SOA,

企業服務總線(ESB),是一種模式,當我們通過SOA按照不同功能進行拆分的多個服務,然后我們搭建一個訊息總線,來連接這些拆分的各個服務,所有的服務產生的訊息都需要經過訊息總線,通過訊息總線來進行轉化、解釋以及路由作業,達成了一種以訊息總線為中心的服務通訊的協議,

RPC(remote procedure call)遠程程序呼叫,也就是本地呼叫一個函式或者物件方法,實際上是呼叫了遠程服務器上的函式和方法,這也很好理解,我們劃分了多個一定顆粒的服務,此時是游離且獨立的,我們需要使得這些服務具備互相通訊的功能,我們會想到http或者webservice來進行通訊,也是rpc思想的一種體現,http雖然具備完整的通訊體系和標準的規范,但是滿足不了企業的內網和外網之間日益復雜的資訊互動,所以現如今成熟的prc框架也有不少,可以拿來使用,例如:阿里巴巴開源的Dubbo,微博開源的Motan,騰訊開源的Tars,國外Pivotal公司開源的SpringCloud,谷歌開源的gPRc,facebook開源的Thrift等,這里不再展開講解框架的內容,有興趣伙伴可各自翻閱相關資料,

相比于ESB和RPC這兩種模式,由于ESB的初始搭建需要一定的人力物力,以及面對持續高漲的資料通訊壓力而難以追蹤,人們更加傾向于使用RPC模式,可以直接參考標準的http來通訊,或者使用開源的框架,

我們可以看到面向服務架構(SOA)的優點:

可重用性高,由于一個個服務具備獨立且規范的restful風格,我們不再需要重構或者考慮它的底層技術堆疊如何,

易于維護,因為所有的服務都是相互獨立的,因為我們可以輕松應對后期的修改和更新,不會影響到其他服務,很好地降低了組織的運營成本,

促進互操作性,我們使用標準化的通訊協議使得平臺能夠輕松地在客戶端與服務之間傳遞資料,無需考慮它們所構建的語言是什么,

高可用性,我們可以很好的提供服務的可用性,服務的獨立增加系統的容錯率,通過集群可以大大的提高服務的可用性,

高可靠性,SOA架構能夠生成可靠的應用程式,因為除錯小型服務要比除錯大型服務要方便的多,

可擴展性,SOA架構使得服務可以在不同的服務環境運行,從而提高了可擴展性,此外,使用標準通訊協議允許組織降低客戶端和服務器之間的互動級別,降低互動級別允許在不增加額外的壓力情況下進行擴展應用程式,

但是SOA的架構的ESB模式由于本身存在復雜性,和internetrestful api模型也不兼容,且面對高漲的資料通訊一時也難以捕捉和追蹤,

SOA架構的初期實施也需要大量的人力和物力的投資,

服務管理很復雜,因為服務交換了數百萬條資料難以跟蹤訊息,

每次服務通訊時都會驗證服務的輸入引數,從而降低性能并增加負載和相應時間,

 

總結

發展到SOA時,更多的使用這些架構的驅動力是業務推動的,由于restful(統一介面服務原則)的出現,人們更為廣泛接受這個模式,將廣泛的“服務”概念轉換為“軟體流程”而不是“業務流程”,并且以軟體架構為中心的趨勢,也就是說我們常說的微服務,微服務對于服務的分解更為多樣,比如我們可以根據業務能力拆分、子域拆分、獨立服務,按照團隊等,

 

當然這些思想將會在后續逐一探討,本篇主要以服務架構的演進為主,

縱觀以上服務架構演進的歷程,我們很容易發現軟體架構演進的規則,那就是一個字:拆!從一個單體應用拆分為多個單體,再進行拆分,拆分為眾多的小型服務,最終拆分成一個個細微且獨立的服務,每個獨立的服務擁有高度自治的能力,這也是去中心化的體現,

好了,軟體架構的發展部分就到這了,如果有興趣對文中提到的技術堆疊感興趣也可去多了解,接下來我們一起推進微服務,認識微服務到底是啥,

拋一個網路出現的一個話題:領導說把服務拆分開來,就是在做微服務,對此你怎么看呢?

 

喜歡的話,點個??也是支持~

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

標籤:其他

上一篇:AgileBoot - 基于SpringBoot + Vue3的前后端快速開發腳手架

下一篇:技術方案設計沒有深度?試試這套方法論

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