Spring-Boot

在 Spring Boot 中恢复 Flyway 失败的迁移

1、概览 Flyway 迁移并不总是一帆风顺行,本文将带你了解迁移失败后的恢复方案。 2、设置 从基本的 Spring Boot 配置 Flyway 开始。它依赖 flyway-core、spring-boot-starter-jdbc 和 flyway-maven-plugin。 对于如何在 Spring Boot 中使用 Flyway 进行数据库迁移,你可以参阅 这篇文章。 2.1、配置 首先,添加两个不同的 Profile(配置文件)。这能够轻松地针对不同的数据库引擎运行迁移: <profile> <id>h2</id> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> </dependencies> </profile> <profile> <id>postgre</id> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </dependency> </dependencies> </profile> 还要为每个 Profile 添加 Flyway 数据库配置文件。 首先,创建 application-h2.properties: flyway.url=jdbc:h2:file:./testdb;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;MODE=MySQL;DATABASE_TO_UPPER=false; flyway.user=testuser flyway.password=password 然后,创建 PostgreSQL application-postgre.properties: flyway.url=jdbc:postgresql://127.0.0.1:5431/testdb flyway.user=testuser flyway.password=password 注:你可以调整 PostgreSQL 配置,使其与你的数据库相匹配,也可以使用 代码示例中的 docker-compose 文件。 2.2、迁移 添加第一个迁移(migration)文件 V1_0__add_table.sql: create table table_one ( id numeric primary key ); 添加第二个包含错误的迁移文件 V1_1__add_table.

Spring Boot 中的健康指标(Health Indicators)

1、概览 Spring Boot 提供了几种不同的方法来检查运行中的应用及其组件的状态和健康状况。在这些方法中,HealthContributor 和 HealthIndicator API 是值得注意的两种。 本文将带你了解这些 API 的原理以及如何向它们提供自定义信息。 2、依赖 Health Information Contributor(健康信息贡献者)是 Spring Boot Actuator 模块的一部分: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 3、内置的 HealthIndicator Spring Boot 注册了许多开箱即用的 HealthIndicator 来报告应用特定方面的健康状况。 其中一些指标默认已经注册了,如 DiskSpaceHealthIndicator 或 PingHealthIndicator。前者报告磁盘的当前状态,后者则作为应用的 ping 端点。 Spring Boot 也会有条件地注册一些指标。也就是说,如果 classpath 上存在某些依赖或满足某些其他条件,Spring Boot 可能也会注册一些其他的 HealthIndicator。例如,如果使用了关系型数据库,那么 Spring Boot 就会注册 DataSourceHealthIndicator。同样,如果使用的是 Cassandra 作为数据存储,它会注册 CassandraHealthIndicator。 可以调用 /actuator/health 端点来检查 Spring Boot 应用的健康状态。该端点会报告所有已注册的 HealthIndicator 的汇总结果。 如果要查看某个特定指标的健康报告,可以调用 /actuator/health/{name} 端点。例如,调用 /actuator/health/diskSpace 端点将返回 DiskSpaceHealthIndicator 的状态报告: { "status": "UP", "details": { "total": 499963170816, "free": 134414831616, "threshold": 10485760, "exists": true } } 4、自定义 HealthIndicator 除了内置的 HealthIndicator,还可以注册自定义 HealthIndicator 来报告组件或子系统的健康状况。只需将 HealthIndicator 接口的实现注册为 Spring Bean 即可。

Spring Boot 中的 application.yml 和 application.properties

1、概览 Spring Boot 中的一个常见做法是使用外部配置来定义属性。这样,就可以在不同的环境中使用相同的应用程序代码。 外部配置可以使用 properties 文件、YAML 文件、环境变量和命令行参数。 本文将带你了解 properties 文件和 YAML 文件的主要区别。 2、Properties 配置 默认情况下,Spring Boot 可以访问在 application.properties 文件中设置的配置,该文件使用键值格式: spring.datasource.url=jdbc:h2:dev spring.datasource.username=SA spring.datasource.password=password 如上,每一行都是一个单独的配置,因此需要为 key 使用相同的前缀来表达分层数据。在本例中,每个 key 都属于 spring.datasource。 2.1、Properties 中的占位符 在值中,可以使用 ${} 语法的占位符来引用其他 key、系统属性或环境变量的内容: app.name=MyApp app.description=${app.name} is a Spring Boot application 2.2、列表 如果同类 properties 具有不同的值,可以用数组索引来表示列表结构: application.servers[0].ip=127.0.0.1 application.servers[0].path=/path1 application.servers[1].ip=127.0.0.2 application.servers[1].path=/path2 application.servers[2].ip=127.0.0.3 application.servers[2].path=/path3 2.3、多文档 自 2.4.0 版起,Spring Boot 支持创建多文档 properties 文件。简单地说,可以将单个物理文件拆分成多个逻辑文档。 这样,就可以在同一个 properties 文件中声明多个 Profile: logging.file.name=myapplication.log bael.property=defaultValue #--- spring.config.activate.on-profile=dev spring.datasource.password=password spring.datasource.url=jdbc:h2:dev spring.

Spring Boot 优雅停机

本文将带你了解如何在 Spring Boot 应用中配置优雅停机。 1、优雅停机 从 Spring Boot 2.3 开始,Spring Boot 所支持的四种嵌入式 Web 服务器(Tomcat、Jetty、Undertow 和 Netty)都支持在 Servlet 和响应式平台上的优雅关机功能。 只需在 application.properties 文件中将 server.shutdown 属性设置为 graceful,即可启用优雅停机: server.shutdown=graceful 在优雅停机阶段,Tomcat、Netty 和 Jetty 会停止接受新的 Web 请求。而 Undertow 会继续接受,但会立即向客户端发送 503 Service Unavailable 响应。 默认情况下,该属性的值等于 immediate,这意味着服务器会立即关闭。 在优雅关机时,可能有一些之前的请求仍在处理中。在这种情况下,服务器会等待这些活动请求在指定时间内完成。 可以使用 spring.lifecycle.timeout-per-shutdown-phase 配置属性来配置超时时间: spring.lifecycle.timeout-per-shutdown-phase=1m 如上,在优雅停机时,对于那些仍在处理的请求,服务器等待最多一分钟。该属性的默认值为 30 秒。 2、总结 本文介绍了如何在 Spring Boot 中配置优雅停机,以及如何配置服务器停机超时时间。 Ref:https://www.baeldung.com/spring-boot-web-server-shutdown

使用 Arthas 在 Spring 运行时获取配置值和配置来源

背景 众所周之,Spring / Spring Boot 应用的配置注入方式非常多: System Properties / System Env application.properties / application.yaml Spring Profile Spring Cloud Config 还有很多配置注入的方式你可以参阅 中文文档,可谓是令人眼花缭乱。 获取运行时具体配置 对于开发人员来说,在运行时怎样确定某个配置是否生效?它的具体值是什么? 通过 Arthas,只要一行命令就可以获取到。 例如,获取 server.port 的具体值: vmtool --action getInstances --className org.springframework.context.ConfigurableApplicationContext --express 'instances[0].getEnvironment().getProperty("server.port")'@String[7001] 获取具体的配置来源 但是这个配置是从哪里来的? 对于 spring boot 应用,可以打开一个新的 terminal 窗口,执行 telnet 127.0.0.1 3658 连接上Arthas。 直接 watch 下面的函数。 在原来窗口用上面的 vmtool 命令来获取 server.port 的值。 从 watch 返回结果中可以看到,server.port 值来源于 application.yml: watch org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource findConfigurationPropertyPress Q or Ctrl+C to abort.Affect(class count: 1 , method count: 2) cost in 217 ms, listenerId: 5method=org.

在 Spring Boot 中嵌入 Keycloak 服务器

1、概览 Keycloak 是由 Red Hat 管理和在 Java 中由 JBoss 开发的开源身份和访问管理解决方案。 本文将带你了解如何在 在 Spring Boot 中嵌入 Keycloak 服务器,这样就能轻松启动预配置的 Keycloak 服务器。 Keycloak 也可以作为 独立服务器 运行,但需要下载并通过管理控制台进行设置。 2、Keycloak 预配置 服务器包含一组 Realm,每个 Realm 都是用户管理的独立单元。要对其进行预配置,我们需要指定一个 JSON 格式的 Realm 定义文件。 使用 Keycloak Admin 控制台 配置的所有内容都以 JSON 格式进行持久化。 我们的授权服务器将使用名为 baeldung-realm.json 的 JSON 文件进行预配置。文件中的几个相关配置如下: users:默认用户是 john@test.com 和 mike@other.com;对应的凭证也在这里。 clients:定义一个 ID 为 newClient 的客户端 standardFlowEnabled:设置为 true,激活 newClient 的授权码(Authorization Code)授权模式。 redirectUris:newClient 在成功验证后将重定向到的服务器 URL webOrigins:置为 +,为所有 redirectUris 的 URL 提供 CORS 支持 Keycloak 服务器会默认签发 JWT Token,因此无需为此进行单独配置。接下来看看 Maven 的配置。

Spring Boot 整合 Keycloak

1、概览 本文将带你了解如何设置 Keycloak 服务器,以及如何使用 Spring Security OAuth2.0 将 Spring Boot 应用连接到 Keycloak 服务器。 2、Keycloak 是什么? Keycloak 是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单点登录(SSO)、身份代理和社交登录、用户联盟、客户端适配器、管理控制台和账户管理等功能。 本文使用 Keycloak 的管理控制台,使用 Spring Security OAuth2.0 设置和连接 Spring Boot。 3、设置 Keycloak 服务器 设置和配置 Keycloak 服务器。 3.1、下载和安装 Keycloak 有多种发行版可供选择,本文使 Keycloak-22.0.3 独立服务器发行版。点击 这里 从官方下载。 下载完后,解压缩并从终端启动 Keycloak: unzip keycloak-22.0.3.zip cd keycloak-22.0.3 bin/kc.sh start-dev 运行这些命令后,Keycloak 会启动服务。如果你看到一行类似于 Keycloak 22.0.3 [...] started 的内容,就表示服务器启动成功。 打开浏览器,访问 http://localhost:8080,会被重定向到 http://localhost:8080/auth 以创建管理员进行登录: 创建一个名为 initial1 的初始管理员用户,密码为 zaq1!QAZ。点击 “Create”后,可以看到 “User Created” 的提示信息。 现在进入管理控制台。在登录页面,输入 initial 管理员用户凭证:

Spring Boot 整合 QueryDSL 及常见用法

QueryDSL 是一个用于构建类型安全查询的开源 Java ORM 框架。它提供了一种 Fluent 风格的 API 来构建和执行数据库查询,并提供了编译时类型检查,以避免常见的查询错误。QueryDSL 支持多种数据库,包括关系型数据库和 NoSQL 数据库,可以与多个持久化框架(如 JPA、Hibernate 等)整合使用。它简化了查询的编写过程,使得查询代码更易于理解、维护和重用。 QueryDSL 在 Spring Boot 中通常配合 Spring Data JPA 使用,它会根据定义的 JPA Entity 类自动生成对应的查询类。通过查询类,除了可以快速地进行基本的 CRUD 操作外还支持 JOIN、GROUP、子查询等复杂的检索。而这一切都无需编写任何 SQL 语句,代码即 SQL。 本文将会带你了解如何在 Spring Boot 中整合 QueryDSL + Spring Data JPA,以及 QueryDSL 的常见用法。 示例项目 本文使用到的软件版本: Java:21 Spring Boot:3.2.0 MySQL:8.0.26 添加依赖 创建 Spring Boot 应用,完整的 pom.xml 如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath /> <!

Spring Boot 创建非 Web 应用

1、简介 Spring Boot 是一个出色、流行的框架,可以快速创建适用于各种用例的 Java 应用。其中最常见用法之一是使用嵌入式 Servlet 容器来作为 Web 服务器。 Spring Boot 也可以用于许多不需要 Web 服务器的应用,如:命令行应用、作业调度、批处理或流处理应用等。 本文将带你了解在没有 Web 服务器的情况下使用 Spring Boot 的几种不同方式。 2、依赖 防止 Spring Boot 应用启动嵌入式 Web 服务器的最简单方法就是不在依赖中包含 Web Server Starter。 这意味着在 Maven POM 或 Gradle build 文件中都不会包含 spring-boot-starter-web 依赖。相反,使用更基本的 spring-boot-starter 依赖来替代它。 注意,Tomcat 依赖有可能作为传递依赖包含在应用中。在这种情况下,可能需要将 Tomcat 从包含它的依赖中排除。 3、修改 Spring Application 另一种禁用 Spring Boot 内嵌 Web 服务器的方法是使用代码。 使用 SpringApplicationBuilder: new SpringApplicationBuilder(MainApplication.class) .web(WebApplicationType.NONE) .run(args); 或者,可以使用 SpringApplication: SpringApplication application = new SpringApplication(MainApplication.class); application.setWebApplicationType(WebApplicationType.NONE); application.run(args); 无论哪种方式,都可以在 classpath 上保留可用的 Servlet 和容器 API。这意味着仍然可以在不启动 Web 服务器的情况下使用 Web 服务器库。例如,使用它们来编写测试或在自己的代码中使用它们的 API,这就非常有用。

Spring Boot 中的 CharacterEncodingFilter

1、概览 本文将会带你了解 Spring Boot 中 CharacterEncodingFilter 的作用及其用法。 2、CharacterEncodingFilter CharacterEncodingFilter 是一个 Servlet Filter,可帮助我们为请求(Request)和响应(Response)指定字符编码。当浏览器未设置字符编码或我们希望对请求和响应进行特定处理时,该过滤器就非常有用。 3、实现 来看看如何在 Spring Boot 应用中配置该过 Filter。 首先,创建 CharacterEncodingFilter: CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); 在本例中,将编码设置为了 UTF-8,你也可以根据需要设置其他编码。 这里还使用了 forceEncoding 属性,无论浏览器请求中是否存在编码,都强制执行指定的编码。由于该标志设置为 true,提供的编码也将应用于响应的编码。 最后,使用 FilterRegistrationBean 注册 Filter,它提供了配置来将 Filter 实例注册为过滤器链(Filter Chain)的一部分: FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(filter); registrationBean.addUrlPatterns("/*"); return registrationBean; 在非 Spring Boot 的应用中,可以在 web.xml 文件中添加该 Filter,以获得相同的效果。 4、总结 本文介绍了 Spring 中 CharacterEncodingFilter 的作用以及配置方法。 Ref:https://www.baeldung.com/spring-boot-characterencodingfilter