10 為什么系統需要引入分布式、微服務架構

java技術的發展

在java開始流行起來之后,主要服務于企業家應用,例如ERP,CRM等等,這些項目是為企業內部員工使用,我們的思維是怎么用設計模式,如何封裝代碼。讓開發人員關注到業務上去,系統也就那么幾十幾百號人用。

隨著互聯網的興起,原本都是用PHP做的應用,隨著互聯網應用的業務復雜度,用戶體量的增加,越來越不實用。然后開發語言開始轉向java。

在2010年左右的盛行S2SH(struts2、spring、hibernate),隨著互聯網應用的深入,struts2在互聯網部署的時候有嚴重的安全性問題,hibernate雖然有二級緩存這些設置,但是hql不是原生sql很難優化等問題,技術開始使用springmvc、spring、mybatis。

再隨著用戶體量的不斷增加和業務的復雜程度的提升,淘寶開始使用dubbo的RPC框架,然后發展到springboot和springcloud的出現。我們漸漸的在互聯網公司中引入分布式框架,直到分布式技術的漸漸成熟。

因為有需求,技術才不斷的發展。技術都是方便業務需求的發展的。

業務復雜度的提高和用戶體量的增加需要我們分布式如何應對

隨著業務復雜度的提高,我們如果還是把程序維護在一個項目里面,不管是實體類的增加,JVM類加載的問題,性能的問題,項目復雜度的問題,這個時候需要我們對項目的復雜度進行拆解,也就是我們技術中說到的垂直拆分,隨著我們在對整個系統進行拆分的時候遇到實際部署中遇到的一些問題,我們總結出DDD領域建模的方法論

隨著用戶體量的不斷增加,我們的并發也在不斷的升高。關于用戶體量的增加,我們數據庫的存儲也隨著增加,當一張表中數據量過大,我們在查詢的時候,就會增加磁盤搜索的時間成本,造成一個查詢很長時間出不來。為了不會在同一張表中放置大量的數據,我們需要分表的操作。最開始的時候的分布式,大約在12年13年這樣我們都是對數據的主鍵或者對數據進行hash計算,求模分到不同的表中,但是這種行為代碼的侵入性太大,后來出了mycat,但是mycat對求笛卡爾交集還有別的一些問題,在分庫情況下求交集上經常遇到問題,后來出了springjdbc,然后慢慢的也流行起來了。這個是我們分表的問題。

那么隨著用戶體量的增加,大量的訪問進入到我們的系統。我們知道數據庫去執行sql語句的時候,是通過引擎程序執行的。執行引擎也是有性能瓶頸的,這個時候就需要考慮分表的問題了。

單體服務的問題

  1. 擴展的問題
    單體的服務架構通過前端的負載均衡后部署多個實例進行擴展。如果需要對特定的功能進行擴展,我們只能通過多部署服務進行擴展。這樣會造成資源的大量浪費。如果是基于微服務部署只需要對特定的功能進行擴展,其他服務實例不需要擴展,比較靈活。

  2. 交付時間長
    

單體的服務在業務變更的時候需要構建和部署整個服務,開發人員需要下載整個應用程序進行修復和測試。而微服務只需要修改微服務的部分并部署對應的服務即可,不會影響其他服務的運行。

  1. 單體服務應用的復雜性
    隨著應用的業務功能的擴展,團隊也需要不斷的擴張,各種復雜的業務會交織在一起,造成項目的臃腫,維護起來會越來越麻煩,最后修復功能的時候牽一發而動全身,系統很難維護。在微服務的架構中,每個服務獨立負責自己的業務。每個服務的業務域劃分清楚以后,維護起來會清爽很多。

  2. 代碼依賴和團隊協作的問題
    傳統的開發模式,我們劃分的團隊看起來是獨立的但是他們在相互的協作的過程中有嚴重的代碼上依賴的問題,團隊中相互依賴造成大量工作上的浪費。微服務架構團隊之間彼此獨立,獨立的團隊負責獨立的業務,工作明確。包括開發部署和監控。

  3. 應用服務故障的關聯
    在一個單體服務,如果在交付過程中,一部分程序出現問題會造成整個服務的不可用

  4. 陷入某種語言的禁錮
    由于單體服務是一個整體的項目,所以使用都是同一種開發語言。隨著業務的發展,如果某種語言并不能勝任,則需要整體的重構,造成大量資源的浪費,特別是一些大型系統的整體重構是很大的工作量

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

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

相關文章

第6章:Python TDD實例變量私有化探索

寫在前面 這本書是我們老板推薦過的,我在《價值心法》的推薦書單里也看到了它。用了一段時間 Cursor 軟件后,我突然思考,對于測試開發工程師來說,什么才更有價值呢?如何讓 AI 工具更好地輔助自己寫代碼,或許…

JDK 23 和 JDK 21 的區別

JDK 23 和 JDK 21 的區別主要在于支持周期和功能特性: 支持周期: JDK 23:此版本是一個常規發布版本,支持時間較短,通常是六個月。這種版本適合希望使用最新特性和改進的用戶。JDK 21:這是一個長期支持&…

springboot自動配置原理(高低版本比較)spring.factories文件的作用

SpringBootApplication public class SpringSecurityApplication {public static void main(String[] args) {SpringApplication.run(SpringSecurityApplication.class, args);}}注解SpringBootApplication Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Doc…

使用Websocket進行前后端實時通信

1、引入jar&#xff0c;spring-websocket-starter <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 2、配置websocket config import org.springframe…

vue2 - Day05 - VueX

Vuex 是 Vue.js 官方的狀態管理庫。它是一個讓你能在應用中集中管理共享狀態的工具。當應用的規模逐漸增大&#xff0c;組件之間的數據傳遞變得越來越復雜時&#xff0c;Vuex 就成為了救星&#xff0c;提供了一個集中式的存儲來管理所有的組件狀態&#xff0c;并且保證狀態以一…

中型項目中 HTTP 的挑戰與解決方案

一、引言 在當今數字化時代&#xff0c;HTTP&#xff08;超文本傳輸協議&#xff09;作為Web應用程序的基礎通信協議&#xff0c;在中型項目的開發中扮演著至關重要的角色。它為客戶端和服務器之間的數據傳輸提供了標準規范&#xff0c;使得各種類型的應用&#xff0c;從簡單的…

IDEA導入Maven工程不識別pom.xml

0 現象 把阿里 sentinel 項目下載本地后&#xff0c;IDEA 中卻沒顯示 maven 工具欄。 1 右鍵Maven Projects 點擊IDEA右側邊欄的Maven Projects&#xff0c;再點擊&#xff1a; 在出現的選擇框中選擇指定的未被識別的pom.xml即可&#xff1a; 2 Add as maven project 右鍵p…

VUE學習筆記(入門)5__vue指令v-html

v-html是用來解析字符串標簽 示例 <!doctype html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document<…

OSPF的LSA的學習研究

OSPF常見1、2、3、4、5、7類LSA的研究 1、拓撲如圖&#xff0c;按照地址表配置&#xff0c;激活OSPF劃分相關區域并宣告相關網段 2、1類LSA&#xff0c;每臺運行了OSPF的路由器都會產生&#xff0c;描述了路由器的直連接口狀況和cost 可以看到R1產生了一條router lsa&#xff0…

小結:OSPF協議的工作原理

OSPF&#xff08;開放最短路徑優先&#xff09;優點&#xff1a; 快速收斂&#xff1a;OSPF的收斂速度較快&#xff0c;能迅速響應網絡拓撲變化&#xff0c;并在發生故障后快速更新路由信息。 支持大規模網絡&#xff1a;OSPF適合大型網絡&#xff0c;可以通過劃分區域來減少網…

TypeScript - 利用GPT輔助學習

TypeScript 一、基礎1. 安裝 TypeScript2. 創建你的第一個 TypeScript 文件3. 編譯 TypeScript 代碼4. 變量聲明與類型注解5. 函數與類型注解6. 總結 二、進階常用類型1. 類型別名2. 對象類型3. 類型斷言4.typeof 操作符 高級類型1. 類2. 交叉類型3. 泛型與 keyof4. 索引簽名類…

Java - WebSocket

一、WebSocket 1.1、WebSocket概念 WebSocket是一種協議&#xff0c;用于在Web應用程序和服務器之間建立實時、雙向的通信連接。它通過一個單一的TCP連接提供了持久化連接&#xff0c;這使得Web應用程序可以更加實時地傳遞數據。WebSocket協議最初由W3C開發&#xff0c;并于2…

stm32 no connect target

解決 STM32 報錯 “no target connected” 的方法 前言 stm32最小系統在下載程序是一直報錯&#xff1a;no target connected&#xff0c;試了很多辦法成功不了&#xff0c;最后將芯片擦除了才成功。 一、問題描述 當時是寫flash的時候寫到ST Link 存儲的地方了。 之后就不…

element的el-form-item的prop作用

這個在elemenui中介紹比較簡單&#xff0c;一般寫的時候照著例子寫&#xff0c;會正常運行。沒太注意porp到底有啥影響點。這次有點時間整理一下。 這個https://worktile.com/kb/p/3534641鏈接講述的要比一般csdn上的文章清晰。 總結&#xff1a; Vue表單驗證中的prop屬性用于指…

Open3D計算點云粗糙度(方法一)【2025最新版】

目錄 一、Roughness二、代碼實現三、結果展示博客長期更新,本文最近更新時間為:2025年1月18日。 一、Roughness 通過菜單欄的Tools > Other > Roughness找到該功能。 這個工具可以估計點云的“粗糙度”。 選擇一個或幾個點云,然后啟動這個工具。 CloudCompare只會詢問…

窺探QCC518x/308x系列與手機之間的藍牙HCI記錄與分析 - 手機篇

今天要介紹給大家的是, 當我們在開發高通耳機時如果遇到與手機之間相容性問題, 通常會用Frontline或Ellisys的Bluetooth Analyzer來截取資料分析, 如果手邊沒有這樣的儀器, 要如何窺探Bluetooth的HCI log.這次介紹的是手機篇. 這次跟QCC518x/QCC308x測試的手機是Samsung S23 U…

【論文投稿】Python 網絡爬蟲:探秘網頁數據抓取的奇妙世界

目錄 前言 一、Python—— 網絡爬蟲的絕佳拍檔 二、網絡爬蟲基礎&#xff1a;揭開神秘面紗 &#xff08;一&#xff09;工作原理&#xff1a;步步為營的數據狩獵 &#xff08;二&#xff09;分類&#xff1a;各顯神通的爬蟲家族 三、Python 網絡爬蟲核心庫深度剖析 &…

前端炫酷動畫--圖片(一)

目錄 一、四角線框的跟隨移動 二、元素倒影(-webkit-box-reflect) 三、模特換裝(maskblend) 四、元素平滑上升 五、無限視差滾動 六、判斷鼠標進入方向(輪播方向) 七、環形旋轉效果 八、黑白小球交替旋轉 九、hover時圓形放大 十、畫一棵隨機樹(canvas) 十一、代碼雨…

STL--list(雙向鏈表)

目錄 一、list 對象創建 1、默認構造函數 2、初始化列表 3、迭代器 4、全0初始化 5、全值初始化 6、拷貝構造函數 二、list 賦值操作 1、賦值 2、assign&#xff08;迭代器1&#xff0c;迭代器2&#xff09; 3、assign&#xff08;初始化列表&#xff09; 4、assig…

【語言處理和機器學習】概述篇(基礎小白入門篇)

前言 自學筆記&#xff0c;分享給語言學/語言教育學方向的&#xff0c;但對語言數據處理感興趣但是尚未入門&#xff0c;卻需要在論文中用到的小伙伴&#xff0c;歡迎大佬們補充或繞道。ps&#xff1a;本文不涉及公式講解&#xff08;文科生小白友好體質&#xff09;&#xff…