如何在不重構的情況下將單體拆分成微服務?
微服務在過去幾年獲得了很大的普及,並且對我作為全棧開發人員的工作產生了很大的影響。但這些年來,我從未對單體失去信心。微服務帶來了很多額外的複雜性,在我所見的大多數情況下,這些複雜性並沒有超過它們帶來的價值。所以,我總是發現自己提倡和捍衛單一的方法。這引起了很多討論。
對我來說,單體架構和微服務架構並沒有什麼不同。如果處理得當,單體應用由具有強大邊界的模組組成。這給模組結構帶來了高內聚和低耦合,使應用程式更易於維護和更改。它還允許多個團隊在同一應用程式上工作,而不會互相絆倒。這是我多次聽到的支援微服務的論點。
在設計應用程式時,我發現很難定義正確的邊界。無論它們是用於設定模組還是微服務。微服務有一些常見的分解模式,我發現它們同樣適用於單體應用。對於大多數情況,按業務能力進行分解是一個很好的起點。
例如,小型線上商店的基本結構可能如下所示:
模組化整體的想法絕對不是新的,但作為與微服務的對立而獲得更多關注。像Sam Newman這樣的專家寫了很多關於這個主題的文章,新技術從這些想法中誕生。一個很好的例子是用於 Java 應用程式的Spring Modulith專案。對於我工作過的大多數公司來說,這種型別的單體應用已經綽綽有餘了。
在我看來,微服務架構只是單體架構的分散式變體。分散式系統既不簡單也不便宜,所以選擇它一定有很好的理由。更好的應用程式結構或多團隊支援對我來說不算是好的論據。重要的是與運維相關的原因,如可伸縮性、可靠性和可部署性。
如果模組邊界足夠強大,將模組化單體重構為微服務應該相當容易。模組可以一個接一個獨立重構。
在對我們的小型線上商店進行全面重構後,應用程式可能看起來像這樣:
有許多方法(模式)來組織一個微服務架構。沒有一個放之四海而皆準的解決方案,所以正確的選擇總是取決於環境。例子中使用的API閘道器模式對於解耦服務、解決安全問題和其他問題都很好。它適合我作為大多數情況下的一個偉大的起點。
從單體開始,逐步重構為微服務,聽起來是一個很好的解決方案,但根據我的經驗,並不是非常實用。將一個模組重構為一個服務仍然需要大量的努力。設定一個新的專案,端點,請求,操作等等。一旦應用程式的列車執行,當客戶不斷要求新功能時,很難找到資源把它放在另一條軌道上。當等待的時間過長時,事情就開始分崩離析,氣氛迅速轉變。
這讓我開始思考。在理想的世界裡,一個單體可以過渡到微服務而不需要任何重構:
定義什麼在哪裡執行應該是一個配置問題,而且可以隨時改變。
我喜歡這個想法,但如何在不觸及程式碼的情況下將模組轉變為服務呢?
基於段Segment概念
在這個時候,我已經在研究一個可以幫助回答這個問題的概念:
作為一個全棧開發者,我花了相當多的時間來設定前端和後端之間的通訊,這總感覺是一個很大的開銷。
自動化兩端通訊是一個選項,將通訊從程式碼中轉移到執行時中。
透過這個解決方案,前端可以直接匯入和呼叫後端元件。執行時攔截所有的後端匯入,建立並提供一個遠端實現,就像一個依賴性注入器。
使用這種解決方案進行模組間的通訊解決了自動過渡到服務的問題。但執行時被限制在一個單一的前端和後端部分。因此,它已經被重構,以支援無限量的段,可以單獨或作為一個組部署到前端或一個或多個後端。一個段包含來自一個或多個模組的一個或多個元件。它的內容是由配置定義的
每個模組都放在一個單獨的段中。交付部分需要負載平衡(由於跟蹤功能)並部署到多個伺服器。其餘部分被分組並一起部署到單個伺服器。
或者,模組可以放置在單個段中,稍後移動到單獨的段。因為段僅存在於配置中,所以將模組移動到另一個段對程式碼沒有影響。這樣,無需重構即可即時重新安排應用程式。
執行時已成為在 MIT 許可證下發布的開源專案。它的名字叫Jitar,是Just-In-Time-Architecture的縮寫。由於全棧支援,它被實現為 Node.js 之上的一個層。所以它只適合 JavaScript 和 TypeScript 應用程式。儘管我認為同樣的事情可以用 Java(也許還有 .NET?)來實現。
相關文章
- 如何在不重新啟動phantomjs的情況下修改HTTP代理?JSHTTP
- 單體架構,SOA,微服務架構微服務
- 容器化,微服務,DevOps,什麼情況下會三位一體?微服務dev
- 《前端實戰總結》如何在不重新整理頁面的情況下改變URL前端
- 在不重灌Windows情況Ç(轉)Windows
- 如何將單體分解成微服務?微服務
- 如何在不影響整個業務情況下重構AppAPP
- 微服務上 AWS 雲, 在使用ALB 的情況下, Eurek 中如何配置微服務
- 【VMware vCenter】在不重啟的情況下重置vCenter Server的root密碼。Server密碼
- 單體架構&微服務架構&中臺服務架構架構微服務
- 使用SpringCloud將單體遷移到微服務SpringGCCloud微服務
- 微服務架構帶來的分散式單體微服務架構分散式
- 單體到微服務架構的涅槃重生之路?微服務架構
- 架構之:微服務和單體服務之爭架構微服務
- 如何在不影響網路的情況下構建邊緣計算策略
- 從單體架構到分散式微服務架構的思考架構分散式微服務
- 不重啟mysql情況修改引數變數MySql變數
- 微服務架構:拆分單體應用的難點微服務架構
- 情況最簡單下的爬蟲案例爬蟲
- 在不重啟的情況下為 Vmware Linux 客戶機新增新硬碟Linux硬碟
- 使用代理上網的情況下,如何在 cmd 下執行 mvn?
- 單體架構、微服務和無伺服器架構架構微服務伺服器
- 從單體到微服務,軟體架構演化總覽微服務架構
- 為微服務構建服務網格的Istio自身卻走向微服務的反面單體架構 – Christian Posta微服務架構
- 如何在沒有前端框架的情況下實現元件化前端框架元件化
- 微服務下的資料架構微服務架構
- 在不重灌系統的情況下撤底刪除oracle資料庫及oralce的相關軟體Oracle資料庫
- [譯] 如何在無損的情況下讓圖片變的更小
- SFX的妙用——如何在不安裝軟體的情況下開啟自定義格式檔案?
- java空指標出現的情況:拆箱裝箱Java指標
- 在不重新整理頁面的情況下呼叫遠端asp指令碼 (轉)指令碼
- 在將單體遷移到微服務之前需要了解的模式 - Abhishek微服務模式
- Docker微容器+微服務將顛覆傳統的軟體架構Docker微服務架構
- 如何把單體式應用拆解成微服務?【下】微服務
- 天生創想OA任務管理系統:對任務進展情況瞭如指掌
- 微服務架構下的系統整合微服務架構
- linux不重啟的情況接受新的分割槽表資訊partprobeLinux
- gorm使用事務併發情況下切有最大mysql連線數限制的情況下的BUG,踩坑了GoORMMySql