2.5.2 工程中用到的技术和模式

每当我在书中介绍一个新话题时,将向您展示如何将前面讲过的技术或模式应用于 极地书店 项目。在本节中,我概述一下我们将要解决的主要问题,以及我们将使用哪些技术和模式来解决这些问题。

网络交互

极地书店 包含多个服务,这些服务必须相互通信才能实现它们的功能。您将构建通过 HTTP 同步交互的 RESTful 服务。无论是以阻塞方式(传统 servlet)还是以非阻塞方式(响应式编程)。而且 SpringMVC 和 Spring WebFlux (在 Project Reactor 基础上)将是您实现这一结果的主要工具。

在构建云原生应用程序时,应该记住设计松散耦合的应用程序服务,并考虑如何在分布式系统上下文中保持数据一致性。在需要完成一项复杂功能时,会涉及很多的服务,同步通信可能会产生问题。这就是为什么事件驱动编程在云中越来越流行的原因:它让您克服了同步通信的难题。

我将向您展示如何使用事件和消息,来解耦服务并确保数据一致性。您将使用 Spring Cloud Stream 实现服务之间的数据流,以及 Spring Cloud Function 将消息处理程序定义为函数。后一种方法可以自然地在部署到支持无服务的平台,如 Azure Function、AWS Lambda、Knative 等。

数据

数据是软件系统的重要组成部分。在 极地书店 系统中,您将使用关系型数据库 PostgreSQL 存储应用程序数据。我会演示如何使用 Spring Data JDBC (被动式)和 Spring Data R2DBC(响应式)将应用程序与数据源集成。然后,您将看到如何进一步优化数据源并使用 Flyway 管理迁移脚本。

云原生应用程序应该是无状态的,但状态需要存储在某个地方。在 极地书店 中,您将使用 Redis 将会话信息进行外部存储,保留应用程序无状态且可扩展。Spring Session 使实现集群用户传话变得容易。特别是,我将向您展示如何使用 Spring Session Data Redis 集成 web 会话管理。

除了持久化数据和会话之外,您还将实现事件驱动编程模式。Spring AMQP 和 RabbitMQ 将是要使用的技术。

在本地,您将在 Docker 容器中运行这些数据服务。在生产中,使用 Azure Kubernetes Service(AKS),您将依赖云服务商提供的托管服务,它解决了高可用性、集群、存储和数据复制等关键问题。

配置

在本书中,我将向您展示如何在不同的环境中配置 极地书店 中的服务。首先,我将探讨 Spring Boot 提供的 properties 和 profile,以及何时使用它们。然后,您将学习将 Spring 应用程序作为 JAR 在容器里运行时,如何使用环境变量作为外部配置。最后,我来教您如何在 Kubernetes 中使用 ConfigMaps 和 Secrets。您还将看到如何通过 Spring Cloud Config 进行集中配置管理,以及在运行时使用 Spring Cloud Bus 更新配置。

路由

极地书店 是一个分布式系统,需要一些路由配置。Kubernetes 具有内置的服务发现功能,可帮助您将服务与物理地址和主机名分离。云原生应用程序是可伸缩的,因此服务之间的交互应该考虑到:要调用哪个实例呢?再一次,Kubernetes 为您提供了负载均衡功能,因此您无需在应用程序中再进行处理了。

我将指导您使用 Spring Cloud Gateway 实现一个服务,该服务将充当 API 网关,用于把任何内部 API 变化与外部隔离。它还将是一种边缘服务,将一次性解决跨领域的问题,如安全性和韧性。这样的服务将是 极地书店 的入口,必须高可用、性能良好,并且具有容错能力。

可观测性

极地书店 系统中的服务必须是可观测的,这才是云原生服务。我将向您展示如何使用 Spring Boot Actuator 设置健康和信息端点,并公开相关度量给 Prometheus 进行提取并处理。然后您将使用 Grafana 可视化最关键的指标,并显示在仪表板中。

请求可以由多个服务处理,因此需要分布式链路跟踪,跟踪从一个服务到另一个服务的请求流。您会和我一起设置 Spring Cloud Sleuth。然后,Grafana Tempo 将提取、处理并可视化整个链路,让您可以完整地了解系统是如何完成其功能的。

最后,我们需要一个适当的日志策略。我们应该将日志作为事件流处理,因此让您的 Spring 应用程序将日志事件流化为标准输出,而不考虑它们是如何处理或存储的。Fluent Bit 将负责从所有服务收集日志,Grafana Loki 将存储和处理它们,Grafana 将允许您查询日志。

韧性

云原生应用程序应该具有韧性。对于 极地书店 项目,我将向您展示使用 Project Reactor、Spring Cloud Circuit Breaker 以及 Resilience4J 等使应用程序具有韧性的各种技术,用于实施断路器、重试、超时和其他模式。

安全

安全是一个广泛的主题,我在本书中无法深入讨论。不过,我还是会简单讨论这个主题,因为它是当今最关键的软件关注点之一。这是一个从项目一开始就应持续关注并解决的普遍问题,并且不能掉以轻心。

对于 极地书店,我将向您展示如何将身份验证和授权功能添加到云原生应用程序中。您将看到如何保护服务之间,以及用户和应用程序间的通信。您将依靠 OAuth 2.0 和 OpenID Connect 来实现这些功能。Spring Security 支持这些标准,可以无缝集成以提供身份验证和授权。您将使用 Keycloak 进行身份和访问控制管理。

此外,我还将介绍密钥管理和加密的概念。当然也不能非常深入讨论这些主题。但我将向您展示如何管理机密来配置 Spring 服务(直接使用配置服务器和 Kubernetes 时)。

测试

自动化测试对于云原生应用程序的成功至关重要。自动化测试将在几个级别覆盖 极地书店 应用程序。我将向您展示如何使用 JUnit5 编写单元测试。Spring Boot 添加了许多方便的实用程序来改进集成测试,您将使用它们来确保您的服务质量。您将为各种 极地书店 功能编写测试类,包括 REST 端点、消息流和数据集成和安全性。

保持跨环境的对等性,对于确保应用程序的质量至关重要。尤其是在支持服务方面。在生产中,您将使用的服务是 PostgreSQL 和 Redis。在测试期间,您应该使用类似的服务,而不是模拟或者特定于测试的工具,如内存中的 H2 数据库。Testcontainers 框架将帮助您使用真实服务进行自动化测试。

构建和部署

极地书店 的主要服务是使用 Spring。您将看到如何打包 Spring 应用程序,将其作为 JAR 文件运行,使用 Cloud Native Buildpacks 对其进行容器化,使用 Docker 运行,最后,您将使用 Kubernetes 部署容器。您还将看到如何使用 Spring Native 和 GraalVM 将 Spring 应用程序编译为本机镜像,并在无服务器架构中使用它们。利用无服务器的即时启动、即时峰值性能、减少内存消耗、减少图像大小。然后,您将在托管服务器上部署它们,基于 Knative(Google Cloud Run)的无服务器平台。

我将向您展示如何通过 GitHub Actions 设置部署流水线(CI/CD)来自动化构建。流水线将在每次提交时构建应用程序,运行测试,然后打包以备部署。这种自动化将是向客户持续交付文化的一部分,快速可靠地为客户带来价值。最后,您还将使用 GitOps 在 Azure Kubernetes 服务(AKS)上自动部署 极地书店 到 Kubernetes 群集。

UI

这本书的重点是后端技术,所以我不会教您任何前端内容。当然,您的应用程序需要一个前端,以便用户与之交互。 极地书店 将依赖使用 Angular 框架的客户端应用程序。我不会在本书中展示 UI 应用程序代码,因为它超出了本书的范围,但我会将相关代码放在本书附带的代码存储库中。

results matching ""

    No results matching ""