」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 Spring Cloud 的微服務架構

使用 Spring Cloud 的微服務架構

發佈於2024-07-29
瀏覽:235

Microservices Architecture with Spring Cloud

微服務架構是一種設計方法,其中應用程式由鬆散耦合的服務組成。每個服務負責特定的功能,並且可以獨立開發、部署和擴充。 Spring Cloud 是一套工具和框架,有助於建立健壯且可擴展的微服務。

什麼是微服務?
微服務將複雜的應用程式分解為更小的、可管理的服務。每個微服務都專注於單一業務功能,並透過明確定義的 API(通常使用 REST 或訊息佇列)與其他服務進行通訊。

微服務的好處

  • 可擴展性:各個服務可依需求獨立擴展。
  • 靈活性:可以使用不同的技術和語言開發不同的服務。
  • 故障隔離:一項服務故障,不會影響整個系統。
  • 持續部署:實現服務的頻繁且獨立的部署。

Spring Cloud的關鍵組件

1. Spring Cloud 配置:

  • 集中外部配置管理。
  • 支援Git、SVN、本機檔案等多種設定來源。
  • 範例:跨多個服務配置資料庫憑證、API 金鑰和其他屬性。

2. Spring Cloud Netflix:

  • 整合了Eureka、Hystrix、Zuul、Ribbon等Netflix OSS元件。
  • Eureka:服務發現伺服器和客戶端。
  • Hystrix:用於容錯的斷路器。
  • Zuul:用於動態路由的API網關。
  • Ribbon:客戶端負載平衡。

3. Spring Cloud Gateway:

  • 取代 Zuul 的新專案。
  • 提供了一個簡單有效的方式來路由請求。
  • 路徑重寫、負載平衡、路由過濾等功能。

4。 Spring Cloud Sleuth:

  • 分散式追蹤以追蹤微服務之間的請求流。
  • 與 Zipkin 整合進行監控和分析。

5。 Spring Cloud Stream:

  • 建構事件驅動的微服務的架構。
  • 使用 RabbitMQ 和 Apache Kafka 等訊息傳遞系統。

使用 Spring Cloud 建立簡單的微服務應用程式:

設定 Spring Boot 專案:

  • 為每個微服務創建單獨的 Spring Boot 專案。
  • 在pom.xml或build.gradle中定義Spring Cloud元件的依賴關係。

配置 Spring Cloud Config Server:

  • 設定配置伺服器來管理外部配置。
  • 將微服務指向Config Server進行集中配置。

使用 Eureka 進行服務發現:

  • 設定Eureka伺服器用於服務註冊和發現。
  • 配置各微服務註冊到Eureka伺服器。

API 閘道與 Spring Cloud Gateway:

  • 設定 Spring Cloud Gateway 用於將請求路由到不同的微服務。
  • 定義處理請求的路由規則和過濾器。

使用 Hystrix 加入彈性:

  • 整合 Hystrix 以實現熔斷和回退機制。
  • 使用@HystrixCommand註解方法以啟用熔斷。

使用 Spring Cloud Sleuth 進行分散式追蹤:

  • 新增 Sleuth 依賴項以追蹤和記錄請求流。
  • 使用 Zipkin 視覺化和分析追蹤數據。

範例:實作簡單的微服務架構

讓我們考慮一個具有以下微服務的基本電子商務應用程式:

  1. 產品服務:管理產品資訊。
  2. 訂單服務:處理訂單和交易。
  3. 庫存服務:管理庫存水準。

第 1 步:建立 Spring Boot 專案
對於每個服務,建立一個具有必要相依性的 Spring Boot 專案:



    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client

第 2 步:設定設定伺服器
建立一個配置伺服器並將其配置為從 Git 儲存庫讀取:

# application.yml for Config Server
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/your-repo/config-repo

第 3 步:向 Eureka 註冊服務
在每個微服務中,配置Eureka客戶端設定:

# application.yml for Product Service
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

第4步:設定Spring Cloud Gateway
在網關應用程式中設定路由:

# application.yml for Gateway
spring:
  cloud:
    gateway:
      routes:
        - id: product-service
          uri: lb://PRODUCT-SERVICE
          predicates:
            - Path=/products/**

第 5 步:使用 Hystrix 新增斷路器
註釋服務類別中的方法:

@HystrixCommand(fallbackMethod = "fallbackMethod")
public String getProductDetails(String productId) {
    // logic to get product details
}

public String fallbackMethod(String productId) {
    return "Product details not available";
}

第 6 步:啟用分散式追蹤
新增 Sleuth 和 Zipkin 依賴項和配置:

# application.yml for Tracing
spring:
  zipkin:
    base-url: http://localhost:9411/

結論

使用 Spring Cloud 實現微服務架構可以增強應用程式的可擴展性、彈性和可維護性。 Spring Cloud 強大的工具集簡化了建置和管理微服務的複雜性,使其成為開發人員的絕佳選擇。透過遵循最佳實踐並利用這些強大的工具,您可以創建高效、可擴展且容錯的微服務解決方案。

版本聲明 本文轉載於:https://dev.to/vidhi_jayswal/microservices-architecture-with-spring-cloud-lff?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在Python中如何創建動態變量?
    在Python中如何創建動態變量?
    在Python 中,動態創建變量的功能可以是一種強大的工具,尤其是在使用複雜的數據結構或算法時,Dynamic Variable Creation的動態變量創建。 Python提供了幾種創造性的方法來實現這一目標。 利用dictionaries 一種有效的方法是利用字典。字典允許您動態創建密鑰並...
    程式設計 發佈於2025-07-02
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,以便更快地搜索這些前綴。 理解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-07-02
  • 如何將多種用戶類型(學生,老師和管理員)重定向到Firebase應用中的各自活動?
    如何將多種用戶類型(學生,老師和管理員)重定向到Firebase應用中的各自活動?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    程式設計 發佈於2025-07-02
  • C++成員函數指針正確傳遞方法
    C++成員函數指針正確傳遞方法
    如何將成員函數置於c 的函數時,接受成員函數指針的函數時,必須同時提供對象的指針,並提供指針和指針到函數。需要具有一定簽名的功能指針。要通過成員函數,您需要同時提供對象指針(此)和成員函數指針。這可以通過修改Menubutton :: SetButton()(如下所示:[&& && && &&華)...
    程式設計 發佈於2025-07-02
  • 用戶本地時間格式及時區偏移顯示指南
    用戶本地時間格式及時區偏移顯示指南
    在用戶的語言環境格式中顯示日期/時間,並使用時間偏移在向最終用戶展示日期和時間時,以其localzone and格式顯示它們至關重要。這確保了不同地理位置的清晰度和無縫用戶體驗。以下是使用JavaScript實現此目的的方法。 方法:推薦方法是處理客戶端的Javascript中的日期/時間格式化和...
    程式設計 發佈於2025-07-02
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    程式設計 發佈於2025-07-02
  • Java為何無法創建泛型數組?
    Java為何無法創建泛型數組?
    通用陣列創建錯誤 arrayList [2]; JAVA報告了“通用數組創建”錯誤。為什麼不允許這樣做? 答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<my...
    程式設計 發佈於2025-07-02
  • 如何使用node-mysql在單個查詢中執行多個SQL語句?
    如何使用node-mysql在單個查詢中執行多個SQL語句?
    在node-mysql node-mysql文檔最初出於安全原因最初禁用多個語句支持,因為它可能導致SQL注入攻擊。要啟用此功能,您需要在創建連接時將倍增設置設置為true: var connection = mysql.createconnection({{multipleStatement:...
    程式設計 發佈於2025-07-02
  • 在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    程式設計 發佈於2025-07-02
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,將常數列添加到Spark DataFrame,該列具有適用於所有行的任意值的Spark DataFrame,可以通過多種方式實現。使用文字值(SPARK 1.3)在嘗試提供直接值時,用於此問題時,旨在為此目的的column方法可能會導致錯誤。 df.withCo...
    程式設計 發佈於2025-07-02
  • Go web應用何時關閉數據庫連接?
    Go web應用何時關閉數據庫連接?
    在GO Web Applications中管理數據庫連接很少,考慮以下簡化的web應用程序代碼:出現的問題:何時應在DB連接上調用Close()方法? ,該特定方案將自動關閉程序時,該程序將在EXITS EXITS EXITS出現時自動關閉。但是,其他考慮因素可能保證手動處理。 選項1:隱式關閉終...
    程式設計 發佈於2025-07-02
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-07-02
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-07-02
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-07-02
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-07-02

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3