本文将带你了解如何在 Spring Boot 应用中使用 WebSocket 构建一个在线的日志系统。通过该系统,不需要登录服务器,即可在 HTML 页面上通过 WebSocket 长连接预览到服务器的即时日志。
创建 Spring Boot 应用 添加 spring-boot-starter-websocket 依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> WebSocket 配置 创建 WebSocketConfiguration 配置类,配置 ServerEndpointExporter Bean,用于扫描系统中的 WebSocket 端点实现。
package cn.springdoc.demo.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfiguration { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } 创建日志端点 创建 LoggingChannel WebSocket 端点实现类,接受客户端连接,并且推送日志消息。
package cn.springdoc.demo.web.channel; import java.
1、概览 随着越来越多的企业转向使用容器,Docker 在软件开发中的地位也越来越重要。为此,Spring Boot 2.3 的一大新功能就是为 Spring Boot 应用轻松创建 Docker 镜像提供了支持。
本文将带你了解如何为 Spring Boot 应用创建 Docker 镜像。
2、传统的 Docker 构建 使用 Spring Boot 构建 Docker 镜像的传统方法是使用 Dockerfile。
下面是一个简单的 Dockerfile 示例:
FROM openjdk:8-jdk-alpine EXPOSE 8080 ARG JAR_FILE=target/demo-app-1.0.0.jar ADD ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] 然后,使用 docker build 命令创建 Docker 镜像。这对大多数应用都很有效,但也有一些缺点。
首先,我们使用的是 Spring Boot 创建的 Fat jar。这会影响启动时间,尤其是在容器化环境中。我们可以通过添加 Jar 文件的解压内容来节省启动时间。
其次,Docker 镜像是分层构建的。Spring Boot Fat Jar 的性质导致所有应用代码和第三方库都被放在一个层中。这意味着,即使只有一行代码发生变化,也必须重建整个层。
通过在构建之前解压 Jar 文件,应用代码和第三方库分别有自己的层。这使我们能够利用 Docker 的缓存机制,当更改一行代码时,只需要重新构建相应的层。
有了这个理念,让我们看看 Spring Boot 如何改进创建 Docker 镜像的过程。
1、概览 在 Spring 3.0 之前,XML 是定义和配置 Bean 的唯一方法。Spring 3.0 引入了 JavaConfig,允许我们使用 Java 类配置 Bean。不过,如今有些项目仍然在使用 XML 配置文件。
本文将带你了解如何在 Spring Boot 应用中整合 XML 配置。
2、@ImportResource 注解 @ImportResource 注解可以导入一个或多个包含 Bean 定义的资源。
比方说,我们有一个包含 Bean 定义的 beans.xml 文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean class="com.baeldung.springbootxml.Pojo"> <property name="field" value="sample-value"></property> </bean> </beans> 要在 Spring Boot 应用中使用它,可以使用 @ImportResource 注解,告诉它在哪里可以找到配置文件:
@Configuration @ImportResource("classpath:beans.xml") public class SpringBootXmlApplication implements CommandLineRunner { @Autowired private Pojo pojo; public static void main(String[] args) { SpringApplication.
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.
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 即可。
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 应用中配置优雅停机。
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
背景 众所周之,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.
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 的配置。
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 管理员用户凭证: