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云网关

现在,我们将在端口 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 sidecar 通信 而不是直接与问候服务通信来实现此目的。然后,Dapr 将负责查找问候服务并将请求转发给它;通信路径现在将从网关开始,通过 Dapr sidecar,到达问候服务。

4.1.部署 Dapr Sidecar

首先,我们需要部署 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

让我们尝试使用 gateway 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 sidecar

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

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 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

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

看看那是多么容易吗? Dapr sidecar 的简单配置更改现在为我们提供了对 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 文档以获取完整列表

六,结论

我们已将 Dapr 添加到 Spring Cloud Gateway 与后端 Spring Boot 服务通信的简单示例中。我们展示了如何配置和启动 Dapr sidecar,以及它如何处理云原生问题,例如服务发现、通信和跟踪。

尽管这是以部署和管理 sidecar 应用程序为代价的,但 Dapr 提供了 部署到不同云原生环境和云原生问题的灵活性, 一旦与 Dapr 集成到位,无需更改应用程序。

这种方法还意味着开发人员在编写代码时不需要受到云原生问题的困扰,这使他们能够专注于业务功能。一旦将应用程序配置为使用 Dapr sidecar,就可以解决不同的部署问题,而不会对应用程序产生任何影响 - 无需重新编码、重新构建或重新部署应用程序。 Dapr 在应用程序和部署问题之间提供了清晰的分离

与往常一样,本文的完整代码可以在 GitHub 上找到。