主頁 > 後端開發 > 4 大軟體架構,你們公司用哪種?

4 大軟體架構,你們公司用哪種?

2021-01-11 12:20:48 後端開發

作者:SimpleEasy
鏈接:https://www.jianshu.com/p/e7b992a82dc0

如果一個軟體開發人員,不了解軟體架構的演進,會制約技術的選型和開發人員的生存、晉升空間,這里我列舉了目前主要的四種軟體架構以及他們的優缺點,希望能夠幫助軟體開發人員拓展知識面,

一、單體架構

單體架構比較初級,典型的三級架構,前端(Web/手機端)+中間業務邏輯層+資料庫層,這是一種典型的Java Spring mvc或者Python Drango框架的應用,其架構圖如下所示:

單體架構

單體架構的應用比較容易部署、測驗, 在專案的初期,單體應用可以很好地運行,然而,隨著需求的不斷增加, 越來越多的人加入開發團隊,代碼庫也在飛速地膨脹,慢慢地,單體應用變得越來越臃腫,可維護性、靈活性逐漸降低,維護成本越來越高,下面是單體架構應用的一些缺點:

復雜性高: 以一個百萬行級別的單體應用為例,整個專案包含的模塊非常多、模塊的邊界模糊、 依賴關系不清晰、 代碼質量參差不齊、 混亂地堆砌在一起,可想而知整個專案非常復雜, 每次修改代碼都心驚膽戰, 甚至添加一個簡單的功能, 或者修改一個Bug都會帶來隱含的缺陷,

技術債務: 隨著時間推移、需求變更和人員更迭,會逐漸形成應用程式的技術債務, 并且越積 越多,“ 不壞不修”, 這在軟體開發中非常常見, 在單體應用中這種思想更甚, 已使用的系統設計或代碼難以被修改,因為應用程式中的其他模塊可能會以意料之外的方式使用它,

部署頻率低: 隨著代碼的增多,構建和部署的時間也會增加,而在單體應用中, 每次功能的變更或缺陷的修復都會導致需要重新部署整個應用,全量部署的方式耗時長、 影響范圍大、 風險高, 這使得單體應用專案上線部署的頻率較低, 而部署頻率低又導致兩次發布之間會有大量的功能變更和缺陷修復,出錯率比較高,

可靠性差: 某個應用Bug,例如死回圈、記憶體溢位等, 可能會導致整個應用的崩潰,

擴展能力受限: 單體應用只能作為一個整體進行擴展,無法根據業務模塊的需要進行伸縮,例如,應用中有的模塊是計算密集型的,它需要強勁的CPU; 有的模塊則是IO密集型的,需要更大的記憶體, 由于這些模塊部署在一起,不得不在硬體的選擇上做出妥協,

阻礙技術創新: 單體應用往往使用統一的技術平臺或方案解決所有的問題, 團隊中的每個成員 都必須使用相同的開發語言和框架,要想引入新框架或新技術平臺會非常困難,

二、分布式應用

中級架構,分布式應用,中間層分布式+資料庫分布式,是單體架構的并發擴展,將一個大的系統劃分為多個業務模塊,業務模塊分別部署在不同的服務器上,各個業務模塊之間通過介面進行資料互動,

資料庫也大量采用分布式資料庫,如redis、ES、solor等,通過LVS/Nginx代理應用,將用戶請求均衡的負載到不同的服務器上,其架構圖如下所示:

分布式架構

該架構相對于單體架構來說,這種架構提供了負載均衡的能力,大大提高了系統負載能力,解決了網站高并發的需求,

另外還有以下特點:

降低了耦合度:把模塊拆分,使用介面通信,降低模塊之間的耦合度,

責任清晰:把專案拆分成若干個子專案,不同的團隊負責不同的子專案,

擴展方便:增加功能時只需要再增加一個子專案,呼叫其他系統的介面就可以,

部署方便:可以靈活的進行分布式部署,

提高代碼的復用性:比如service層,如果不采用分布式rest服務方式架構就會在手機wap商城,微信商城,pc,android,ios每個端都要寫一個service層邏輯,開發量大,難以維護一起升級,這時候就可以采用分布式rest服務方式,公用一個service層,

缺點 : 系統之間的互動要使用遠程通信,介面開發增大作業量,但是利大于弊,

另外,關注公眾號Java技術堆疊,在后臺回復:面試,可以獲取我整理的 Java 分布式系列面試題和答案,非常齊全,

三、微服務架構

微服務架構,主要是中間層分解,將系統拆分成很多小應用(微服務),微服務可以部署在不同的服務器上,也可以部署在相同的服務器不同的容器上,當應用的故障不會影響到其他應用,單應用的負載也不會影響到其他應用,其代表框架有Spring cloud、Dubbo等,

其架構圖如下所示:

微服務架構

易于開發和維護: 一個微服務只會關注一個特定的業務功能,所以它業務清晰、代碼量較少, 開發和維護單個微服務相對簡單,而整個應用是由若干個微服務構建而成的,所以整個應用也會被維持在一個可控狀態,

單個微服務啟動較快: 單個微服務代碼量較少, 所以啟動會比較快,

區域修改容易部署: 單體應用只要有修改,就得重新部署整個應用,微服務解決了這樣的問題, 一般來說,對某個微服務進行修改,只需要重新部署這個服務即可,

技術堆疊不受限:在微服務架構中,可以結合專案業務及團隊的特點,合理地選擇技術堆疊,例如某些服務可使用關系型資料庫MySQL;某些微服務有圖形計算的需求,可以使用Neo4j;甚至可根據需要,部分微服務使用Java開發,部分微服務使用Node.js開發,

微服務雖然有很多吸引人的地方,但它并不是免費的午餐,使用它是有代價的,使用微服務架構面臨的挑戰,

運維要求較高:更多的服務意味著更多的運維投入,在單體架構中,只需要保證一個應用的正常運行,而在微服務中,需要保證幾十甚至幾百個服務服務的正常運行與協作,這給運維帶來了很大的挑戰,

分布式固有的復雜性:使用微服務構建的是分布式系統,對于一個分布式系統,系統容錯、網路延遲、分布式事務等都會帶來巨大的挑戰,

介面調整成本高:微服務之間通過介面進行通信,如果修改某一個微服務的API,可能所有使用了該介面的微服務都需要做調整,

重復勞動:很多服務可能都會使用到相同的功能,而這個功能并沒有達到分解為一個微服務的程度,這個時候,可能各個服務都會開發這一功能,從而導致代碼重復,盡管可以使用共享庫來解決這個問題(例如可以將這個功能封裝成公共組件,需要該功能的微服務參考該組件),但共享庫在多語言環境下就不一定行得通了,

另外,關注公眾號Java技術堆疊,在后臺回復:面試,可以獲取我整理的 Java 分布式、微服務系列面試題和答案,非常齊全,

四、Serverless架構

當我們還在容器的浪潮中前行時,已經有一些革命先驅悄然布局另外一個云計算戰場:Serverless架構,

Serverless架構

2014年11月14日,亞馬遜AWS發布了新產品Lambda,當時Lambda被描述為:一種計算服務,根據時間運行用戶的代碼,無需關心底層的計算資源,從某種意義上來說,Lambda姍姍來遲,它像云計算的PaaS理念:客戶只管業務,無需擔心存盤和計算資源,在此前不久,2014年10月22日,谷歌收購了實時后端資料庫創業公司Firebase,Firebase聲稱開發者只需參考一個API庫檔案就可以使用標準REST API的各種介面對資料進行讀寫操作,只需撰寫HTML+CSS+JavaScrip前端代碼,不需要服務器端代碼(如需整合,也極其簡單),

相對于上兩者,Facebook 在2014年二月收購的 Parse,則側重于提供一個通用的后臺服務,這些服務被稱為Serverless或no sever,想到PaaS(平臺即服務)了是嗎?很像,用戶不需要關心基礎設施,只需要關心業務,這是遲到的PaaS,也是更實用的PaaS,這很有可能將會變革整個開發程序和傳統的應用生命周期,一旦開發者們習慣了這種全自動的云上資源的創建和分配,或許就再也回不到那些需要微應用配置資源的時代里去了,

Serverless架構能夠讓開發者在構建應用的程序中無需關注計算資源的獲取和運維,由平臺來按需分配計算資源并保證應用執行的SLA(服務等級協議),按照呼叫次數進行計費,有效的節省應用成本,ServerLess的架構如上圖所示,其優點如下所示:

低運營成本:在業務突發性極高的場景下,系統為了應對業務高峰,必須構建能夠應對峰值需求的系統,這個系統在大部分時間是空閑的,這就導致了嚴重的資源浪費和成本上升,在微服務架構中,服務需要一直運行,實際上在高負載情況下每個服務都不止一個實體,這樣才能完成高可用性;在Serverless架構下,服務將根據用戶的呼叫次數進行計費,按照云計算pay-as-you-go原則,如果沒有東西運行,你就不必付款,節省了使用成本,同時,用戶能夠通過共享網路、硬碟、CPU等計算資源,在業務高峰期通過彈性擴容方式有效的應對業務峰值,在業務波谷期將資源分享給其他用戶,有效的節約了成本,

簡化設備運維:在原有的IT體系中,開發團隊即需要維護應用程式,同時還要維護硬體基礎設施;Serverless架構中,開發人員面對的將是第三方開發或自定義的API 和URL,底層硬體對于開發人員透明化了,技術團隊無需再關注運維作業,能夠更加專注于應用系統開發,

提升可維護性:Serverless架構中,應用程式將呼叫多種第三方功能服務,組成最終的應用邏輯,目前,例如登陸鑒權服務,云資料庫服務等第三方服務在安全性、可用性、性能方面都進行了大量優化,開發團隊直接集成第三方的服務,能夠有效的降低開發成本,同時使得應用的運維程序變得更加清晰,有效的提升了應用的可維護性,

更快的開發速度:這一點在現在互聯網創業公司得到很好的體現,創業公司往往開始由于人員和資金等問題,不可能每個產品線都同時進行,這時候就可以考慮第三方的Baas平臺,比如使用微信的用戶認證、阿里云提供的RDS,極光的訊息推送,第三方支付及地理位置等等,能夠很快進行產品開發的速度,把作業重點放在業務實作上,把產品更快的推向市場,

但ServerLess架構也有其缺點:

廠商平臺系結:平臺會提供Serverless架構給大玩家,比如AWS Lambda,運行它需要使用AWS指定的服務,比如API網關,DynamoDB,S3等等,一旦你在這些服務上開發一個復雜系統,你會粘牢AWS,以后只好任由他們漲價定價或者下架等操作,個性化需求很難滿足,不能進行隨意的遷移或者遷移的成本比較大,同時不可避免帶來一些損失,Baas行業內一個比較典型的事件,2016年1月19日Facebook關閉曾經花巨額資金收購的Parse,造成用戶不得不遷移在這個平臺中產生一年多的資料,無疑需要花費比較大的人力和時間成本,

成功案例比較少,沒有行業標準:目前的情況也只適合簡單的應用開發,缺乏大型成功案例的推動,對于Serverless缺乏統一的認知以及相應的標準,無法適應所有的云平臺,

目前微服務架構在四種架構中處于主流地位,很多應用第一、第二種架構的企業也開始慢慢轉向微服務架構,到目前為止微服務的技術相對于二三年前已經比較成熟,第四種架構將是未來發展的一種趨勢,

近期熱文推薦:

1.Java 15 正式發布, 14 個新特性,重繪你的認知!!

2.終于靠開源專案弄到 IntelliJ IDEA 激活碼了,真香!

3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看,,

4.吊打 Tomcat ,Undertow 性能很炸!!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

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

標籤:Java

上一篇:Java中實作分布式定時任務

下一篇:Kubernetes官方java客戶端之六:OpenAPI基本操作

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

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more