知識庫 / Spring / Spring Cloud RSS 訂閱

Dapr 入門:與 Spring Cloud Gateway 集成

Spring Cloud
HongKong
6
12:30 PM · Dec 06 ,2025

1. 概述

本文將從一個 Spring Cloud Gateway 應用程序和一個 Spring Boot 應用程序開始。然後,我們將更新它們以使用 Dapr (分佈式應用程序運行時) 代替。最後,我們將更新 Dapr 配置以展示 Dapr 在與雲原生組件集成時提供的 靈活性

2. Dapr 簡介

使用 Dapr,我們可以無需對應用程序本身產生任何影響地管理雲原生應用程序的部署。Dapr 採用 側載模式,將部署相關問題從應用程序中分離出來,從而使我們能夠在不修改應用程序本身的情況下將其部署到其他環境(例如本地部署、不同的專有云平台、Kubernetes 等)中。 欲瞭解更多信息,請參閲 Dapr 網站的 概述

3. 創建示例應用程序

我們將首先創建一個示例 Spring Cloud Gateway 和 Spring Boot 應用程序。 遵循“Hello world”示例的傳統,網關將將請求代理到後端 Spring Boot 應用程序,以提供標準的“Hello world”問候。

3.1. 問候服務

首先,讓我們創建一個用於問候服務的 Spring Boot 應用程序。這是一個標準的 Spring Boot 應用程序,包含 spring-boot-starter-web 作為唯一的依賴項,標準的主類,以及服務器端口配置為 3001。

接下來,讓我們添加一個控制器來響應 hello 端點:

@RestController
public class GreetingController {
    @GetMapping(value = "/hello")
    public String getHello() {
        return "Hello world!";
    }
}

在啓動我們的問候服務應用程序後,我們將開始啓動它:

java -jar greeting/target/greeting-1.0-SNAPSHOT.jar

我們可以使用 curl 命令來返回“Hello world!” 消息:

curl http://localhost:3001/hello

3.2. Spring Cloud Gateway

現在,我們將以 3000 端口創建一個 Spring Cloud Gateway,它將作為標準的 Spring Boot 應用程序運行,並使用 spring-cloud-starter-gateway 作為唯一的依賴項以及標準的主類。 我們還將配置路由以訪問問候服務:

spring:
  cloud:
    gateway:
      routes:
        - id: greeting-service
          uri: http://localhost:3001/
          predicates:
            - Path=/**
          filters:
          - RewritePath=/?(?<segment>.*), /$\{segment}

在構建網關應用程序後,我們可以啓動網關。

java -Dspring.profiles.active=no-dapr -jar gateway/target/gateway-1.0-SNAPSHOT.jar

我們可以使用 curl 命令來從問候服務返回“Hello world!”消息:

curl http://localhost:3000/hello

4. 添加 Dapr

現在我們已經建立了一個基本的示例,接下來我們將添加 Dapr。

我們通過 配置網關與 Dapr sidecar 進行通信,而不是直接與問候服務進行通信來實現這一點。Dapr 將負責查找問候服務並轉發請求到該服務。通信路徑將從網關,通過 Dapr sidecar,然後到問候服務。

4.1. 部署 Dapr 側標

首先,我們需要部署兩個 Dapr 側標實例:一個用於網關,一個用於問候服務。我們使用 Dapr CLI 完成此操作。

我們將使用標準的 Dapr 配置文件:

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec: {}

讓我們使用 dapr 命令,在端口 4000 上啓動網關的 Dapr 副本來開始:

dapr run --app-id gateway --dapr-http-port 4000 --app-port 3000 --config dapr-config/basic-config.yaml

接下來,讓我們使用 dapr 命令在端口 4001 上啓動 greeting 服務上的 Dapr sidecar:

dapr run --app-id greeting --dapr-http-port 4001 --app-port 3001 --config dapr-config/basic-config.yaml

既然側車已啓動,我們就可以看到它們如何處理並轉發請求到問候服務。當我們使用 curl 進行測試時,它應該返回“Hello world!”問候語:

curl http://localhost:4001/v1.0/invoke/greeting/method/hello

讓我們使用網關側載容器來執行相同的測試,以確認它也能返回“Hello world!”問候語:

curl http://localhost:4000/v1.0/invoke/greeting/method/hello

這裏發生了什麼?Dapr 網關側載組件使用服務發現(在本例中,為本地環境中的 mDNS)來查找 greeting 服務側載組件。然後,它使用 服務調用 來調用 greeting 服務上的指定端點。

4.2. 網關配置

接下來,請配置網關路由,使其使用 Dapr 副容器:

spring:
  cloud:
    gateway:
      routes:
        - id: greeting-service
          uri: http://localhost:4000/
          predicates:
            - Path=/**
          filters:
          - RewritePath=//?(?<segment>.*), /v1.0/invoke/greeting/method/$\{segment}

然後,我們將使用更新後的路由重新啓動網關。

java -Dspring.profiles.active=with-dapr -jar gateway/target/gateway-1.0-SNAPSHOT.jar

我們可以使用 curl 命令再次從 greeting 服務獲取 “Hello world” 問候語:

curl http://localhost:3000/hello

當我們使用 Wireshark 觀察網絡活動時,可以發現 網關與服務之間的流量通過 Dapr sidecar 傳遞

恭喜!我們現在已經成功地將 Dapr 引入到場景中。讓我們回顧一下這給我們帶來了什麼:網關不再需要配置以查找問候服務(即問候服務的端口號不再需要在路由配置中指定),並且網關也不再需要了解請求如何轉發到問候服務。

5. 更新 Dapr 配置

現在我們已經部署了 Dapr,可以配置 Dapr 使用其他雲原生組件。

5.1. 使用 Consul 進行服務發現

使用 Consul 代替 mDNS 進行服務發現。

首先,我們需要在默認端口 8500 上安裝並啓動 Consul,然後更新 Dapr 側載配置以使用 Consul:

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec:
  nameResolution:
    component: "consul"
    configuration:
      selfRegister: true

然後我們將會重啓這兩個 Dapr sidecar 容器,並使用新的配置:

dapr run --app-id greeting --dapr-http-port 4001 --app-port 3001 --config dapr-config/consul-config.yaml
dapr run --app-id gateway --dapr-http-port 4000 --app-port 3000 --config dapr-config/consul-config.yaml

在重啓了側載機後,我們可以訪問 Consul UI 中的 Services 頁面,並查看 gateway 和 greeting 應用已列出。請注意,我們不需要重啓應用程序本身。

是不是很簡單?僅僅通過 Dapr 側載機的配置更改,我們就獲得了對 Consul 的支持,而且,最重要的是,這沒有任何對底層應用程序的影響。這與使用 Spring Cloud Consul 不同,後者需要更新應用程序本身。

5.2. 使用 Zipkin 進行追蹤

Dapr 也支持與 Zipkin 集成,用於跨應用程序追蹤調用。

首先,在默認端口 9411 上安裝並啓動 Zipkin,然後更新 Dapr sidecar 的配置以添加 Zipkin:

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec:
  nameResolution:
    component: "consul"
    configuration:
      selfRegister: true
  tracing:
    samplingRate: "1"
    zipkin:
      endpointAddress: "http://localhost:9411/api/v2/spans"

我們需要重啓這兩個 Dapr sidecar 以獲取新的配置:

dapr run --app-id greeting --dapr-http-port 4001 --app-port 3001 --config dapr-config/consul-zipkin-config.yaml
dapr run --app-id gateway --dapr-http-port 4000 --app-port 3000 --config dapr-config/consul-zipkin-config.yaml

重啓 Dapr 後,您可以使用 curl 命令並查看 Zipkin UI 以查看調用跟蹤。

再次強調,無需重啓網關和問候服務。它只需要對 Dapr 配置進行簡單的更新。與使用 Spring Cloud Zipkin 相比,這更加方便。

5.3. 其他組件

Dapr 支持多種組件,以解決諸如安全、監控和報告等其他問題。請參閲 Dapr 文檔 以獲取完整的組件列表。

6. 結論

我們已將 Dapr 添加到 Spring Cloud Gateway 與後端 Spring Boot 服務的簡單示例中。我們展示瞭如何配置和啓動 Dapr sidecar,以及它如何處理諸如服務發現、通信和跟蹤等雲原生問題。

雖然這會帶來部署和管理 sidecar 應用程序的成本,但 Dapr 提供 在不同雲原生環境中部署的靈活性,並且在與 Dapr 集成後,無需對應用程序進行更改即可處理雲原生問題。

這種方法也意味着開發人員在編寫代碼時不必被雲原生問題所困擾,從而使他們能夠專注於業務功能。一旦應用程序配置為使用 Dapr sidecar,就可以在不影響應用程序的情況下解決不同的部署問題——無需重新編碼、重新構建或重新部署應用程序。 Dapr 提供應用程序與部署之間的清晰分離

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.