目錄
2。設計與事件和合同的鬆散耦合的設計
3。在內部優化性能和可伸縮性
4。為速度和安全構建構建和部署
首頁 Java java教程 如何構建可擴展的Java巨石

如何構建可擴展的Java巨石

Sep 01, 2025 am 08:42 AM
java 架構

使用基於功能的包裝和諸如Archunit之類的工具來執行模塊邊界。 2。將模塊與域事件和共享合同而不是直接呼叫。 3.通過無狀態服務,緩存,數據庫調整和異步處理來優化性能。 4。結構構建模塊化項目,並使用功能標誌和快速管道安全部署。 5.監視人均性能,並通過使用可觀察性和鬆動的耦合設計來為將來的提取做準備,從而確保整體可以隨著需求而優雅地發展。

如何構建可擴展的Java巨石

在微服務的時代,建造可擴展的Java巨石可能聽起來很矛盾,但是許多成功的系統(尤其是在早期或中期公司中)依靠結構良好的整體,以迅速提供價值,同時保持性能和可管理性。關鍵是故意的架構。這是構建可以擴展的Java巨石的方法,可以通過您的團隊,交通和復雜性進行擴展。

如何構建可擴展的Java巨石

1。執行清除模塊邊界

即使在單個代碼庫中,也將組件像單獨的服務一樣。使用Java的模塊系統(Java 9)或更實際的逐個功能結構,而不是逐層包裝。

做到這一點:

如何構建可擴展的Java巨石
 com.yourapp/
  ├ - 訂單/
  │├│─-orderservice.java
  │├├─-orderrepository.java
  ││└└-orderdto.java
  ├──付款/
  PaymentsVice.Java
  ││└前lineclient.java
  └ - 用戶/
      ├─-uservice.java
      └ -  Uservalidator.java

不是這樣:

 com.yourapp/
  ├─—服務/
  ├ - 儲存庫/
  ├ -  dto/
  └─..controler/

為什麼重要:
分層軟件包鼓勵跨模塊依賴性,並難以隔離更改。基於功能的包裝改善了內聚,並使未來提取(例如,對微服務)更加容易。

如何構建可擴展的Java巨石

使用諸如Archunit之類的工具來執行邊界:

 @archtest
靜態最終拱形訂單 
    class()。
             。

2。設計與事件和合同的鬆散耦合的設計

即使在整體中,也避免在模塊之間緊密耦合。使用域事件或內部事件總線來傳達更改。

例如,下訂單時,請發布OrderCreatedEvent而不是直接調用PaymentService

 @服務
公共班訂單服務{
    私人最終ApplicationEventPublisher活動;

    public void createorder(訂單順序){
        //保存訂單...
        event.publishevent(new OrderCreatedEvent(order.getId()));
    }
}

然後,在付款模塊中有一個聽眾:

 @EventListener
公共void handleordercreated(orderCreatedEvent事件){
    PaymentsVice.ProcessPayment(event.orderID());
}

好處:

  • 模塊不需要彼此直接依賴
  • 易於隔離測試
  • 為最終的異步處理或消息隊列鋪平道路

此外,在sharedcore模塊中定義共享合同(例如DTO或接口),而其他人可以依靠而無需涉及業務邏輯。


3。在內部優化性能和可伸縮性

整體仍然可以水平擴展 - 您只需要設計組件即可無狀態和高效。

關鍵實踐:

  • 使用無狀態服務:避免使用內存中的緩存或與單個實例綁定的會話存儲。
  • 明智地利用緩存:使用redis或咖啡因進行共享或局部緩存,但要保持緩存無效邏輯。
  • 數據庫優化
    • 使用連接池(Hikaricp)
    • 添加讀取複製品以進行重讀工作負載
    • 考慮每個模塊的模式分離(即使是同一dB)以減少耦合
  • 異步處理:使用適當的任務執行程序卸載非關鍵工作(電子郵件,分析)到背景線程或@Async方法。

例子:

 @Async
public void sendConfirmationmationemail(字符串電子郵件){
    //在單獨的線程池中運行
}

仔細使用@Transactional簡短的交易並避免長期運行的交易來阻止DB資源。


4。為速度和安全構建構建和部署

隨著代碼庫的增長,緩慢的構建和危險的部署成為瓶頸。

建議:

  • 使用Maven模塊Gr​​adle子項目將應用程序分解為邏輯單元:
     // settings.gradle
    包括“訂單服務”,“付款服務”,“共享核心”
  • 僅使用增量彙編和CI/CD緩存構建變化的內容。
  • 作為一個單元部署,但要快速啟動並進行健康檢查。
  • 使用功能標誌(例如,togglz)將部署與發布。
  • 這樣,您仍然可以經常發貨而無需協調地獄。


    5。監視,測量和準備分裂

    即使您保持整體化,也會表現得一樣。

    • 使用指標(千分尺Prometheus)監視每個模塊的性能
    • 使用OpenTelemetry進行跨服務邊界的跟踪請求。
    • 識別瓶頸:一個模塊是否​​放慢整個應用程序?

    當模塊變為時:

    • 高負載
    • 不同的擴展需求
    • 由另一個團隊擁有 - 然後是提取的候選人。

    由於您使用了乾淨的邊界和事件,因此提取變成部署變化,而不是重寫。


    底線:可擴展的Java巨石不是要避免結構,而是在單個代碼庫應用面向服務的思維。這樣做,然後您現在快速發貨,以後更優雅地進化。

    基本上,像您明天將其分配的設計一樣,但是像今天是一個應用程序一樣部署。

    以上是如何構建可擴展的Java巨石的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Stock Market GPT

Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

如何在Java中的類Path中添加JAR文件? 如何在Java中的類Path中添加JAR文件? Sep 21, 2025 am 05:09 AM

使用-cp參數可將JAR加入類路徑,使JVM能加載其內類與資源,如java-cplibrary.jarcom.example.Main,支持多JAR用分號或冒號分隔,也可通過CLASSPATH環境變量或MANIFEST.MF配置。

如何在Java中創建文件 如何在Java中創建文件 Sep 21, 2025 am 03:54 AM

UseFile.createNewFile()tocreateafileonlyifitdoesn’texist,avoidingoverwriting;2.PreferFiles.createFile()fromNIO.2formodern,safefilecreationthatfailsifthefileexists;3.UseFileWriterorPrintWriterwhencreatingandimmediatelywritingcontent,withFileWriterover

UC瀏覽器如何強制縮放網頁_UC瀏覽器網頁強制縮放功能使用技巧 UC瀏覽器如何強制縮放網頁_UC瀏覽器網頁強制縮放功能使用技巧 Sep 24, 2025 pm 04:54 PM

首先啟用UC瀏覽器內置縮放功能,進入設置→瀏覽設置→字體與排版或頁面縮放,選擇預設比例或自定義百分比;其次可通過雙指張開或捏合手勢強制調整頁面顯示大小;對於限制縮放的網頁,可請求桌面版網站以解除限制;高級用戶還可通過在地址欄執行JavaScript代碼修改viewport屬性,實現更靈活的強制縮放效果。

為什麼實時系統需要確定性響應保障? 為什麼實時系統需要確定性響應保障? Sep 22, 2025 pm 04:03 PM

實時系統需確定性響應,因正確性依賴結果交付時間;硬實時系統要求嚴格截止期限,錯過將致災難,軟實時則允許偶爾延遲;非確定性因素如調度、中斷、緩存、內存管理等影響時序;構建方案包括選用RTOS、WCET分析、資源管理、硬件優化及嚴格測試。

如何在Java中獲取通話方法的名稱? 如何在Java中獲取通話方法的名稱? Sep 24, 2025 am 06:41 AM

答案是使用Thread.currentThread().getStackTrace()獲取調用方法名,通過索引2得到調用anotherMethod的someMethod名稱,因索引0為getStackTrace、1為當前方法、2為調用者,示例輸出“Calledbymethod:someMethod”,也可用Throwable實現,但需注意性能、混淆、安全及內聯影響。

您如何處理Java的例外? 您如何處理Java的例外? Sep 23, 2025 am 04:44 AM

Java異常處理通過try-catch塊捕獲異常,finally塊確保資源清理,try-with-resources自動管理資源,throws聲明異常,自定義異常應對特定錯誤,並遵循捕獲具體異常、不忽略異常、避免空catch塊等最佳實踐,從而實現健壯且可維護的代碼。

Microsoft Edge高CPU使用率 Microsoft Edge高CPU使用率 Sep 24, 2025 am 12:17 AM

Edge佔用CPU高是因為基於Chromium內核資源消耗大,加上多標籤頁、插件運行、網站腳本及渲染機制等因素;解決方法包括:1.關閉不必要的擴展程序以減少後台負擔;2.啟用“睡眠標籤頁”功能降低閒置標籤資源佔用;3.清理後台進程並關閉GPU渲染相關設置;4.更新瀏覽器和系統確保兼容性與性能優化。

如何使用可選類避免Java中的NullPoInterException? 如何使用可選類避免Java中的NullPoInterException? Sep 25, 2025 am 06:04 AM

Optional類用於安全地處理可能為null的值,避免空指針異常。 1.使用Optional.ofNullable創建實例,可處理null值。 2.通過isPresent或ifPresent安全檢查和訪問值,避免直接調用get導致異常。 3.利用orElse、orElseGet提供默認值,或使用orElseThrow拋出自定義異常。 4.通過map和filter鍊式操作轉換或過濾值,提升代碼可讀性和健壯性。

See all articles