Spring Boot 2.3.0 发布:聚焦云技术

  1. 云栖社区>
  2. 云栖号资讯>
  3. 博客>
  4. 正文

Spring Boot 2.3.0 发布:聚焦云技术

云栖号资讯小哥 2020-07-02 13:03:37 浏览661
展开阅读全文

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

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 builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
 
FROM adoptopenjdk:14-jre-hotspot
WORKDIR application
COPY --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 秒的时间来等待其完成。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-07-01
本文作者:Johan Janssen
本文来自:“InfoQ ”,了解相关信息可以关注“[InfoQ](https://www.infoq.cn/article/9ItDQCldNo49lDyxfI0E

网友评论

登录后评论
0/500
评论
云栖号资讯小哥
+ 关注
所属团队号: 云栖号资讯