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

使用 Spring Boot 和 Spring Cloud 開發微服務

發佈於2024-11-06
瀏覽:331

Developing Microservices with Spring Boot and Spring Cloud

微服務架構已成為建構可擴展和模組化系統的流行解決方案。透過微服務,您可以將單一應用程式分解為更小的、獨立的和專業的服務,這使得系統的維護和發展變得更加容易。在這篇文章中,我們將探討如何使用 Spring Boot 和 Spring Cloud 來創造健壯且有效率的微服務。

微服務簡介
微服務背後的主要思想是將應用程式拆分為可以獨立開發、部署和擴展的小型服務。每個微服務應該負責特定的功能,並以輕量級的方式與其他服務進行通信,通常使用 REST API 或訊息傳遞。

微服務的一些優點包括:

  • 獨立擴充:每個服務都可以單獨擴充。
  • 持續部署:您可以更新或修復微服務而不影響其他微服務。
  • 技術靈活性:每個服務可以使用不同的技術和框架來實現。 現在,讓我們看看如何使用 Spring Boot 和 Spring Cloud 建立和管理微服務。

現在,讓我們來看看如何使用Spring BootSpring Cloud創建和管理微服務。

使用 Spring Boot 建立微服務

Spring Boot 專注於最少的配置和快速啟動,因此可以輕鬆建立微服務。讓我們先建立兩個微服務:「使用者」服務(User-service)和「訂單」服務(Order-service)。

  1. 設定 Spring Boot 專案

要設定微服務,您可以使用 Spring Initializr 產生具有所需相依性的新項目,例如 Spring Web 和 Spring Data JPA。以下是用戶服務中 REST 控制器的基本範例:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity getUserById(@PathVariable Long id) {
        User user = new User(id, "Matheus");
        return ResponseEntity.ok(user);
    }
}

每個微服務可以擁有自己的資料庫,保證服務獨立、解耦。對於使用者服務,我們可以使用 H2 或 PostgreSQL 等設定。

  1. 公開 REST API 每個微服務都透過 REST API 公開其資源,允許其他服務或用戶端使用其功能。以下是 Order-service 中使用使用者服務 API 的端點範例:
@RestController
@RequestMapping("/orders")
public class OrderController {

    private final RestTemplate restTemplate;

    public OrderController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/{id}")
    public ResponseEntity getOrderById(@PathVariable Long id) {
        User user = restTemplate.getForObject("http://user-service/users/"   id, User.class);
        Order order = new Order(id, user, "Order details");
        return ResponseEntity.ok(order);
    }
}

RestTemplate 用於在微服務之間發出 HTTP 請求。

使用 Spring Cloud 管理微服務
雖然 Spring Boot 有助於快速建立微服務,但 Spring Cloud 提供了額外的工具來管理分散式環境中這些服務的通訊和彈性。讓我們介紹一些基本組件。

  1. 尤里卡發現伺服器 微服務的挑戰之一是服務發現。 Eureka 是一個發現伺服器,允許服務註冊自身並發現其他服務,而無需固定 URL。
  • 將 spring-cloud-starter-netflix-eureka-server 依賴新增至 Eureka 伺服器。
  • 在User-service和Order-service中設定application.yml文件,註冊到Eureka伺服器:
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

現在,服務將自動註冊到Eureka,使它們更容易發現彼此。

  1. API 閘道與 Spring Cloud Gateway 在微服務架構中,為所有服務提供單一入口點至關重要。 API 閘道充當客戶端和微服務之間的中介,有效地路由請求。

新增 spring-cloud-starter-gateway 依賴以建立簡單閘道:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://USER-SERVICE
          predicates:
            - Path=/users/**
        - id: order-service
          uri: lb://ORDER-SERVICE
          predicates:
            - Path=/orders/**

這樣,任何對 /users/** 的請求都將被路由到用戶服務,這同樣適用於 /orders/**。

3.** 斷路器的彈性 (Hystrix)**

在微服務環境中,失敗是不可避免的。 Hystrix 是一個斷路器,透過隔離故障來保護服務免受過載。以下是如何將其應用於使用其他服務的方法的範例:

@HystrixCommand(fallbackMethod = "fallbackGetUser")
public User getUser(Long id) {
    return restTemplate.getForObject("http://user-service/users/"   id, User.class);
}

public User fallbackGetUser(Long id) {
    return new User(id, "Default User");
}

如果使用者服務失敗,將呼叫fallbackGetUser方法,確保系統保持功能。

Spring Boot 與 Spring Cloud 相結合,為開發可擴展且有彈性的微服務提供了出色的基礎設施。透過服務發現、路由和故障管理等功能,您的應用程式將為在分散式動態環境中運行做好充分準備。

無論您是從單體應用程式遷移到微服務還是從頭開始,Spring Boot 和 Spring Cloud 都可以加速您的流程並確保堅實的架構。

您喜歡這篇文章嗎?如果您有任何問題或建議,請在評論中留下!並且不要忘記與可以從這些技巧中受益的其他開發人員分享。

版本聲明 本文轉載於:https://dev.to/matheusmartinello/developing-microservices-with-spring-boot-and-spring-cloud-5feh?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在 Hacktoberfest 中做出貢獻的新方式:直接在前端 AI
    在 Hacktoberfest 中做出貢獻的新方式:直接在前端 AI
    Hacktoberfest 又回來了,今年為開發者帶來了一種令人興奮的新參與方式。 您現在可以直接透過 Webcrumbs 平台上的 Frontend AI 建立和提交模板,而不是傳統的 GitHub Pull 請求。只需前往tools.webcrumbs.org,對模板進行編碼,然後在準備好後點擊...
    程式設計 發佈於2024-11-07
  • 為什麼使用不帶括號的函數指標時“cout”列印“1”?
    為什麼使用不帶括號的函數指標時“cout”列印“1”?
    為什麼「cout a function without call it (not f() but f;). Print 1 Always?」在此程式碼中,程式碼嘗試在不使用括號的情況下「呼叫」名為pr 的函數。然而,這實際上並不是呼叫該函數。相反,它將函數指標傳遞給 cout 函數。當函數指標隱式轉...
    程式設計 發佈於2024-11-07
  • 讓您的網頁更快
    讓您的網頁更快
    什么是 DOM?它吃什么? DOM(文档对象模型)是网页及其开发的基础。它是 HTML 和 XML 文档的编程接口,以树状对象表示文档的结构。有树枝和树叶。文档中的每个元素、属性和文本片段都成为该树中的一个节点。它允许 JavaScript 与 HTML 元素交互、修改它们或添加新...
    程式設計 發佈於2024-11-07
  • JavaScript 中的 require 與 import
    JavaScript 中的 require 與 import
    我記得當我開始編碼時,我會看到一些js檔案使用require()來匯入模組和其他檔案使用import。這總是讓我感到困惑,因為我並不真正理解其中的差異是什麼,或者為什麼專案之間存在不一致。如果您想知道同樣的事情,請繼續閱讀! 什麼是 CommonJS? CommonJS 是一組用於...
    程式設計 發佈於2024-11-07
  • 使用鏡像部署 Vite/React 應用程式:完整指南
    使用鏡像部署 Vite/React 應用程式:完整指南
    在 GitHub Pages 上部署 Vite/React 应用程序是一个令人兴奋的里程碑,但这个过程有时会带来意想不到的挑战,特别是在处理图像和资产时。这篇博文将引导您完成整个过程,从最初的部署到解决常见问题并找到有效的解决方案。 无论您是初学者还是有经验的人,本指南都将帮助您避免常见的陷阱,并...
    程式設計 發佈於2024-11-07
  • 我如何在我的 React 應用程式中優化 API 呼叫
    我如何在我的 React 應用程式中優化 API 呼叫
    作为 React 开发者,我们经常面临需要通过 API 同步多个快速状态变化的场景。对每一个微小的变化进行 API 调用可能效率低下,并且会给客户端和服务器带来负担。这就是去抖和巧妙的状态管理发挥作用的地方。在本文中,我们将构建一个自定义 React 钩子,通过合并有效负载和去抖 API 调用来捕获...
    程式設計 發佈於2024-11-07
  • 我們走吧!
    我們走吧!
    為什麼你需要嘗試 GO Go 是一種快速、輕量級、靜態類型的編譯語言,非常適合建立高效、可靠的應用程式。它的簡單性和簡潔的語法使其易於學習和使用,特別是對於新手來說。 Go 的突出功能包括內建的 goroutine 並發性、強大的標準庫以及用於程式碼格式化、測試和依賴管理的強大工具...
    程式設計 發佈於2024-11-06
  • 如何將 PNG 圖像編碼為 CSS 資料 URI 的 Base64?
    如何將 PNG 圖像編碼為 CSS 資料 URI 的 Base64?
    在CSS 資料URI 中對PNG 圖像使用Base64 編碼為了使用資料URI 將PNG 圖片嵌入到CSS 樣式表中,PNG資料必須先編碼為Base64 格式。此技術允許將外部圖像檔案直接包含在樣式表中。 Unix 命令列解決方案:base64 -i /path/to/image.png此指令將輸出...
    程式設計 發佈於2024-11-06
  • API 每小時資料的響應式 JavaScript 輪播
    API 每小時資料的響應式 JavaScript 輪播
    I almost mistook an incomplete solution for a finished one and moved on to work on other parts of my weather app! While working on the carousel that w...
    程式設計 發佈於2024-11-06
  • 用於 Web 開發的 PHP 和 JavaScript 之間的主要差異是什麼?
    用於 Web 開發的 PHP 和 JavaScript 之間的主要差異是什麼?
    PHP 與 JavaScript:伺服器端與客戶端 PHP 的作用與 JavaScript 不同。 PHP 運行在伺服器端。伺服器運行應用程式。除此之外,它還處理表單。當您提交表單時,PHP 會對其進行處理。另一方面,JavaScript 是客戶端的。它在瀏覽器中運行。它處理頁面互...
    程式設計 發佈於2024-11-06
  • 如何在 C++ 中迭代結構和類別成員以在運行時存取它們的名稱和值?
    如何在 C++ 中迭代結構和類別成員以在運行時存取它們的名稱和值?
    迭代結構體和類別成員在 C 中,可以迭代結構體或類別的成員來檢索它們的名稱和價值觀。以下是實現此目的的幾種方法:使用巨集REFLECTABLE 巨集可用於定義允許自省的結構。該巨集將結構體的成員定義為以逗號分隔的類型名稱對清單。例如:struct A { REFLECTABLE ( ...
    程式設計 發佈於2024-11-06
  • 如果需要準確答案,請避免浮動和雙精度
    如果需要準確答案,請避免浮動和雙精度
    float 和 double 問題: 專為科學和數學計算而設計,執行二元浮點運算。 不適合貨幣計算或需要精確答案的情況。 無法準確表示10的負次方,例如0.1,從而導致錯誤。 範例1: 減去美元金額時計算錯誤: System.out.println(1.03 - 0.42); // Resu...
    程式設計 發佈於2024-11-06
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-06
  • 如何在 Python 中使用代理程式運行 Selenium Webdriver?
    如何在 Python 中使用代理程式運行 Selenium Webdriver?
    使用Python 中的代理程式執行Selenium Webdriver當您嘗試將Selenium Webdriver 腳本匯出為Python 腳本並從命令列執行時,可能會遇到在使用代理的情況下出現錯誤。本文旨在解決此問題,提供使用代理有效運行腳本的解決方案。 代理整合要使用代理程式來執行 Selen...
    程式設計 發佈於2024-11-06
  • || 什麼時候運算子充當 JavaScript 中的預設運算子?
    || 什麼時候運算子充當 JavaScript 中的預設運算子?
    理解|| 的目的JavaScript 中非布林運算元的運算子在JavaScript 中,||運算子通常稱為邏輯OR 運算符,通常用於計算布林表達式。但是,您可能會遇到 || 的情況。運算符與非布林值一起使用。 在這種情況下,||運算子的行為類似於「預設」運算子。它不傳回布林值,而是根據某些規則傳回左...
    程式設計 發佈於2024-11-06

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

Copyright© 2022 湘ICP备2022001581号-3