此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.4.0spring-doc.cn

部署到云

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

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

理想情况下,你的应用程序(如 Spring Boot 可执行 jar)具有打包运行所需的一切。spring-doc.cn

在本节中,我们将了解如何在云中启动并运行我们在 “入门” 部分中开发的应用程序spring-doc.cn

云铸造

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

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

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

有关更多选项,请参阅 cf push 文档。 如果同一目录中存在 Cloud Foundry manifest.yml 文件,则考虑该文件。spring-doc.cn

此时,开始上传您的应用程序,生成类似于以下示例的输出:cfspring-doc.cn

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-doc.cn

应用程序上线后,您可以使用命令验证已部署应用程序的状态,如以下示例所示:cf appsspring-doc.cn

$ 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-doc.cn

绑定到服务

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

环境变量并不总是最简单的 API,因此 Spring Boot 会自动提取它们并将数据扁平化为可以通过 Spring 的Environment抽象访问的属性,如以下示例所示:spring-doc.cn

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 API 文档。vcapvcapspring-doc.cn

Java CFEnv 项目更适合于配置 DataSource 等任务。

Kubernetes (简体中文)

Spring Boot 通过检查环境变量的环境来自动检测 Kubernetes 部署环境。 您可以使用 configuration 属性覆盖此检测。"*_SERVICE_HOST""*_SERVICE_PORT"spring.main.cloud-platformspring-doc.cn

Spring Boot 可帮助您管理应用程序的状态,并使用 Actuator 通过 HTTP Kubernetes 探针将其导出。spring-doc.cn

Kubernetes 容器生命周期

当 Kubernetes 删除应用程序实例时,关闭过程同时涉及多个子系统:关闭钩子、注销服务、从负载均衡器中删除实例...... 由于这种关闭处理是并行进行的(并且由于分布式系统的性质),因此有一个窗口可以将流量路由到也已开始其关闭处理的 Pod。spring-doc.cn

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

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

一旦 pre-stop 钩子完成,SIGTERM 将被发送到容器并开始正常关闭,允许任何剩余的正在进行的请求完成。spring-doc.cn

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

Heroku

Heroku 是另一个流行的 PaaS 平台。 要自定义 Heroku 构建,您需要提供一个 ,它提供部署应用程序所需的咒语。 Heroku 为 Java 应用程序分配一个要使用的 URL,然后确保路由到外部 URI 有效。Procfileportspring-doc.cn

您必须将应用程序配置为侦听正确的端口。 以下示例显示了我们的入门 REST 应用程序:Procfilespring-doc.cn

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

Spring Boot 使参数可用作可从 Spring Environment 实例访问的属性。 配置属性被馈送到嵌入式 Tomcat、Jetty 或 Undertow 实例,然后在启动时使用该端口。 环境变量由 Heroku PaaS 分配给我们。-Dserver.port$PORTspring-doc.cn

这应该是您所需要的一切。 Heroku 部署最常见的部署工作流是从代码到生产环境,如以下示例所示:git pushspring-doc.cn

$ git push heroku main

这将导致以下内容:spring-doc.cn

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-doc.cn

亚马逊网络服务 (AWS)

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

每个都有不同的功能和定价模型。 在本文档中,我们介绍了使用 AWS Elastic Beanstalk 的方法。spring-doc.cn

AWS Elastic Beanstalk

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

使用 Tomcat 平台

此选项适用于生成 war 文件的 Spring Boot 项目。 不需要特殊配置。 您只需遵循官方指南。spring-doc.cn

使用 Java SE 平台

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

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

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

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

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

eb create -s

总结

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

CloudCaptain 和 Amazon Web Services

CloudCaptain 的工作原理是将 Spring Boot 可执行 jar 或 war 转换为最小的 VM 映像,该映像可以原封不动地部署在 VirtualBox 或 AWS 上。 CloudCaptain 附带了 Spring Boot 的深度集成,并使用 Spring Boot 配置文件中的信息自动配置端口和运行状况检查 URL。 CloudCaptain 将此信息用于其生成的映像以及它预置的所有资源(实例、安全组、Elastic Load Balancer 等)。spring-doc.cn

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

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

有关更多选项,请参阅 boxfuse 运行文档。 如果当前目录中存在 boxfuse.conf 文件,则考虑该文件。spring-doc.cn

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

此时,CloudCaptain 会为您的应用程序创建一个映像,上传该映像,并在 AWS 上配置和启动必要的资源,从而产生类似于以下示例的输出:spring-doc.cn

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-doc.cn

请参阅有关在 EC2 上部署 Spring Boot 应用程序的博客文章以及 CloudCaptain Spring Boot 集成的文档,以开始使用 Maven 版本来运行应用程序。spring-doc.cn

天蓝色

入门指南将指导你将 Spring Boot 应用程序部署到 Azure Spring CloudAzure 应用服务spring-doc.cn

谷歌云

Google Cloud 有几个选项可用于启动 Spring Boot 应用程序。 最容易上手的可能是 App Engine,但您也可以找到在具有 Container Engine 的容器中或使用 Compute Engine 在虚拟机上运行 Spring Boot 的方法。spring-doc.cn

要将第一个应用程序部署到 App Engine 标准环境,请按照本教程操作。spring-doc.cn

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

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-doc.cn

<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-doc.cn