Spring Boot 2.3.0发布:聚焦云技术

2020 年 7 月 01 日

Spring Boot 2.3.0发布:聚焦云技术

Spring Boot发布了2.3.0版本,添加了对 buildpacks 方式的 Docker、分层镜像、优雅关机、存活性(liveness)和就绪性(readiness)探针的支持。另外一个值得关注的变化就是它支持 Java 14,同时保持了对 Java LTS 版本 8 和 11 的支持。


Buildpacks是 Dockerfiles 的一个替代方案。Buildpacks 能够自动探测运行 Docker 容器中的应用时所需要的软件。例如,它会探测应用中所使用的 Java 版本。基于该版本,buildpack 会选择所指定的 JRE 并构建 Docker 镜像。借助 Maven 或 Gradle,可以通过如下的命令创建 Docker 镜像:


spring-boot:build-image
复制代码


注意,创建基于 buildpacks 的 Docker 镜像不需要任何配置。


通过使用bootBuildImage task,我们可以修改 buildpack 的一些配置。例如,构建文件中如下的 Spring Boot Maven Plugin 配置展示了如何修改 Docker 镜像的名称:


<configuration>    <image>        <name>infoq.com/${project.artifactId}:${project.version}</name>    </image></configuration>
复制代码


我们还可以通过命令行来指定 Docker 镜像的名称:


mvn/gradle bootBuildImage --imageName=infoq.com/my-app:v1
复制代码


Docker 镜像是以分层的形式运行的。添加应用程序制件(artifact)作为最新的层有助于减少镜像所占用的磁盘大小。开发人员经常将应用程序制件保存为 JAR 文件。JAR 文件的缺点在于它包含了经常发生变化的元素,比如代码。但是,JAR 文件还也包含了不经常发生变化的元素,比如依赖项。Docker 镜像版本的变更是以 diffs 的形式进行存储的。当应用程序的每个版本以 JAR 文件的方式来进行存储的时候,diff 就会非常大,因此会消费很多的磁盘空间。Buildpacks 基于变化更频繁的元素,将应用切分为多个分层从减少了空间的占用。


将制件切分为多个分层的功能也能用在Dockerfile中。Buildpacks 提供了某种形式的配置,但是 Dockerfiles 能够对最终形成的镜像提供完全的控制。因此,开发人员有时更喜欢 Dockerfile,而不是 buildpack。当选择使用 Dockerfile 的时候,建议将制件切分为多个层。相对于 buildpack,这需要更多一点的工作,但这是个一次性的任务。


首先,配置 spring-boot-maven-plugin 生成分层的 JAR:


<build>    <plugins>        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>            <configuration>                <layers>                    <enabled>true</enabled>                </layers>            </configuration>        </plugin>    </plugins></build>
复制代码


这个插件配置会确保应用会分为四部分:依赖项、spring-boot-loader、快照依赖(snapshot-dependencies)和应用程序。


如下的程序片段展示了一个多阶段的 Dockerfile。在第一步中,应用是按照特定的 jarmode 参数运行的。这会让四个组成部分各自存放到自己的目录中。在下一个阶段,这四个目录会复制到 Docker 镜像独立的分层中,随后指定了入口点。


FROM adoptopenjdk:14-jre-hotspot as builderWORKDIR applicationARG JAR_FILE=target/*.jarCOPY ${JAR_FILE} application.jarRUN java -Djarmode=layertools -jar application.jar extract FROM adoptopenjdk:14-jre-hotspotWORKDIR applicationCOPY --from=builder application/dependencies/ ./COPY --from=builder application/spring-boot-loader/ ./COPY --from=builder application/snapshot-dependencies/ ./COPY --from=builder application/application/ ./ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
复制代码


开发人员可以使用 Dockerfile 构建 Docker 镜像,随后就能够基于镜像运行一个容器了:


docker build . --tag infoqdocker run -p8080:8080 infoq
复制代码


像 Kubernetes 这样的容器系统会用到存活性和就绪性探针。Kubernetes 在为应用生成新版本的时候,会启动一个新的 pod。这个新 pod 在启动时,会和运行旧版本应用程序的旧 pod 同时存在。当新 pod 就绪的时候,它会接收流量,旧的 pod 会被移除掉。但是,当容器就绪的时候,应用通常并没有完全启动起来。这是因为 Spring Boot 会耗费几秒钟的时间。默认情况下,这意味着旧版本的应用在关闭的时候,尚未完全启动的应用已经在接收流量了。


这可以通过轮询应用内特定的 URL 来解决,该 URL 在应用程序启动后才可用。只要 URL 可用,应用就准备好接收流量了,旧版本则可以删除了。在 Kubernetes 中,这可以通过所谓的 ReadinessProbe 来实现。


Spring Boot 现在提供了就绪性探针的默认支持。例如,在应用程序的配置中,启用该功能后,就可以通过 http://localhost:8080/actuator/health/readiness 端点使用该探针了,启用方式是如下的配置:management.health.probes.enabled=true。


除了 ReadinessProbe 之外,Kubernetes 还有一个存活性的概念。它会按照预先定义的间隔验证应用程序的功能是否正常。如果应用没有响应的话,pod 将会重启。Spring Boot 也为此提供了一个端点:http://localhost:8080/actuator/health/liveness。


这些不同的端点是内置支持的,但是可以对它们进行配置,比如等待数据库启动完成。


优雅关机用来在停止应用之后,系统会为正在进行中的请求维持一定的时间。


如下的代码片段展示了如何启用优雅关机并将超时时间设置为 30 秒:


server.shutdown=gracefulspring.lifecycle.timeout-per-shutdown-phase=30s
复制代码


这意味在停止应用后,不允许接收新的请求。但是,在应用彻底停止之前,旧的请求依然还有 30 秒的时间来等待其完成。


原文链接:Spring Boot 2.3.0 Focuses on the Cloud


2020 年 7 月 01 日 17:482949

评论

发布
暂无评论
发现更多内容

大数据管理:构建数据自己的“独门独院”

华为云开发者社区

大数据 数据湖

为什么企业自主开发软件时,都会使用统一的模块化框架式开发平台?

Learun

敏捷开发 程序设计 开发工具 软件设计 技术方案

浅析LR.Net工作流引擎

Philips

敏捷开发 工作流 软件开发流程 开发工具

有的时候,到达目的地,还不如在旅途中。

空山

心理学 哲学 活在当下

北京城市副中心将试点法定数字货币

CECBC区块链专委会

数字货币 货币

产业互联网成区块链与数字货币的分水岭

CECBC区块链专委会

区块链 数字货币 产业互联网

3. 站在使用层面,Bean Validation这些标准接口你需要烂熟于胸

YourBatman

Hibernate-Validator Bean Validation 数据校验

实战解读丨Linux下实现高并发socket最大连接数的配置方法

华为云开发者社区

Linux TCP socket 高并发

【基础架构】不同场景下的数据存储技术,你用对了吗?

嘉为蓝鲸

网络 存储 系统 raid 磁盘挂载

鼓舞人心!主席支持数字经济!央行数字货币研究所为世界制定区块链相关国际标准

CECBC区块链专委会

区块链 金融

用 Python 实现一个简易版的 Pong 游戏 (一)

Matrix Chan

Python Turtle Python游戏

Docker私有化部署gitlab gitlab-runner

InfoQ_e3332743a02f

gitlab 持续集成 runner

内存型数据库Redis,是如何实现持久化的?

Zhongger

redis

DB-Engines 9月数据库排名:ClickHouse一路猛冲,Redis坐稳第七

华章IT

MySQL 数据库 redis Clickhouse

或许是史上最好的AQS源码分析了,你确定要错过?!

InfoQ_d2212957090d

深入Spring Security魔幻山谷-获取认证机制核心原理讲解

朱季谦

spring security

你问我答:容器平台改造后的安全是如何解决的?

博云技术社区

云计算 容器 微服务 PaaS 博云

又踩Maven的两个坑

xiaoboey

maven Unknown lifecycle phase settings.xml 无效 PowerShell

usdt支付系统开发|承兑商支付跑分系统搭建

WX13823153201

usdt支付系统开发

深兰科技的征途,AI的赛场与战场

脑极体

LeetCode题解:225. 用队列实现栈,两个队列, 压入 - O(n), 弹出 - O(1),JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

数字货币交易所开发方案|去中心化交易所搭建

WX13823153201

数字货币交易所开发

云图说 | 一分钟带你扫盲云容器黑话

华为云开发者社区

容器 节点 集群

一个银行客户经理的“变形记”

华为云开发者社区

人工智能 金融科技

区块链交易所搭建技术方案|去中心化交易所开发

WX13823153201

区块链交易所搭建

Redis 数据同步机制--主从模式

是老郭啊

redis 主从配置 主从同步 redis主从 主从复制

使用amoeba实现mysql读写分离

小Q

Java MySQL 编程 程序员

XSKY全新一代SDS一体机五大场景之存储+灾备

XSKY融合存储

CPU中的程序是怎么运行起来的

良知犹存

cpu

[翻译] Go Concurrency Patterns: Pipelines and cancellation[Go并发模式]

卓丁

channel pipeline

快来看看!AQS 和 CountDownLatch 有怎么样的关系?

程序员小航

Java AQS 源码阅读 CountDownLatch JUC

Spring Boot 2.3.0发布:聚焦云技术-InfoQ