部署 Spring Boot 应用程序

1. 部署到云

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

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

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

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

1.1. Cloud Foundry

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

构建应用程序(例如,通过使用mvn clean package) 并具有安装了cf命令行工具中,使用cf push命令,将路径替换为已编译的.jar. 请务必拥有使用您的cf命令行客户端在推送应用程序之前。 以下行显示了使用cf push命令部署应用程序:spring-doc.cadn.net.cn

$ cf push acloudyspringtime -p target/demo-0.0.1-SNAPSHOT.jar
在前面的示例中,我们将acloudyspringtime无论您提供什么价值cf作为应用程序的名称。

请参阅cf push文档以获取更多选项。 如果有 Cloud Foundrymanifest.yml文件,则将其视为。spring-doc.cadn.net.cn

此时,cf开始上传您的应用程序,生成类似于以下示例的输出:spring-doc.cadn.net.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 1.8.0_121 from https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_121.tar.gz (found in cache)
       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.cadn.net.cn

应用程序上线后,您可以使用cf apps命令,如以下示例所示:spring-doc.cadn.net.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.cadn.net.cn

1.1.1. 绑定到服务

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

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

Java
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");
    }

    // ...

}
Kotlin
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 属性都以vcap. 您可以使用vcap属性来访问应用程序信息(例如应用程序的公共 URL)和服务信息(例如数据库凭证)。 有关完整详细信息,请参见 'CloudFoundryVcapEnvironmentPostProcessor' Javadoc。spring-doc.cadn.net.cn

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

1.2. Kubernetes

Spring Boot 通过检查环境中的"*_SERVICE_HOST""*_SERVICE_PORT"变量。 您可以使用spring.main.cloud-platformconfiguration 属性。spring-doc.cadn.net.cn

1.2.1. Kubernetes 容器生命周期

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

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

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

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

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

1.3. 赫洛库

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

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

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

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

这应该是您所需要的一切。 Heroku 部署最常见的部署工作流是git push将代码用于生产环境,如以下示例所示:spring-doc.cadn.net.cn

$ git push heroku main

这将导致以下内容:spring-doc.cadn.net.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 1.8... done
-----> Installing Maven 3.3.1... 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.cadn.net.cn

1.5. 亚马逊网络服务 (AWS)

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

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

1.5.1. AWS Elastic Beanstalk

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

使用 Tomcat 平台

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

使用 Java SE 平台

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

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

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

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

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

eb create -s

1.5.2. 小结

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

1.6. CloudCaptain 和 Amazon Web Services

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

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

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

请参阅boxfuse run文档以获取更多选项。 如果存在boxfuse.conf文件,则将其视为当前目录中。spring-doc.cadn.net.cn

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

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

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

1.7. Azure

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

1.8. 谷歌云

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

要在 App Engine 中运行,您可以先在 UI 中创建一个项目,该项目会为您设置唯一标识符,并设置 HTTP 路由。 将 Java 应用程序添加到项目中并将其留空,然后使用 Google Cloud SDK 将 Spring Boot 应用程序从命令行或 CI 构建推送到该槽中。spring-doc.cadn.net.cn

App Engine Standard 要求您使用 WAR 打包。 按照以下步骤将 App Engine Standard 应用程序部署到 Google Cloud。spring-doc.cadn.net.cn

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

service: "default"

runtime: "java"
env: "flex"

runtime_config:
  jdk: "openjdk8"

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.cadn.net.cn

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

然后使用mvn appengine:deploy(如果需要先进行身份验证,则构建将失败)。spring-doc.cadn.net.cn

2. 安装 Spring Boot 应用程序

除了使用 Spring Boot 应用程序运行 Spring Boot 应用程序java -jar也可以将它们作为systemd,init.d或 Windows 服务。spring-doc.cadn.net.cn

2.1. 作为 systemd 服务安装

systemd是 System V init 系统的后继者,现在被许多现代 Linux 发行版使用。 Spring Boot 应用程序可以使用systemd'service' 脚本。spring-doc.cadn.net.cn

假设您有一个 Spring Boot 应用程序打包为 uber jar/var/myapp,将其安装为systemdservice 中,创建一个名为myapp.service并将其放入/etc/systemd/system目录。 以下脚本提供了一个示例:spring-doc.cadn.net.cn

[Unit]
Description=myapp
After=syslog.target network.target

[Service]
User=myapp
Group=myapp

Environment="JAVA_HOME=/path/to/java/home"

ExecStart=${JAVA_HOME}/bin/java -jar /var/myapp/myapp.jar
ExecStop=/bin/kill -15 $MAINPID
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
请记得更改Description,User,Group,EnvironmentExecStart字段。
ExecStartfield 没有声明 script action 命令,这意味着run命令。

运行应用程序的用户、PID 文件和控制台日志文件由systemd本身,因此必须使用 'service' 脚本中的相应字段进行配置。 有关更多详细信息,请参阅 Service Unit configuration 手册页spring-doc.cadn.net.cn

要将应用程序标记为在系统引导时自动启动,请使用以下命令:spring-doc.cadn.net.cn

$ systemctl enable myapp.service

man systemctl了解更多详情。spring-doc.cadn.net.cn

2.2. 作为 init.d 服务安装(系统 V)

若要将应用程序用作init.d服务中,配置其 build 以生成完全可执行的 jarspring-doc.cadn.net.cn

完全可执行的 jar 通过在文件前面嵌入额外的脚本来工作。 目前,某些工具不接受此格式,因此您可能并不总是能够使用此技术。 例如jar -xf可能会以静默方式无法提取已完全可执行的 jar 或 war。 建议仅在您打算直接执行 jar 或 war 时才将其设置为完全可执行,而不是使用java -jar或将其部署到 servlet 容器。
无法使 zip64 格式的 jar 文件完全可执行。 尝试这样做将导致 jar 文件在直接执行或使用java -jar. 包含一个或多个 zip64 格式嵌套 jar 的标准格式 jar 文件可以完全执行。

要使用 Maven 创建“完全可执行”的 jar,请使用以下插件配置:spring-doc.cadn.net.cn

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

以下示例显示了等效的 Gradle 配置:spring-doc.cadn.net.cn

tasks.named('bootJar') {
    launchScript()
}

然后可以将其符号链接到init.d支持标准start,stop,restartstatus命令。spring-doc.cadn.net.cn

添加到完全可执行 jar 的默认启动脚本支持大多数 Linux 发行版,并在 CentOS 和 Ubuntu 上进行了测试。 其他平台(如 OS X 和 FreeBSD)需要使用自定义脚本。 默认脚本支持以下功能:spring-doc.cadn.net.cn

假设您在/var/myapp,将 Spring Boot 应用程序安装为init.dservice 中,创建一个符号链接,如下所示:spring-doc.cadn.net.cn

$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp

安装后,您可以按照通常的方式启动和停止服务。 例如,在基于 Debian 的系统上,您可以使用以下命令启动它:spring-doc.cadn.net.cn

$ service myapp start
如果您的应用程序无法启动,请检查写入/var/log/<appname>.logfor errors 的 FOR Errors。

您还可以使用标准作系统工具将应用程序标记为自动启动。 例如,在 Debian 上,您可以使用以下命令:spring-doc.cadn.net.cn

$ update-rc.d myapp defaults <priority>

2.2.1. 保护 init.d 服务

以下是有关如何保护作为 init.d 服务运行的 Spring Boot 应用程序的一组准则。 它并不是为强化应用程序及其运行环境而应执行的所有作的详尽列表。

当以 root 身份执行时,就像使用 root 启动 init.d 服务时一样,默认可执行脚本以RUN_AS_USER环境变量。 如果未设置环境变量,则使用拥有 jar 文件的用户。 您永远不应将 Spring Boot 应用程序作为root所以RUN_AS_USER永远不应该是 root,并且应用程序的 jar 文件永远不应该归 root 所有。 相反,请创建一个特定用户来运行您的应用程序,并将RUN_AS_USER环境变量或使用chown使其成为 jar 文件的所有者,如以下示例所示:spring-doc.cadn.net.cn

$ chown bootapp:bootapp your-app.jar

在这种情况下,默认可执行脚本将应用程序作为bootapp用户。spring-doc.cadn.net.cn

为了减少应用程序用户帐户被盗用的几率,您应该考虑阻止它使用登录 shell。 例如,您可以将账户的 shell 设置为/usr/sbin/nologin.

您还应该采取措施来防止修改应用程序的 jar 文件。 首先,配置其权限,使其无法写入,只能由其所有者读取或执行,如下例所示:spring-doc.cadn.net.cn

$ chmod 500 your-app.jar

其次,您还应该采取措施来限制您的应用程序或运行它的账户被盗用时的损害。 如果攻击者确实获得了访问权限,他们可以使 jar 文件可写并更改其内容。 防止这种情况的一种方法是通过使用chattr,如以下示例所示:spring-doc.cadn.net.cn

$ sudo chattr +i your-app.jar

这将阻止任何用户(包括 root)修改 jar。spring-doc.cadn.net.cn

如果使用 root 来控制应用程序的服务,并且您使用.conf文件要自定义其启动,.conf文件由 root 用户读取和评估。 它应该得到相应的保护。 用chmod这样文件就只能由所有者读取并使用chown使 root 成为所有者,如以下示例所示:spring-doc.cadn.net.cn

$ chmod 400 your-app.conf
$ sudo chown root:root your-app.conf

2.2.2. 自定义启动脚本

可以通过多种方式自定义 Maven 或 Gradle 插件编写的默认嵌入式启动脚本。 对于大多数人来说,使用默认脚本和一些自定义通常就足够了。 如果您发现无法自定义所需的内容,请使用embeddedLaunchScript选项来完全编写您自己的文件。spring-doc.cadn.net.cn

在编写 start 脚本时对其进行自定义

在将启动脚本写入 jar 文件时,自定义启动脚本的元素通常是有意义的。 例如,init.d 脚本可以提供 “description”。 由于您预先知道描述(并且不需要更改),因此您也可以在生成 jar 时提供它。spring-doc.cadn.net.cn

要自定义写入元素,请使用embeddedLaunchScriptPropertiesSpring Boot Maven 插件的选项或propertiesSpring Boot Gradle 插件的launchScript.spring-doc.cadn.net.cn

默认脚本支持以下属性替换:spring-doc.cadn.net.cn

名字 描述 Gradle 默认 Maven 默认

modespring-doc.cadn.net.cn

脚本模式。spring-doc.cadn.net.cn

autospring-doc.cadn.net.cn

autospring-doc.cadn.net.cn

initInfoProvidesspring-doc.cadn.net.cn

Provides“INIT INFO” 部分spring-doc.cadn.net.cn

${task.baseName}spring-doc.cadn.net.cn

${project.artifactId}spring-doc.cadn.net.cn

initInfoRequiredStartspring-doc.cadn.net.cn

Required-Start“INIT INFO” 部分中。spring-doc.cadn.net.cn

$remote_fs $syslog $networkspring-doc.cadn.net.cn

$remote_fs $syslog $networkspring-doc.cadn.net.cn

initInfoRequiredStopspring-doc.cadn.net.cn

Required-Stop“INIT INFO” 部分中。spring-doc.cadn.net.cn

$remote_fs $syslog $networkspring-doc.cadn.net.cn

$remote_fs $syslog $networkspring-doc.cadn.net.cn

initInfoDefaultStartspring-doc.cadn.net.cn

Default-Start“INIT INFO” 部分中。spring-doc.cadn.net.cn

2 3 4 5spring-doc.cadn.net.cn

2 3 4 5spring-doc.cadn.net.cn

initInfoDefaultStopspring-doc.cadn.net.cn

Default-Stop“INIT INFO” 部分中。spring-doc.cadn.net.cn

0 1 6spring-doc.cadn.net.cn

0 1 6spring-doc.cadn.net.cn

initInfoShortDescriptionspring-doc.cadn.net.cn

Short-Description“INIT INFO” 部分中。spring-doc.cadn.net.cn

单行版本${project.description}(回退到${task.baseName})spring-doc.cadn.net.cn

${project.name}spring-doc.cadn.net.cn

initInfoDescriptionspring-doc.cadn.net.cn

Description“INIT INFO” 部分中。spring-doc.cadn.net.cn

${project.description}(回退到${task.baseName})spring-doc.cadn.net.cn

${project.description}(回退到${project.name})spring-doc.cadn.net.cn

initInfoChkconfigspring-doc.cadn.net.cn

chkconfig“INIT INFO” 部分spring-doc.cadn.net.cn

2345 99 01spring-doc.cadn.net.cn

2345 99 01spring-doc.cadn.net.cn

confFolderspring-doc.cadn.net.cn

的默认值CONF_FOLDERspring-doc.cadn.net.cn

包含 jar 的文件夹spring-doc.cadn.net.cn

包含 jar 的文件夹spring-doc.cadn.net.cn

inlinedConfScriptspring-doc.cadn.net.cn

对应在默认启动脚本中内联的文件脚本的引用。 这可用于设置环境变量,例如JAVA_OPTS在加载任何外部配置文件之前spring-doc.cadn.net.cn

logFolderspring-doc.cadn.net.cn

的默认值LOG_FOLDER. 仅对init.d服务spring-doc.cadn.net.cn

logFilenamespring-doc.cadn.net.cn

的默认值LOG_FILENAME. 仅对init.d服务spring-doc.cadn.net.cn

pidFolderspring-doc.cadn.net.cn

的默认值PID_FOLDER. 仅对init.d服务spring-doc.cadn.net.cn

pidFilenamespring-doc.cadn.net.cn

中 PID 文件名称的默认值PID_FOLDER. 仅对init.d服务spring-doc.cadn.net.cn

useStartStopDaemonspring-doc.cadn.net.cn

无论start-stop-daemon命令(如果可用)应用于控制进程spring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

stopWaitTimespring-doc.cadn.net.cn

的默认值STOP_WAIT_TIME在几秒钟内。 仅对init.d服务spring-doc.cadn.net.cn

60spring-doc.cadn.net.cn

60spring-doc.cadn.net.cn

在脚本运行时自定义脚本

对于在编写 jar 需要自定义的脚本项,您可以使用环境变量或配置文件spring-doc.cadn.net.cn

默认脚本支持以下环境属性:spring-doc.cadn.net.cn

变量 描述

MODEspring-doc.cadn.net.cn

作的 “模式”。 默认值取决于 jar 的构建方式,但通常是auto(这意味着它试图通过检查它是否是名为init.d). 您可以将其显式设置为service这样,stop|start|status|restart命令 work 或 torun如果要在前台运行脚本。spring-doc.cadn.net.cn

RUN_AS_USERspring-doc.cadn.net.cn

将用于运行应用程序的用户。 如果未设置,则将使用拥有 jar 文件的用户。spring-doc.cadn.net.cn

USE_START_STOP_DAEMONspring-doc.cadn.net.cn

无论start-stop-daemon命令(如果可用)应用于控制进程。 默认为true.spring-doc.cadn.net.cn

PID_FOLDERspring-doc.cadn.net.cn

pid 文件夹的根名称 (/var/run默认情况下)。spring-doc.cadn.net.cn

LOG_FOLDERspring-doc.cadn.net.cn

要放置日志文件的文件夹的名称 (/var/log默认情况下)。spring-doc.cadn.net.cn

CONF_FOLDERspring-doc.cadn.net.cn

要从中读取 .conf 文件的文件夹的名称(默认情况下与 jar-file 相同)。spring-doc.cadn.net.cn

LOG_FILENAMEspring-doc.cadn.net.cn

日志文件在LOG_FOLDER (<appname>.log默认情况下)。spring-doc.cadn.net.cn

APP_NAMEspring-doc.cadn.net.cn

应用程序的名称。 如果 jar 是从符号链接运行的,则脚本会猜测应用程序名称。 如果它不是符号链接,或者你想显式设置应用程序名称,这可能很有用。spring-doc.cadn.net.cn

RUN_ARGSspring-doc.cadn.net.cn

要传递给程序(Spring Boot 应用程序)的参数。spring-doc.cadn.net.cn

JAVA_HOMEspring-doc.cadn.net.cn

的位置javaexecutable 是使用PATH默认情况下,但如果$JAVA_HOME/bin/java.spring-doc.cadn.net.cn

JAVA_OPTSspring-doc.cadn.net.cn

启动 JVM 时传递给 JVM 的选项。spring-doc.cadn.net.cn

JARFILEspring-doc.cadn.net.cn

jar 文件的显式位置,以防脚本用于启动实际上并未嵌入的 jar。spring-doc.cadn.net.cn

DEBUGspring-doc.cadn.net.cn

如果不为空,则设置-x标志,允许您查看脚本中的逻辑。spring-doc.cadn.net.cn

STOP_WAIT_TIMEspring-doc.cadn.net.cn

在强制关闭应用程序之前停止应用程序时等待的时间(以秒为单位) (60默认情况下)。spring-doc.cadn.net.cn

PID_FOLDER,LOG_FOLDERLOG_FILENAME变量仅对init.d服务。 为systemd,则使用 'service' 脚本进行等效的自定义。 有关更多详细信息,请参阅 Service Unit configuration 手册页
使用 Conf Gile

除了JARFILEAPP_NAME,可以使用.conf文件。 该文件应位于 jar 文件旁边,具有相同的名称,但后缀为.conf而不是.jar. 例如,名为/var/myapp/myapp.jar使用名为/var/myapp/myapp.conf,如以下示例所示:spring-doc.cadn.net.cn

myapp.conf
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log/folder
如果您不喜欢将配置文件放在 jar 文件旁边,则可以设置CONF_FOLDER环境变量来自定义配置文件的位置。

要了解如何适当地保护此文件,请参阅保护 init.d 服务的准则spring-doc.cadn.net.cn

2.3. Microsoft Windows 服务

Spring Boot 应用程序可以作为 Windows 服务启动winsw.spring-doc.cadn.net.cn

一个(单独维护的示例)逐步描述了如何为 Spring Boot 应用程序创建 Windows 服务。spring-doc.cadn.net.cn

3. 下一步要读什么

请参阅 Cloud FoundryHerokuOpenShiftBoxfuse 网站,了解有关 PaaS 可以提供的功能类型的更多信息。 这些只是最受欢迎的 Java PaaS 提供商中的四个。 由于 Spring Boot 非常适合基于云的部署,因此您也可以自由考虑其他提供商。spring-doc.cadn.net.cn

下一节将继续介绍 Spring Boot CLI,或者您可以跳到前面阅读有关构建工具插件的信息spring-doc.cadn.net.cn