Spring Boot 的可执行 jar 是现成的,适用于大多数流行的云 PaaS(平台即服务)提供商。 这些提供商往往要求您“自带容器”。 他们管理应用程序进程(而不是专门管理 Java 应用程序),因此他们需要一个中间层来使您的应用程序适应的运行进程概念。Spring中文文档

两家流行的云提供商 Heroku 和 Cloud Foundry 采用“buildpack”方法。 buildpack 将已部署的代码包装在启动应用程序所需的任何内容中。 它可能是 JDK 和对 的调用,嵌入式 Web 服务器或成熟的应用程序服务器。 构建包是可插拔的,但理想情况下,您应该能够尽可能少地对其进行自定义。 这样可以减少不受您控制的功能的占用空间。 它最大限度地减少了开发环境和生产环境之间的差异。javaSpring中文文档

理想情况下,您的应用程序(如 Spring Boot 可执行 jar)将运行所需的所有内容打包在其中。Spring中文文档

在本节中,我们将了解如何在“入门”部分中启动并运行我们在“入门”部分中开发的应用程序Spring中文文档

云代工

Cloud Foundry 提供默认的 buildpack,如果未指定其他 buildpack,这些 buildpack 就会发挥作用。 Cloud Foundry Java buildpack 对 Spring 应用程序(包括 Spring Boot)提供了出色的支持。 您可以部署独立的可执行 jar 应用程序以及传统的打包应用程序。.warSpring中文文档

构建应用程序(例如,通过使用 )并安装 cf 命令行工具后,使用命令部署应用程序,将路径替换为 已编译的 . 在推送应用程序之前,请确保已使用 cf 命令行客户端登录。 以下行演示了如何使用命令部署应用程序:mvn clean packagecf push.jarcf pushSpring中文文档

$ cf push acloudyspringtime -p target/demo-0.0.1-SNAPSHOT.jar
在前面的示例中,我们将替换您作为应用程序名称的任何值。acloudyspringtimecf

有关更多选项,请参阅 cf push 文档。 如果同一目录中存在 Cloud Foundry manifest.yml 文件,则将其视为 Cloud Foundry 文件。Spring中文文档

此时,开始上传应用程序,生成类似于以下示例的输出:cfSpring中文文档

Uploading acloudyspringtime... OK
Preparing to start acloudyspringtime... OK
-----> Downloaded app package (8.9M)
-----> Java Buildpack Version: v3.12 (offline) | https://github.com/cloudfoundry/java-buildpack.git#6f25b7e
-----> Downloading Open Jdk JRE
       Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.6s)
-----> Downloading Open JDK Like Memory Calculator 2.0.2_RELEASE from https://java-buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz (found in cache)
       Memory Settings: -Xss349K -Xmx681574K -XX:MaxMetaspaceSize=104857K -Xms681574K -XX:MetaspaceSize=104857K
-----> Downloading Container Certificate Trust Store 1.0.0_RELEASE from https://java-buildpack.cloudfoundry.org/container-certificate-trust-store/container-certificate-trust-store-1.0.0_RELEASE.jar (found in cache)
       Adding certificates to .java-buildpack/container_certificate_trust_store/truststore.jks (0.6s)
-----> Downloading Spring Auto Reconfiguration 1.10.0_RELEASE from https://java-buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-1.10.0_RELEASE.jar (found in cache)
Checking status of app 'acloudyspringtime'...
  0 of 1 instances running (1 starting)
  ...
  0 of 1 instances running (1 starting)
  ...
  0 of 1 instances running (1 starting)
  ...
  1 of 1 instances running (1 running)

App started

祝贺!该应用程序现已上线!Spring中文文档

应用程序处于活动状态后,可以使用命令验证已部署应用程序的状态,如以下示例所示:cf appsSpring中文文档

$ cf apps
Getting applications in ...
OK

name                 requested state   instances   memory   disk   urls
...
acloudyspringtime    started           1/1         512M     1G     acloudyspringtime.cfapps.io
...

一旦 Cloud Foundry 确认您的应用程序已部署,您应该能够在给定的 URI 中找到该应用程序。 在前面的示例中,您可以在 中找到它。https://acloudyspringtime.cfapps.io/Spring中文文档

绑定服务

默认情况下,有关正在运行的应用程序的元数据以及服务连接信息将作为环境变量(例如:)公开给应用程序。 这个架构决定是由于Cloud Foundry的多语言(任何语言和平台都可以作为构建包支持)的性质。 进程范围的环境变量与语言无关。$VCAP_SERVICESSpring中文文档

环境变量并不总是最简单的 API,因此 Spring Boot 会自动提取它们并将数据平展为可以通过 Spring 的抽象访问的属性,如以下示例所示:EnvironmentSpring中文文档

import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class MyBean implements EnvironmentAware {

	private String instanceId;

	@Override
	public void setEnvironment(Environment environment) {
		this.instanceId = environment.getProperty("vcap.application.instance_id");
	}

	// ...

}
import org.springframework.context.EnvironmentAware
import org.springframework.core.env.Environment
import org.springframework.stereotype.Component

@Component
class MyBean : EnvironmentAware {

	private var instanceId: String? = null

	override fun setEnvironment(environment: Environment) {
		instanceId = environment.getProperty("vcap.application.instance_id")
	}

	// ...

}

所有 Cloud Foundry 属性都以 . 可以使用属性访问应用程序信息(如应用程序的公用 URL)和服务信息(如数据库凭据)。 有关完整的详细信息,请参阅 CloudFoundryVcapEnvironmentPostProcessor Javadoc。vcapvcapSpring中文文档

Java CFEnv 项目更适合配置 DataSource 等任务。
在前面的示例中,我们将替换您作为应用程序名称的任何值。acloudyspringtimecf
Java CFEnv 项目更适合配置 DataSource 等任务。

Kubernetes

Spring Boot 通过检查环境中的变量来自动检测 Kubernetes 部署环境。 可以使用 configuration 属性替代此检测。"*_SERVICE_HOST""*_SERVICE_PORT"spring.main.cloud-platformSpring中文文档

Kubernetes 容器生命周期

当 Kubernetes 删除应用程序实例时,关闭过程会同时涉及多个子系统:关闭钩子、取消注册服务、从负载均衡器中删除实例...... 由于此关机处理是并行进行的(并且由于分布式系统的性质),因此有一个窗口,在此期间可以将流量路由到也已开始关机处理的 Pod。Spring中文文档

您可以在 preStop 处理程序中配置睡眠执行,以避免将请求路由到已经开始关闭的 Pod。 此睡眠时间应足够长,以便新请求停止路由到 Pod,其持续时间因部署而异。 preStop 处理程序可以通过使用 Pod 配置文件中的 PodSpec 进行配置,如下所示:Spring中文文档

spec:
  containers:
  - name: "example-container"
    image: "example-image"
    lifecycle:
      preStop:
        exec:
          command: ["sh", "-c", "sleep 10"]

一旦预停止钩子完成,SIGTERM 将被发送到容器并开始正常关闭,允许完成任何剩余的飞行中请求。Spring中文文档

当 Kubernetes 向 Pod 发送 SIGTERM 信号时,它会等待一个指定的时间,称为终止宽限期(默认为 30 秒)。 如果容器在宽限期后仍在运行,则会向它们发送 SIGKILL 信号并强制删除。 如果容器关闭时间超过 30 秒,这可能是因为您增加了 ,请确保通过在容器 YAML 中设置选项来增加终止宽限期。spring.lifecycle.timeout-per-shutdown-phaseterminationGracePeriodSeconds
当 Kubernetes 向 Pod 发送 SIGTERM 信号时,它会等待一个指定的时间,称为终止宽限期(默认为 30 秒)。 如果容器在宽限期后仍在运行,则会向它们发送 SIGKILL 信号并强制删除。 如果容器关闭时间超过 30 秒,这可能是因为您增加了 ,请确保通过在容器 YAML 中设置选项来增加终止宽限期。spring.lifecycle.timeout-per-shutdown-phaseterminationGracePeriodSeconds

赫鲁库

Heroku 是另一个流行的 PaaS 平台。 要自定义 Heroku 版本,请提供 ,它提供了部署应用程序所需的咒语。 Heroku 为 Java 应用程序分配一个要使用,然后确保路由到外部 URI 正常工作。ProcfileportSpring中文文档

您必须将应用程序配置为侦听正确的端口。 以下示例显示了入门 REST 应用程序:ProcfileSpring中文文档

web: java -Dserver.port=$PORT -jar target/demo-0.0.1-SNAPSHOT.jar

Spring Boot 使参数可作为可从 Spring 实例访问的属性使用。 配置属性将馈送到嵌入的 Tomcat、Jetty 或 Undertow 实例,然后该实例在启动时使用该端口。 环境变量由 Heroku PaaS 分配给我们。-DEnvironmentserver.port$PORTSpring中文文档

这应该是你需要的一切。 Heroku 部署最常见的部署工作流是将代码转换为生产环境,如以下示例所示:git pushSpring中文文档

$ git push heroku main

这将导致以下结果:Spring中文文档

Initializing repository, done.
Counting objects: 95, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (78/78), done.
Writing objects: 100% (95/95), 8.66 MiB | 606.00 KiB/s, done.
Total 95 (delta 31), reused 0 (delta 0)

-----> Java app detected
-----> Installing OpenJDK... done
-----> Installing Maven... done
-----> Installing settings.xml... done
-----> Executing: mvn -B -DskipTests=true clean install

       [INFO] Scanning for projects...
       Downloading: https://repo.spring.io/...
       Downloaded: https://repo.spring.io/... (818 B at 1.8 KB/sec)
		....
       Downloaded: https://s3pository.heroku.com/jvm/... (152 KB at 595.3 KB/sec)
       [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/target/...
       [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/pom.xml ...
       [INFO] ------------------------------------------------------------------------
       [INFO] BUILD SUCCESS
       [INFO] ------------------------------------------------------------------------
       [INFO] Total time: 59.358s
       [INFO] Finished at: Fri Mar 07 07:28:25 UTC 2014
       [INFO] Final Memory: 20M/493M
       [INFO] ------------------------------------------------------------------------

-----> Discovering process types
       Procfile declares types -> web

-----> Compressing... done, 70.4MB
-----> Launching... done, v6
       https://agile-sierra-1405.herokuapp.com/ deployed to Heroku

To [email protected]:agile-sierra-1405.git
 * [new branch]      main -> main

您的应用程序现在应该在 Heroku 上启动并运行。 有关详细信息,请参阅将 Spring Boot 应用程序部署到 HerokuSpring中文文档

亚马逊网络服务 (AWS)

Amazon Web Services 提供了多种安装基于 Spring Boot 的应用程序的方法,既可以作为传统的 Web 应用程序 (war) 安装,也可以作为带有嵌入式 Web 服务器的可执行 jar 文件。 选项包括:Spring中文文档

每个都有不同的功能和定价模式。 在本文档中,我们将介绍使用 AWS Elastic Beanstalk 的方法。Spring中文文档

AWS Elastic Beanstalk

如官方 Elastic Beanstalk Java 指南中所述,部署 Java 应用程序有两个主要选项。 您可以使用“Tomcat 平台”或“Java SE 平台”。Spring中文文档

使用 Tomcat 平台

此选项适用于生成 war 文件的 Spring Boot 项目。 无需特殊配置。 您只需要遵循官方指南即可。Spring中文文档

使用 Java SE 平台

此选项适用于生成 jar 文件并运行嵌入式 Web 容器的 Spring Boot 项目。 Elastic Beanstalk 环境在端口 80 上运行 nginx 实例,以代理在端口 5000 上运行的实际应用程序。 若要配置它,请将以下行添加到您的文件中:application.propertiesSpring中文文档

server.port=5000
server:
  port: 5000
上传二进制文件而不是源

默认情况下,Elastic Beanstalk 上传源并在 AWS 中编译它们。 但是,最好改为上传二进制文件。 为此,请将类似于以下内容的行添加到您的文件中:.elasticbeanstalk/config.ymlSpring中文文档

deploy:
	artifact: target/demo-0.0.1-SNAPSHOT.jar
通过设置环境类型来降低成本

默认情况下,Elastic Beanstalk 环境是负载均衡的。 负载均衡器的成本很高。 为避免该成本,请将环境类型设置为“单个实例”,如 Amazon 文档中所述。 您还可以使用 CLI 和以下命令创建单实例环境:Spring中文文档

eb create -s

总结

这是访问 AWS 的最简单方法之一,但还有更多内容需要介绍,例如如何将 Elastic Beanstalk 集成到任何 CI/CD 工具中,使用 Elastic Beanstalk Maven 插件而不是 CLI 等。 有一篇博客文章更详细地介绍了这些主题。Spring中文文档

上传二进制文件而不是源

默认情况下,Elastic Beanstalk 上传源并在 AWS 中编译它们。 但是,最好改为上传二进制文件。 为此,请将类似于以下内容的行添加到您的文件中:.elasticbeanstalk/config.ymlSpring中文文档

deploy:
	artifact: target/demo-0.0.1-SNAPSHOT.jar
通过设置环境类型来降低成本

默认情况下,Elastic Beanstalk 环境是负载均衡的。 负载均衡器的成本很高。 为避免该成本,请将环境类型设置为“单个实例”,如 Amazon 文档中所述。 您还可以使用 CLI 和以下命令创建单实例环境:Spring中文文档

eb create -s

CloudCaptain 和 Amazon Web Services

CloudCaptain 的工作原理是将您的 Spring Boot 可执行 jar 或 war 转换为最小的 VM 映像,该映像可以在 VirtualBox 或 AWS 上原封不动地部署。 CloudCaptain 与 Spring Boot 进行了深度集成,并使用 Spring Boot 配置文件中的信息来自动配置端口和运行状况检查 URL。 CloudCaptain 将此信息用于其生成的映像以及其预置的所有资源(实例、安全组、弹性负载均衡器等)。Spring中文文档

创建 CloudCaptain 账户、将其连接到您的 AWS 账户、安装最新版本的 CloudCaptain 客户端并确保应用程序已由 Maven 或 Gradle 构建(例如,通过使用 ),您可以使用类似于以下内容的命令将 Spring Boot 应用程序部署到 AWS:mvn clean packageSpring中文文档

$ boxfuse run myapp-1.0.jar -env=prod

有关更多选项,请参阅 boxfuse 运行文档。 如果当前目录中存在 boxfuse.conf 文件,则将其视为 boxfuse.conf 文件。Spring中文文档

默认情况下,CloudCaptain 会在启动时激活名为 Spring 配置文件。 如果您的可执行 jar 或 war 包含 application-boxfuse.properties 文件,则 CloudCaptain 会根据其包含的属性进行配置。boxfuse

此时,CloudCaptain 会为您的应用程序创建映像,上传该映像,并在 AWS 上配置和启动必要的资源,从而生成类似于以下示例的输出:Spring中文文档

Fusing Image for myapp-1.0.jar ...
Image fused in 00:06.838s (53937 K) -> axelfontaine/myapp:1.0
Creating axelfontaine/myapp ...
Pushing axelfontaine/myapp:1.0 ...
Verifying axelfontaine/myapp:1.0 ...
Creating Elastic IP ...
Mapping myapp-axelfontaine.boxfuse.io to 52.28.233.167 ...
Waiting for AWS to create an AMI for axelfontaine/myapp:1.0 in eu-central-1 (this may take up to 50 seconds) ...
AMI created in 00:23.557s -> ami-d23f38cf
Creating security group boxfuse-sg_axelfontaine/myapp:1.0 ...
Launching t2.micro instance of axelfontaine/myapp:1.0 (ami-d23f38cf) in eu-central-1 ...
Instance launched in 00:30.306s -> i-92ef9f53
Waiting for AWS to boot Instance i-92ef9f53 and Payload to start at https://52.28.235.61/ ...
Payload started in 00:29.266s -> https://52.28.235.61/
Remapping Elastic IP 52.28.233.167 to i-92ef9f53 ...
Waiting 15s for AWS to complete Elastic IP Zero Downtime transition ...
Deployment completed successfully. axelfontaine/myapp:1.0 is up and running at https://myapp-axelfontaine.boxfuse.io/

您的应用程序现在应该已在 AWS 上启动并运行。Spring中文文档

请参阅有关在 EC2 上部署 Spring Boot 应用程序的博客文章以及 CloudCaptain Spring Boot 集成的文档,以开始使用 Maven 构建来运行应用程序。Spring中文文档

默认情况下,CloudCaptain 会在启动时激活名为 Spring 配置文件。 如果您的可执行 jar 或 war 包含 application-boxfuse.properties 文件,则 CloudCaptain 会根据其包含的属性进行配置。boxfuse

天蓝色

入门指南将指导你完成将 Spring Boot 应用程序部署到 Azure Spring CloudAzure 应用服务的过程。Spring中文文档

谷歌云

Google Cloud 提供了多个可用于启动 Spring Boot 应用程序的选项。 最容易上手的可能是 App Engine,但您也可以找到在装有 Container Engine 的容器中或在装有 Compute Engine 的虚拟机上运行 Spring Boot 的方法。Spring中文文档

要将您的第一个应用部署到 App Engine 标准环境,请按照本教程操作。Spring中文文档

或者,App Engine Flex 要求您创建一个文件来描述您的应用所需的资源。 通常,将此文件放入 中,它应该类似于以下文件:app.yamlsrc/main/appengineSpring中文文档

service: "default"

runtime: "java17"
env: "flex"

handlers:
- url: "/.*"
  script: "this field is required, but ignored"

manual_scaling:
  instances: 1

health_check:
  enable_health_check: false

env_variables:
  ENCRYPT_KEY: "your_encryption_key_here"

可以通过将项目 ID 添加到生成配置来部署应用(例如,使用 Maven 插件),如以下示例所示:Spring中文文档

<plugin>
	<groupId>com.google.cloud.tools</groupId>
	<artifactId>appengine-maven-plugin</artifactId>
	<version>2.4.4</version>
	<configuration>
		<project>myproject</project>
	</configuration>
</plugin>

然后部署 (需要先进行身份验证,否则生成将失败) 。mvn appengine:deploySpring中文文档