Spring Boot 2.3.0发布:聚焦云技术

标签: spring boot 聚焦 | 发表时间:2020-07-01 17:48 | 作者:Johan Janssen
出处:https://www.infoq.cn

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镜像的名称:

  
    
        infoq.com/${project.artifactId}:${project.version}
    

我们还可以通过命令行来指定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:

  
    
        
            org.springframework.boot
            spring-boot-maven-plugin
            
                
                    true
                
            
        
    

这个插件配置会确保应用会分为四部分:依赖项、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秒的时间来等待其完成。

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

相关 [spring boot 聚焦] 推荐:

Spring Boot 2.3.0发布:聚焦云技术

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

Spring boot传统部署

- - 企业架构 - ITeye博客
使用spring boot很方便,一个jar包就可以启动了,因为它里面内嵌了tomcat等服务器. 但是spring boot也提供了部署到独立服务器的方法. 如果你看文档的话,从jar转换为war包很简单,pom.xml的配置修改略去不讲. 只看source的修改,很简单,只要一个配置类,继承自SpringBootServletInitializer, 并覆盖configure方法.

值得使用的Spring Boot

- - ImportNew
2013年12月12日,Spring发布了4.0版本. 这个本来只是作为Java平台上的控制反转容器的库,经过将近10年的发展已经成为了一个巨无霸产品. 不过其依靠良好的分层设计,每个功能模块都能保持较好的独立性,是Java平台不可多得的好用的开源应用程序框架. Spring的4.0版本可以说是一个重大的更新,其全面支持Java8,并且对Groovy语言也有良好的支持.

Spring Boot配置多个DataSource

- - 廖雪峰的官方网站
使用Spring Boot时,默认情况下,配置 DataSource非常容易. Spring Boot会自动为我们配置好一个 DataSource. 如果在 application.yml中指定了 spring.datasource的相关配置,Spring Boot就会使用该配置创建一个 DataSource.

Spring boot executable jar/war 原理

- - ImportNew
spring boot里其实不仅可以直接以 Java -jar demo.jar的方式启动,还可以把jar/war变为一个可以执行的脚本来启动,比如./demo.jar. 把这个executable jar/war 链接到/etc/init.d下面,还可以变为Linux下的一个service. 只要在spring boot maven plugin里配置:.

Spring Boot Starter是什么?

- - 技术,永无止境
在工作中我们经常能看到各种各样的springboot starter,如spring-cloud-netflix、spring-cloud-alibaba等等. 这些starter究竟有什么作用呢. 在了解这些starter之前,我们需要先大概知道Spring MVC与Spring Boot的关系.

spring boot与spring batch、postgres及elasticsearch整合

- - 互联网 - ITeye博客
当系统有大量数据需要从数据库导入elasticsearch时,使用sping batch可以提高导入的效率. 这篇文章使用spring batch将数据从postgres导入elasticsearch. 本文使用spring data jest连接ES(也可以使用spring data elasticsearch连接ES),ES版本为5.5.3.

Spring Boot使用redis做数据缓存

- - ITeye博客
SysUser.class)); //请注意这里. 3 redis服务器配置. /** *此处的dao操作使用的是spring data jpa,使用@Cacheable可以在任意方法上,*比如@Service或者@Controller的方法上 */ public interface SysUserRepo1 extends CustomRepository {.

spring boot应用启动原理分析

- - ImportNew
在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server. 如果之前没有使用过spring boot可以通过下面的demo来感受下. 下面以这个工程为例,演示如何启动Spring boot项目:.

Apache Shiro和Spring boot的结合使用

- - 企业架构 - ITeye博客
实际上在Spring boot里用Spring Security最合适,毕竟是自家东西,最重要的一点是Spring Security里自带有csrf filter,防止csrf攻击,shiro里就没有. 但是Spring Security有点太复杂,custmize起来比较费力,不如shiro来的简单.