單體、分布式、微服務、Serverless軟件架構一覽

目錄

  • 軟件架構
  • 單體架構
  • 分布式應用
  • 微服務架構
  • Serverless架構
  • 總結
  • Reference

軟件架構

軟件架構就是軟件的基本結構,合適的架構是軟件成功的最重要因素之一。這里列舉了目前流行的4種軟件架構。

單體架構

典型的三級架構:前端(web/手機端)+ 中間業務邏輯層 + 數據庫。

這是典型的Java Spring MVC 或者Python Django框架的應用。
在這里插入圖片描述
單體架構應用容易部署測試,但是隨著需求不斷增加,會變得十分臃腫,可維護性、靈活性會逐漸降低。
復雜性高:一個百萬行級別的單體應用,整個項目包含的模塊非常多,模塊之間的邊界、依賴關系容易模糊。可能添加一個簡單功能都會帶來隱藏的BUG
技術債務:隨著時間推移、需求變更和人員更迭,會逐漸形成技術債務,已經使用的系統設計或代碼難以被修改,因為應用程序種的其他模塊可能會以意料之外的方式使用它
部署頻率低:每次功能的變更或者缺陷的修復都會導致重新部署整個應用。全量部署的方式耗時長、影響范圍大、風險高,這使得單體應用項目上線部署的頻率較低。部署頻率低又會導致兩次發布之間會有大量的功能變更和缺陷修復,出錯率比較高
可靠性差:某個應用BUG,如死循環、內存泄露,可能會導致整個應用崩潰
擴展能力受限:單體應用只能作為一個整體進行擴展,無法根據業務模塊的需要進行伸縮。應用中有的模塊是計算密集型,需要強勁的CPU;有的模塊是IO密集型,需要更多的IO資源以及內存。這些模塊部署在一起的話,不得不在硬件上做出妥協
阻礙技術創新:單體應用往往使用統一的技術平臺和方案,使用相同的開發語言和框架,想要引入新框架或技術平臺較難

分布式應用

中級架構,具有中間層分布式 + 數據庫分布式,是單體架構的并發擴展,將一個大的系統劃分為多個業務模塊,然后分別部署在不同的服務器上,各個業務模塊之間通過接口進行數據交互。數據庫也采用分布式數據庫,通過Nginx代理應用,將用戶請求均衡地負載到不同地服務器上。
在這里插入圖片描述
這種架構提供了負載均衡的能力,大大提高了系統的負載能力,解決了網站高并發的需求,另外還有以下特點:
解耦:模塊炒粉,使用接口通信,降低了模塊之間的耦合度
責任清晰:拆解為若干個子項目,不同的團隊負責不同的子項目
擴展方便:增加功能時只需要增加一個子項目,調用其他系統的接口就可以
部署方便:分布式部署
提高代碼復用性:比如service層,如果不采用分布式服務方式架構,就會在pc、android、ios每個端都要寫一個service層邏輯,開發量大,難以維護一起升級,此時可以用分布式rest服務方式,共用一個service層
缺點就是系統之間的交互要使用遠程通信,接口發開增大工作量,但是利大于弊端

微服務架構

微服務架構主要是中間層分解,將系統拆分成很多小應用(微服務),微服務可以部署在不同的服務器上,也可以部署在相同的服務器的不同容器上。但應用的故障不會影響到其他應用,單應用的負載也不會影響到其他應用,代表框架Spring cloudDubbo
在這里插入圖片描述微服務有以下特點:

易于開發和維護:一個微服務只會關注一個特定的業務功能,所以業務清晰、代碼量較少。開發和維護單個微服務比較簡單。
單個微服務啟動較快:單個微服務代碼量少,所以啟動快
局部修改容易部署:單體應用只要有修改就得重新部署整個應用,而某個微服務修改只需要重新部署整個服務即可
技術棧不受限制
使用微服務也是有代價的:
運維要求高:更多的服務意味著更多的運維投入,微服務中需要保證幾十個幾百個服務的正常運行和協作
分布式固有的復雜性:微服務構建的仍然是分布式系統,系統容錯、網絡延遲、分布式事務也比較頭疼
接口調整成本高:微服務之間通過接口進行通信,如果修改某一個微服務的API,那么所有使用該接口的微服務都需要進行調整
重復勞動:很多服務可能都會使用到相同的功能,但是這個功能并沒有達到分解為一個微服務的程度,所以各個服務都會開發這個功能,從而導致代碼重復。盡管可以使用共享庫,但是共享庫在多語言環境下不一定能用

Serverless架構

Serverless架構能夠讓開發者在構建應用的過程中無需關注計算資源的獲取和運維,由平臺來按需分配計算資源并保證應用執行的SLA(服務等級協議),按照調用次數進行計費,有效的節省應用成本。這有點像PaaS(平臺便是服務)用戶不需要關心基礎設施,只需要關心業務,全自動云上資源創建和分配。
在這里插入圖片描述
這種架構的優點如下:
低運營成本:在業務突發性極高的場景下,系統為了應對業務高峰,必須構建出能夠應對峰值需求的系統,這種系統大部分時間是空閑的,這就導致了嚴重的資源浪費和成本上升。在微服務架構中,服務需要一直運行,在高負載情況下的每個服務都不止一個實例,這樣才能完成高可用性。Serverless架構下,服務將根據用戶的調用次數進行付費,如果沒有東西運行,就不必付費。同時用戶可以通過共享網絡、硬盤、CPU等計算資源,在業務高峰通過彈性擴容方式有效應對業務峰值,在業務波谷期間將資源分享給其他用戶,節約成本
簡化設備運維原有的IT體系中,開發團隊需要維護程序,也需要維護硬件基礎設施。在此架構中,開發人員面對的是第三方的API和URL,底層硬件對于開發人員透明化。
提高可維護性:應用程序將調用多種第三方功能服務,組成最終的應用邏輯。目前的登錄鑒權服務、云數據庫服務等第三方服務在安全性、可用性、性能上都進行了大量優化,開發團隊直接集成第三方服務,能夠有效的降低開發成本

總結

目前微服務架構在四種架構中處于主流地位,很多應用第一、第二種架構的企業也開始慢慢轉向微服務架構。第四種則是未來發展趨勢

Reference

單體→分布式→微服務,這些年的軟件架構是怎么發育的?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376862.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MyBatis3 association error - The content of element type resultMap must match (constructor?,id*,r...

MyBatis3 association error - The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)" 1.后臺錯誤信息-問題現象: ERROR [geby:Context initialization failed] 2013-0…

Midjourney V6刷屏,但它最可怕的地方居然不是那些神圖?

Midjourney在沉寂九個月后推出了Midjourney V6,這個文生圖產品體現出的更細膩的細節處理,更強大的語言理解能力和更加“不像AI”的圖片效果在過去幾天引發一片驚呼。 作為一個閉源的模型產品,Midjourney的魔法配方并不為人所知,但…

HTTP 錯誤500.19 -Internal Server Error

HTTP 錯誤500.19 -Internal Server Error 原文:HTTP 錯誤500.19 -Internal Server Error HTTP 錯誤500.19 -Internal Server Error 錯誤代碼 0x80070021 asp.net 2009-11-05 16:54:33 閱讀484 評論1 字號:大中小 錯誤摘要 HTTP 錯誤500.19 -Internal Server Error …

連續內存分區式內存管理

目錄前言分區式內存管理動態分區內存管理總結本筆記參考黃工的https://mp.weixin.qq.com/s/k0W_LqI1zBAYC1GU1U2HQA 前言 內存管理模塊主要負責內存的初始化、分配以及釋放。 從分配內存是否連續可以分為兩大類: 1、連續內存管理 為進程分配的內存空間是連續的&a…

用DEVC++作圖

小海豚學NOIP,老師說要用DEV C。 小海豚喜歡畫圖,記得以前用C#編些程序給她看。可前一陣打開看,我的免費Visual Studio過期了。可惡的Microsoft ,不想用盜版難道就要每個月就下載一次? 于是就用DEV C的Windows調用吧。…

Python服務器開發三:Socket

Python服務器開發三:Socket socket是操作系統中I/O的延續,它可以使進程和機器之間的通信成為可能。socket可以看成一個標準的文件描述符。不同的是文件需要用open()函數打開,而socket用socket() 函數建立.recv()、send()函數和read()、write(…

Syntax error: Bad for loop variable解決辦法

在Ubuntu下寫的shell文件t.sh執行時出現錯誤: 1 t.sh: 6: Syntax error: Bad for loop variable 從ubuntu 6.10開始,ubuntu就將之前默認的bash shell更換成了dash shell,其表現為/bin/sh鏈接倒了/bin/dash,而不是傳統的/bin/bash&…

Linux命令常見

摘自: 常考的 21 條 Linux 命令 目錄)cd,切換路徑ls,查看文件與目錄的命令cp,用于復制文件mv,用于移動文件、目錄cat,查看文件內容find,文件搜索文件權限命令, 設置權限,-取消權限文本處理命令打包和壓縮文件命令進程相…

記一次調試

這是我最近幾個月來遇到的最棘手的一個問題:* 昨天花了4個小時找出第一層次的原因這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是一個gradle的plugin,用來resolve公司內部的dependency的,…

OSGi.NET 學習筆記 [模塊化和插件化][小結]

【目錄】-【模塊化和插件化】-【小結】 現在我們來對OSGi.NET的“模塊化和插件化”做一個小結,再次把官方的說明拿出來  1) 物理隔離:基于UIOSP開發的模塊是一個物理隔離的可單獨部署的模塊,每一個模塊擁有獨立的文件夾、類型空…

miniob :相關環境配置

How to build 參考視頻:https://www.bilibili.com/video/BV1gv411A7oA?spm_id_from333.999.0.0將代碼下載并且安裝編譯。 git clone失敗的話參考:https://blog.csdn.net/sxg0205/article/details/81412921 install cmakebuild libevent git submodul…

Fedora 20 配置

前幾天裝了fedora 20, 斷斷續續的進行了以下配置: 1. 安裝oracle java及jdk版本切換 安裝的過程很簡單,從oracle官網上下載jdk及jre的rpm包,使用rpm -ivh 安裝。但是遇到一個問題,因為fedora系統自帶了openJDK,如果安裝oracle的jd…

raft算法學習(一):角色概念以及選舉過程

Raft算法是強領導模型,集群中只能有一個領導。 下面是raft的視頻講解: raft raft的三種角色及其概念 服務器節點狀態一共有三種:領導者(Leader)、跟隨著(Follower)、候選人(Candid…

解決 FLex 4.0 Module里面Alert.show();出錯問題

TypeError: Error #1009: 無法訪問空對象引用的屬性或方法。 at mx.managers::PopUpManagerImpl/http://www.adobe.com/2006/flex/mx/internal::createModalWindow()[E:\dev\hero_private\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:701] at mx.manag…

datetime2 數據類型

.net的Entity Framework構建網站數據層,給一個實體的DATETIME類型的屬性賦值時 突然莫名奇妙顯示有一個類型不匹配的異常如下: System.Data.SqlClient.SqlException: 從 datetime2 數據類型到 datetime 數據類型的轉換產生一個超出范圍的值。 解決方法&a…

Yslow的A評級指南

這里測的是V2引擎,V1想拿A幾乎不可能,一個CDN測試的F就可以輕松廢了你的網站。 A評級 現在一個一個分析。 User fewer HTTP Requests:減少HTTP請求 圖片、CSS、JS、flash等這些都需要增加http請求數,減少這些元素的數量能減少響應…

jquery下 選擇器整理

jQuery 的選擇器可謂之強大無比,這里簡單地總結一下常用的元素查找方法 $("#myELement") 選擇id值等于myElement的元素,id值不能重復在文檔中只能有一個id值是myElement所以得到的是唯一的元素 $("div") 選擇所有的di…

git日常使用教程

目錄git日常使用git 基礎用法(本地)git branchgit checkoutgit mergegit rebaseHEAD ,在提交樹上移動相對引用強制修改分支位置撤銷變更整理提交記錄提交技巧Git TagsGit Describegit 基礎用法(遠程)git fetchgit pullgit push偏離的提交歷史,十分重要!&…

android一鍵分享功能不使用任何第三方sdk

在android中有自帶的一鍵分享功能,不過它會把所有帶分享的應用都找出來,如果我們只需要一些常見的分享應用,該如何做呢? 下面看我的效果圖(橫屏和豎屏自動適配): 接下來看我的調用(支…

包含EditText組件的界面中,禁止自動彈出軟鍵盤

解決方法: 1)在Manifest.xml文件中相應的activity下添加一下代碼:android:windowSoftInputMode"stateHidden"2)讓EditText失去焦點,使用EditText的clearFocus方法 例如:EditText edit(EditText)f…