教程

在 Spring Boot 中测试 Kafka

1、概览 Apache Kafka 是一个功能强大、分布式、容错的流处理系统。在之前的教程中,介绍了 如何在 Spring 中整合、使用 Kafka。 本文将在 上一节 的基础上带你了解如何编写可靠、独立的集成测试,而不依赖于外部运行的 Kafka 服务器。 2、依赖 在 pom.xml 中添加标准的 spring-kafka 依赖: <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.7.2</version> </dependency> 以及两个专门用于测试的依赖,spring-kafka-test 和 Testcontainers Kafka(注意,都是 Test Scope)。 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka-test</artifactId> <version>2.6.3.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testcontainers</groupId> <artifactId>kafka</artifactId> <version>1.19.3</version> <scope>test</scope> </dependency> 3、简单的 Kafka 生产者-消费者应用 这是一个标准的 Spring Boot 应用,Application 类如下: @SpringBootApplication public class KafkaProducerConsumerApplication { public static void main(String[] args) { SpringApplication.run(KafkaProducerConsumerApplication.class, args); } } 3.1、生产者设置 接下来,创建 Producer bean,用它来向指定的 Kafka Topic 发送消息:

Spring Boot 重用 Docker 层

1、简介 Docker 是创建独立应用的事实标准。从 2.3.0 版开始,Spring Boot 包含了多项增强功能,可帮助我们创建高效的 Docker 镜像。例如:它允许将应用分解成不同的层。 换句话说,源代码位于自己的层中。因此,它可以独立重建,从而提高效率并缩短启动时间。本文将带你了解如何利用 Spring Boot 重用 Docker 层。 2、Docker 中的分层 jar Docker 容器由基础镜像和额外的层组成。一旦层构建完成,它们将保持缓存状态。因此,后续的生成速度会更快: 对底层层级的更改也会重新构建上层层级。因此,不经常更改的层级应保持在底部,而经常更改的层级应放在顶部。 同样,Spring Boot 允许将工件(构建产物)内容映射到层中。默认的层映射如下: 你可以看到,应用有自己的层。修改源代码时,只会重新构建独立的层。loader 和依赖保持缓存,从而减少了 Docker 镜像的创建和启动时间。接下来看看如何使用 Spring Boot 实现这一点! 3、Spring Boot 创建高效的 Docker 镜像 在传统的构建 Docker 镜像的方式中,Spring Boot使用的是 “fat jar” 方法。一个工件就包含了所有依赖项和应用源代码。因此,源代码的任何变化都会迫使我们重建整个层。 3.1、Spring Boot 分层配置 Spring Boot 2.3.0 版引入了两个新功能来改进 Docker 镜像的生成: Buildpack 支持提供了应用的 Java 运行时环境,因此现在可以跳过 Dockerfile,并自动构建 Docker 镜像。 分层 JAR 可以帮助我们最大限度地利用 Docker 层的生成 在本文中,我们将对分层 JAR 方法进行扩展。 首先,在 Maven 中设置分层 JAR 。在打包工件时,生成层。

CDS(Class Data Sharing)在 Spring 6.1 中的应用

正如 官方文档 所述,类数据共享(CDS)通过将类元数据缓存在 Archive(归档/存档) 文件中,使其可以快速预加载到新启动的 JVM 中,从而帮助缩短 JVM 的启动时间和内存占用。这加快了类加载速度,而类加载速度是启动时间的一个重要因素。大多数最新的 JDK 发行版中预先打包了默认的 CDS 归档,其中包含了常见 JDK 类的元数据。你也可以创建自定义的 CDS 归档,以加快类在自己应用中的加载速度。 GraalVM 原生镜像 和 Project CRaC 都能让 Spring Boot 应用在几十毫秒内启动。那么,为什么要关注 CDS 呢? 主要有三个原因: 它是 OpenJDK 主线中成熟且可用于生产的技术,与 GraalVM 和 Project CRaC 相比,它更易于使用,因为它具有较少的限制和副作用。 正如 Brian Goetz 在他在 Devoxx 上的 Project Leyden 演讲 中提到的:“大多数人今天不使用 CDS,但可能应该使用,因为他们可以通过相对较少的工作获得合理的启动性能提升。” 在每一个新的 JVM 版本中,这项技术都会变得越来越好,Project Leyden 的目标是在不久的将来增加更多的优势。 接下来,让我们一起探究 CDS 能为你的 Spring 应用带来什么? 在 Spring 6.1 中引入 CDS 初始支持 Spring 6.1 带来了一个新的 “类数据共享” 文档章节,解释了优化应用的两个步骤: 使用新增的 -Dspring.

Thymeleaf 变量

1、简介 本文将通过一个 Spring Boot 示例带你了解 Thymeleaf 中的变量。 2、Maven 依赖 要使用 Thymeleaf,需要添加 spring-boot-starter-thymeleaf 和 spring-boot-starter-web 依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 3、Web Controller 首先,创建一个带有 GET 端点的 Web Controller,该端点返回一个包含文章列表的页面。 @GetMapping 方法只接受一个参数 - Model。它包含所有可在 Thymeleaf 模板中使用的全局变量。在本例中,Model 只有一个参数,即文章列表。 Article 类由两个 String 字段(name 和 url)组成: public class Article { private String name; private String url; // 构造函数、get、set 方法省略 } Controller 方法的返回值应该是要渲染的 Thymeleaf 模板的名称。该名称应与 src/resource/template 目录中的 HTML 文件相对应。在本例中,就是 src/resource/template/articles-list.html。 Controller 如下: @Controller @RequestMapping("/api/articles") public class ArticlesController { @GetMapping public String allArticles(Model model) { model.

在 Docker Compose 中运行 PostgreSQL 和 Spring Boot

1、概览 本文将带你了解如何使用 Docker Compose 来运行 Spring Boot 和 PostgreSQL。 2、创建 Spring Boot 应用 从 Spring Initializer 创建 Spring Boot 项目,添加 PostgreSQL 驱动和 Spring Data JPA 依赖。下载生成的 ZIP 文件并解压到文件夹后,就可以运行应用了: ./mvnw spring-boot:run 应用启动失败,因为连接数据库失败: *************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class 3、Dockerfile 在使用 Docker Compose 启动 PostgreSQL 之前,需要将 Spring Boot 应用转化为 Docker 镜像。第一步是将应用打包为 JAR 文件:

Spring Webflux 教程

1、概览 Spring 5 引入了 Spring WebFlux 框架,为 Web 应用提供响应式编程支持。 本文将带你了解如何使用响应式 Web 组件 RestController 和 WebClient 创建一个小型响应式 REST 应用,以及如何使用 Spring Security 来保护响应式端点。 2、Spring WebFlux 框架 Spring WebFlux 内部使用 Project Reactor 及其 Publisher(发布者)实现、Flux 和 Mono。 WebFlux 支持两种编程模式: 基于注解的响应式组件 函数式路由和处理 本文重点介绍基于注解的响应式组件。 3、依赖 首先从 spring-boot-starter-webflux 依赖开始。 它会传递依赖其他所有的依赖: spring-boot 和 spring-boot-starter,用于基本的 Spring Boot 应用设置 spring-webflux 框架 响应式流(Reactive Stream)所需的 reactor-core 以及 reactor-netty <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <version>3.1.2</version> </dependency> 可从 Maven Central 下载最新的 spring-boot-starter-webflux。 4、响应式 REST 应用 现在,使用 Spring WebFlux 构建一个非常简单的响应式 REST EmployeeManagement 应用:

Spring Boot Actuator

1、概览 本文将带你了解 Spring Boot Actuator,以及如何在 Spring Boot 和 WebFlux 中使用、配置和扩展这个监控工具,充分利用响应式编程模型。 2、Actuator 是啥? 从本质上讲,Actuator 为应用带来了生产就绪的功能。 有了 Actuator 后,监控应用程序、收集指标、了解流量或数据库状态就变得易如反掌。 这个库的主要好处是,可以获得生产级工具,而无需自己实际实现这些功能。 Actuator 主要公开应用的运行信息 - 健康状况、指标、信息、转储(dump)、环境等。它使用 HTTP 端点或 JMX Bean 与客户端进行交互。 一旦在 classpath 中添加了该依赖,多个端点就已经开箱即用。与大多数 Spring 模块一样,可以通过多种方式轻松配置或扩展它。 3、入门 首先,在 Spring Boot 项目中添加 spring-boot-actuator 依赖,以启用 Spring Boot Actuator。 Mave: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 该依赖的版本号已经在 spring-boot-starter-parent 中声明了,所以只要你继承了 Parent 项目,不需要手动声明版本号。 Actuator 与技术无关,Actuator 将其模型定义为可插拔和可扩展的,而不依赖 MVC。因此,可以利用 MVC 和 WebFlux 作为底层 Web 实现,还可以通过实现正确的适配器来添加新的实现。也支持 JMX,无需任何额外代码即可暴露端点。 4、端点配置 4.2、默认端点和安全配置 Actuator 禁用了大部分端点。因此,默认情况下只有 /health 和 /info 这两个端点可用。

Java 使用 AES 进行加密和解密

在 上一文 一文中,介绍了如何在 Java 中使用 RSA 非对称加密算法 进行加密、解密、生成数字签名和验签。 和 “非对称加密算法” 对应的就是 “对称加密算法”。非对称加密算法(如 RSA)的密钥通常由 公钥 和 私钥 组成,且遵守公钥加密、私钥解密的模式。而对称加密算法则只有一个密钥,加密和解密都使用同一个密钥。 对称加密算法中,比较安全且流行的就是 AES 算法,本文将会带你了解如何在 Java 中使用 AES 对数据进行加密和解密。 AES 介绍 AES(Advanced Encryption Standard)是一种对称加密算法,也被称为高级加密标准。它是一种广泛使用的加密算法,具有高度的安全性和效率,已被广泛应用于各种领域,包括网络通信、数据存储和加密协议等。AES 使用相同的密钥进行加密和解密操作,因此被归类为对称加密算法。 密钥 可以使用 Java 中的 javax.crypto.KeyGenerator API 来生成随机的 AES 密钥。 package cn.springdoc.demo.test; import java.security.SecureRandom; import java.util.Base64; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; public class Main { public static void main(String[] args) throws Exception { // 获取 AES 密钥生成器 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); // 设置密钥长度和随机源 keyGenerator.

Spring MVC 教程

1、概览 这是一个简单的 Spring MVC 教程,介绍如何通过基于 Java 的配置和 XML 配置来建立 Spring MVC 项目。 Spring MVC 依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework.version}</version> </dependency> 2、Spring MVC 是啥? 顾名思义,它是 Spring 框架中处理模型(Model)- 视图(View)- 控制器(Controller)或 MVC 模式的一个模块。它结合了 MVC 模式的所有优点和 Spring 的便利性。 Spring 使用其 DispatcherServlet 前控制器模式实现 MVC。 简而言之,DispatcherServlet 是将请求路由到预定目的地的主要控制器。Model 只是应用的数据,而视图则由各种模板引擎来表示。 3、使用 Java 配置的 Spring MVC 要通过 Java 配置类启用 Spring MVC 支持,只需添加 @EnableWebMvc 注解即可: @EnableWebMvc @Configuration public class WebConfig { /// ... } 这将设置 MVC 项目所需的基本支持,如注册处理器、映射器、类型转换器、验证支持、消息转换器和异常处理。

基于 XML 配置的 Spring AOP 教程

1、简介 本文将带你了解 Spring 中的 AOP(面向切面编程),并学习如何在实际场景中使用这一强大工具。 在使用 Spring AOP 开发时,还可以利用 @AspectJ 的注解,但本文重点介绍 Spring AOP 基于 XML 的核心配置。 2、概览 AOP 是一种编程范式,旨在通过分离横切关注点来提高模块化程度。它通过在不修改代码本身的情况下为现有代码添加额外的行为来实现这一目标。 Spring 的 AOP 框架 可以帮助我们实现这些切面关注点。 3、Maven 依赖 首先,在 pom.xml 中添加 Spring 的 AOP 依赖: <!-- Spring Boot 应用 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> </dependencies> <!-- Spring 应用 --> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>6.1.1</version> </dependency> </dependencies> 可以在 Maven 仓库中查询到最新的版本。 4、AOP 概念和术语 简要回顾一下 AOP 的特定概念和术语: 4.1、业务对象 业务对象是一个具有正常业务逻辑的普通类。 来看一个简单的业务对象示例,只需将两个数字相加: