Spring-Boot

Spring Boot 的测试教程

在前面的 Spring Boot 入门教程 中,我们学习了如何创建 Spring Boot 应用程序并构建一个简单的 REST API。 在本教程中,你将学习如何为 Spring Boot 应用程序编写单元测试、片段测试和集成测试。 测试 Spring Boot 应用 我们应该编写单元测试来验证特定单元(一个类、一个方法或一组类)的业务逻辑,而且它们不应该与任何外部服务(如数据库、队列或其他网络服务等)有联系。如果我们测试的单元依赖于任何外部服务,那么我们可以提供这些依赖关系的模拟(mock)实现,并验证单元的行为。 除了单元测试外,我们还应该编写集成测试,通过与实际服务和依赖的协作者(dependent collaborator)互动来检验子系统或组件的行为。 当我们生成 Spring Boot 应用程序时,会自动添加 spring-boot-starter-test 依赖项,它可以将 SpringTest、JUnit5、Mockito、Assertj、JsonPath、JsonAssert 等最常用的测试库作为测试依赖项添加到我们的应用程序中。 测试的类型 Unit Tests(单元测试): 这些测试用于验证单个单元的行为,最好不要依赖 Spring 或 Hibernate 等框架。 Slice Tests(片段测试): 这些测试用于验证应用程序的某个片段,如 Web 层或持久层等。Spring Boot 支持使用 @WebMvcTest、@DataJpaTest、@DataMongoTest 等测试应用程序的片段。 Integration Tests(集成测试): 这些测试以黑盒方式测试应用程序。我们传入一些输入,并期待特定的输出,但我们不知道也不关心内部是如何工作的。Spring Boot 支持使用 @SpringBootTest 编写集成测试。 使用 JUnit 5 和 Mockito 进行单元测试 我们将为之前的 Spring Boot 入门教程 中实现的 REST API 编写测试。 让我们从编写 GreetingService 的单元测试开始。我们将使用 JUnit 5 和 Mockito 来编写单元测试。

在 Spring Boot 应用中使用 Loki 记录日志

在本文中,你将学习如何收集 Spring Boot 应用程序日志并将其发送到 Grafana Loki。为此,我们将使用 Loki4j Logback appender 功能。Loki 是一个受 Prometheus 启发的可水平扩展、高度可用的日志聚合系统。我将逐步展示如何配置应用程序与 Loki 之间的集成。不过,你也可以使用我自动配置的用于记录 HTTP 请求和响应的库,它将为你完成所有这些步骤。 源码 如果你想自己尝试,可以克隆我的 GitHub 仓库。点击 此处 查看包含我的自定义 Spring Boot 日志库的源代码仓库。然后按照我的说明操作即可。 使用 Loki4j Logback Appender 为了使用 Loki4j Logback Appender,我们需要在 Maven pom.xml 中加入一个依赖。该库的当前版本为 1.4.1: <dependency> <groupId>com.github.loki4j</groupId> <artifactId>loki-logback-appender</artifactId> <version>1.4.1</version> </dependency> 然后,我们需要在 src/main/resources 目录下创建 logback-spring.xml 文件。我们的 Loki 实例在 http://localhost:3100 地址 (1) 下可用。Loki 不会索引日志内容,只会索引元数据标签。有一些静态标签,如应用程序名称、日志级别或主机名。我们可以在 format.label 字段 (2) 中设置它们。我们还将设置一些动态标签,因此要启用日志回溯标记功能 (3)。最后,我们将设置日志格式模式 (4)。为了简化 LogQL(Loki 查询语言)的潜在转换,我们将使用 JSON 符号。 <?xml version="1.0" encoding="UTF-8"?> <configuration> <springProperty name="name" source="spring.

使用 Webflux R2dbc 和 Postgres 构建响应式 Spring Boot 应用

在本文中,你将学习如何使用 Spring WebFlux、R2DBC 和 Postgres 数据库实现和测试响应式(Reactive) Spring Boot 应用程序。我们将使用最新版本的 Spring Boot 3 创建两个用 Kotlin 编写的简单应用程序。我们的应用程序通过 HTTP 公开一些 REST 端点。为了测试它们之间的通信以及与 Postgres 数据库的集成,我们将使用 Testcontainers 和 Netty Mock Server。 源码 你可以可以克隆我的 GitHub repository。它包含 employee-service 和 organization-service 两个应用程序。之后,你只需按照我的说明操作即可。 依赖 第一步,我们将添加几个与 Kotlin 相关的依赖。除了标准库,我们还可以加入 Kotlin 对 Jackson(JSON 序列化/反序列化)的支持: <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-reflect</artifactId> </dependency> 我们还需要包含两个 Spring Boot Starter。为了创建响应式 Spring @Controller,我们需要使用 Spring WebFlux 模块。有了 Spring Boot Data R2DBC Starter,我们就能以响应方式使用 Spring Data Repository。最后,我们还需要加入 R2DBC 提供的 Postgres 驱动程序。

Spring Boot 入门

Spring Boot 介绍 Spring Boot 是 Java 世界中最流行的应用程序构建框架。Spring Boot 是一种基于约定而非配置的方法,用于构建基于 Spring 框架的应用程序。 使用 Spring Boot,你可以构建单体应用程序、微服务、serverless 应用程序、批处理应用程序等不同类型的应用程序。 让我们快速了解一下 Spring Boot 有哪些关键功能使其如此受欢迎。 Spring Boot 关键特性 自动配置 Spring Boot 对应用程序有自己的约定,它会根据默认约定自动配置组件(又称 Bean),而不需要你显式配置所有内容。不过,如果需要,你可以通过各种方式自定义或覆盖 Bean 配置。 例如,如果添加 spring-boot-starter-data-jpa 依赖,它将添加 Hibernate 作为 JPA 实现,因为它是最常用的 JPA 提供程序。此外,Spring Boot 还会自动配置使用 Spring Data Jpa 所需的组件,如 DataSource、EntityManagerFactory、PlatformTransactionManager 等。如果 classpath 中存在内存 JDBC 驱动程序(如 H2 或 HSQL),那么 Spring Boot 将自动配置基于内存的数据源。 如果要使用 MySQL、Postgresql 等非内存数据库,可以添加相应的 JDBC 驱动程序 jar,并在 application.properties 文件中配置 JDBC 连接参数。然后,Spring Boot 将使用这些属性来配置 DataSource Bean,而不是使用默认的内存数据库。你甚至可以使用 @Bean 注解自行配置 DataSource Bean,然后 Spring Boot 将回退并使用你配置的 DataSource Bean,而不是自动配置。

Spring Boot 3 和 Observability(可观察性)

1、概览 在本文中,我们将学习如何在 Spring Boot 3 配置可观察性(observability)。可观察性是一种仅通过外部输出来衡量系统内部状态的能力。 此外,我们必须注意 Spring Boot 2(Spring 5)和 Spring Boot 3(Spring 6)之间的重大变化。Spring 6 引入了 Spring Observability,这是一项建立在 Micrometer 和 Micrometer Tracing(原 Spring Cloud Sleuth)基础上的新举措。它更适合使用 Micrometer 高效记录应用指标,并通过 OpenZipkin 的 Brave 或 OpenTelemetry 等 provider 实现追踪。Spring Observability 优于“基于代理的可观察性解决方案”,因为它能在原生编译的 Spring 应用程序中无缝运行,并能更有效地提供更好的信息。 我们只介绍有关 Spring Boot 3 的详细信息。如果要从 Spring Boot 2 迁移,可以在这里找到详细说明。 2、Micrometer Observation API Micrometer 是一个独立于供应商中立的“应用度量 facade”的项目。它定义了 meter、rate aggregation、counter、gauge 和 timer 等概念,每个供应商都可以根据自己的概念和工具进行调整。其中一个核心部分是 Observation API,它允许对代码进行一次性的仪表化,并具有多种优势。 仪表化是指在代码中添加监测点或仪表,以便收集关于代码执行过程的信息。这些监测点可以是特定的观测点或代码片段,用于捕获代码的执行路径、变量状态、函数调用和其他相关信息。这些信息对于代码性能分析、调试和优化非常有用。 它是 Spring Framework 多个部分的依赖项之一,因此我们需要了解这个 API,才能理解 Spring Boot 中的观察功能是如何工作的。我们可以通过一个简单的示例来实现这一点。

Spring Boot 整合 Apache Pulsar 入门指南

1、概览 Apache Pulsar 是一个分布式发布/订阅消息系统。Apache Pulsar 提供的功能与 Apache Kafka 类似,但 Pulsar 的目标是克服 Kafka 的高延迟、低吞吐量、难以扩展和地理复制等局限性。在处理需要实时处理的大量数据时,Apache Pulsar 是一个不错的选择。 在本教程中,我们将学习如在 Spring Boot 应用中整合 Apache Pulsar,以及如何使用 Pulsar 的 Spring Boot Starter 提供的 PulsarTemplate 和 PulsarListener。我们还将了解如何根据自己的需求修改它们的默认配置。 2、Maven 依赖 首先,先根据 Apache Pulsar 简介中所述,运行独立的 Apache Pulsar 服务器。 然后,将 spring-pulsar-spring-boot-starter 库添加到项目中: <dependency> <groupId>org.springframework.pulsar</groupId> <artifactId>spring-pulsar-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> 3、PulsarClient 要与 Pulsar 服务器交互,我们需要配置一个 PulsarClient。默认情况下,Spring 会自动配置一个 PulsarClient,连接到 localhost:6650 上的 Pulsar 服务器: spring: pulsar: client: service-url: pulsar://localhost:6650 我们可以更改配置,从自定义的地址上建立连接。 要连接到 ssl 下的 pulsar 服务器 ,可以使用 “pulsar+ssl” 代替 “pulsar”。我们还可以通过在 application.

使用 Spring Boot 创建 Fat Jar 应用

在本指南中,我将向你展示如何使用 Spring Boot 创建 Fat Jar。我们将一起构建一个简单的 “UsersMicroservice”,然后将其打包到 Fat Jar 中。如果你是新手,也不用担心,我会一步一步地指导你,并回答你在使用过程中遇到的各种问题。 Fat JAR 是啥? Fat JAR 通常也称为 uber-JAR,是一种 Java 归档 (JAR) 文件,它不仅包括应用程序的编译源代码,还包括运行应用程序所需的所有依赖项和资源。这些依赖项可能包括库、框架,甚至是嵌入式服务器,如 Tomcat 或 Jetty,这些通常在 Spring Boot 应用中使用。 换句话说,Fat JAR 是一个独立可直接运行的软件包。与普通 JAR 文件不同的是,普通 JAR 文件在运行应用程序时可能需要在 classpath 中存在外部依赖,而 Fat JAR 文件则完全自给自足,可以在任何已安装 Java 虚拟机(JVM)的系统上运行,无需安装或设置任何额外的依赖。 为什么使用 Fat JAR? 使用 Fat JAR 有几个好处: 简单: 由于 Fat JAR 包已经含运行应用程序所需的所有内容,因此它简化了部署过程。没有在部署环境中设置和管理外部依赖的负担。 可移植性: 你可以在任何支持 JVM 的平台上运行 fat JAR。这使得它具有极高的可移植性,非常适合各种环境,包括不同的开发、测试、暂存和生产设置。 微服务架构: Fat JAR 在微服务架构中尤其有用。在这种架构风格中,每个微服务通常都是一个独立的应用程序,可以独立开发、部署和扩展。将每个微服务打包为 Fat JAR,可以方便地分别管理和部署每个服务。 一致性: 将应用程序打包为 fat JAR 时,可以确保在构建和运行应用程序时使用同一套依赖。这有助于避免在构建和运行时使用不同版本的依赖时可能出现的问题。 尽管有这些优点,但也要注意 fat JAR 的缺点。fat JAR 可能比普通 JAR 大得多,这会减慢构建和启动速度,并占用更多资源。此外,如果同一系统中的多个 fat JAR 使用相同的依赖,这可能会导致冗余,因为每个 JAR 都包含每个依赖的副本。

Spring Boot 3:使用 HTTP API 的 Problem Details 进行错误响应

Spring Framework 6 实现了 “Problem Details for HTTP APIs(HTTP API 的问题细节规范)”(RFC 7807)。在本文中,我们将学习如何在 SpringBoot 3 REST API(使用 Spring Framework 6)中处理异常,并使用 ProblemDetails API 提供错误响应。 假设我们有以下 REST API 端点,用于创建书签(bookmark)和按 ID 获取书签。 @RestController @RequestMapping("/api/bookmarks") @RequiredArgsConstructor public class BookmarkController { private final BookmarkService service; @PostMapping public ResponseEntity<Bookmark> save(@Valid @RequestBody Bookmark payload) { Bookmark bookmark = new Bookmark(null, payload.title(), payload.url(), Instant.now()); return ResponseEntity.status(HttpStatus.CREATED).body(service.save(bookmark)); } @GetMapping("/{id}") public ResponseEntity<Bookmark> getBookmarkById(@PathVariable Long id) { return service.getBookmarkById(id) .map(ResponseEntity::ok) .orElseThrow(() -> new BookmarkNotFoundException(id)); } } 而且,BookmarkNotFoundException 是一种典型的 RuntimeException,具体如下:

使用 API Key 和 Secret 保护 Spring Boot API

1、概览 安全在 REST API 开发中起着至关重要的作用。不安全的 REST API 可以直接访问后端系统的敏感数据。因此,企业需要关注 API 的安全性。 Spring Security 提供了各种机制来保护我们的 REST API。其中之一就是 API key。API key 是客户端在调用 API 时提供的 Token。 在本教程中,我们将讨论 Spring Security 中基于 API key 的身份认证的实现。 2、REST API 安全 Spring Security 可用于保护 REST API。REST API 是无状态的。因此,它们不应使用会话或 cookie。相反,它们应该使用 Basic authentication、API key、JWT 或基于 OAuth2 的 token 来确保安全。 2.1、Basic Authentication Basic authentication 是一种简单的身份认证方案。客户端发送 HTTP 请求时,Authorization 包含 Basic 字样,后面跟一个空格和一个 Base64 编码的字符串 username:password。Basic authentication 只有在使用 HTTPS/SSL 等其他安全机制时才被认为是安全的。 2.2、OAuth2 OAuth2 是 REST API 安全性的事实标准。它是一个开放的身份认证和授权标准,允许资源所有者通过 access token 权客户端访问私有数据。

Spring Boot 3 中对 Docker Compose 的支持

1、概览 Spring Boot 3 具有一些新功能,比如将我们的应用程序构建为 GraalVM Native Image(原生镜像)。另一个相关支持是 Docker Compose。 在本教程中,我们将了解如何将 Docker Compose 工作流与 Spring Boot 3 整合。 2、Spring Boot 3 的 Docker Compose Support 提供了什么? 通常,我们会根据 docker-compose.yml 运行 docker-compose up 来启动和 docker-compose down 来停止我们的容器。现在,我们可以将这些 Docker Compose 命令委托给 Spring Boot 3。当 Spring Boot 应用程序启动或停止时,它也会管理我们的容器。 此外,它还内置了对多种服务的管理,如 SQL 数据库、MongoDB、Cassandra 等。因此,我们可能不需要在 application 资源文件中重复配置 class 或 properties。 最后,我们会看到如何在该支持中使用自定义 Docker 镜像和 Docker Compose profiles 。 3,设定 我们需要 Docker Compose 和 Spring Boot 3 来探索这种新的支持。 3.1、Docker Compose Docker Compose 需要已安装的 Docker 引擎。它们很容易安装,不过根据操作系统的不同可能会有差异。