Contents

DAPR与Spring Cloud网关介绍

1. 概述

在本文中,我们将从一个 Spring Cloud Gateway  应用程序和一个Spring Boot 应用程序开始。然后,我们将更新它以改用Dapr(分布式应用程序运行时) 。最后,我们将更新 Dapr 配置以展示Dapr 在与云原生组件集成时提供的灵活性

2. Dapr 简介

使用 Dapr,我们可以管理云原生应用程序的部署,而不会对应用程序本身产生任何影响。Dapr 使用sidecar 模式  来卸载应用程序的部署问题,这允许我们将其部署到其他环境(例如内部部署、不同的专有云平台、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 网关

现在,我们将在端口 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 Sidecars

首先,我们需要部署两个 Dapr sidecar 实例——一个用于网关,一个用于问候服务。我们使用Dapr CLI 执行此操作。

我们将使用标准的 Dapr 配置文件:

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

让我们使用dapr命令在端口 4000 上为网关启动 Dapr sidecar :

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

接下来,让我们使用dapr命令在端口 4001 上启动问候语服务的 Dapr sidecar :

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

现在 Sidecar 正在运行,我们可以看到它们如何处理拦截请求并将请求转发到问候服务。当我们使用curl对其进行测试时,它应该返回“Hello world!” 问候语:

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

让我们尝试使用网关 sidecar 进行相同的测试,以确认它也返回“Hello world!” 问候语:

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

幕后发生了什么?网关的 Dapr sidecar 使用服务发现(在本例中为本地环境的 mDNS)来查找问候服务的 Dapr sidecar。然后,它使用服务调用 来调用问候服务上的指定端点。

4.2. 更新网关配置

下一步是将网关路由配置为使用其 Dapr sidecar:

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命令对其进行测试,再次从问候语服务中获取“Hello world”问候语:

curl http://localhost:3000/hello

当我们使用Wireshark 查看网络上发生的情况时,我们可以看到网关和服务之间的流量通过 Dapr sidecars

恭喜!我们现在已经成功地将 Dapr 纳入其中。让我们回顾一下这给我们带来了什么:不再需要配置网关来寻找问候服务(即不再需要在路由配置中指定问候服务的端口号),网关不再需要了解如何将请求转发到问候服务的详细信息。

5. 更新Dapr配置

现在我们已经有了 Dapr,我们可以配置 Dapr 来使用其他云原生组件。

5.1. 使用 Consul 进行服务发现

让我们使用Consul  来进行服务发现而不是 mDNS。

首先,我们需要在默认端口 8500 上安装并启动 Consul,然后更新Dapr sidecar 配置以使用 Consul:

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

然后我们将使用新配置重启两个 Dapr sidecars:

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

一旦 sidecars 重新启动,我们就可以访问 consul UI 中的服务页面,并看到列出的网关和问候应用程序。请注意,我们不需要重新启动应用程序本身。

看看这有多容易?Dapr sidecars 的简单配置更改现在为我们提供了对 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 sidecars 来获取新的配置:

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 文档 以获得完整列表。