Spring Boot 的灵活打包选项在部署应用程序时提供了大量的选择。可以将 Spring Boot 应用程序部署到各种云平台,容器镜像(如 Docker)或虚拟/真实机器上。 本节介绍一些更常见的部署方案。 Spring Boot 的可执行 jar 时为最受欢迎的云 PaaS(Platform-as-a-Service)供应商准备的。这些供应商倾向于要求你带上自己的容器。它们管理应用程序进程(而不是 Java 应用程序),因此它们需要中间层来适应应用程序到云的运行过程的概念。
两个最受欢迎的云供应商,Heroku 和 Cloud Foundry,采用了一种构建包的方法。构建包以启动应用程序所需的任何内容来包装部署代码。它可能是 JDK 和 调用 理想情况下,应用程序就像一个 Spring Boot 可执行 jar,它需要在它里面打包的所有东西。 在本节中,我们来看看在云中启动和运行我们在新手入门部分中开发的简单应用程序需要做些什么。
Cloud Foundry 提供默认的构建包,如果没有指定其它的构建包,则会发挥作用。Cloud Foundry Java 构建包 对 Spring 应用有极好的支持,包括 Spring Boot。你可以部署独立的可执行 jar 应用程序以及传统的
当你构建完应用程序(例如,通过使用 $ cf push acloudyspringtime -p target/demo-0.0.1-SNAPSHOT.jar
有关更多选项请参阅
此时, 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 祝贺你!现在的应用程序是在线的!
一旦应用程序激活,就可以使用 $ 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 处找到应用程序。在前面的示例中,你可以在
默认情况下,有关运行的应用程序的元数据以及服务连接信息作为环境变量暴露给应用程序(例如:
环境变量并不总是用于最简单的 API,因此 Spring Boot 自动提取它们,并将数据平铺成可以通过 Spring 的 @Component class MyBean implements EnvironmentAware { private String instanceId; @Override public void setEnvironment(Environment environment) { this.instanceId = environment.getProperty("vcap.application.instance_id"); } // ... }
所有 Cloud Foundry 属性都用
Heroku 是另一个流行的 PaaS 平台。为了自定义 Heroku 构建,你需要提供一个
你必须配置应用程序以监听正确的端口。下面的示例展示了我们的启动 REST 应用程序的 web: java -Dserver.port=$PORT -jar target/demo-0.0.1-SNAPSHOT.jar
Spring Boot 使
这应该是你需要的一切。Heroku 部署最常见的部署工作流程是 $ git push heroku master 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: http://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 http://agile-sierra-1405.herokuapp.com/ deployed to Heroku To git@heroku.com:agile-sierra-1405.git * [new branch] master -> master 你的应用程序现在应该在 Heroku 上运行。 OpenShift 是 Kubernetes 容器编排平台的 Red Hat 公共(和企业)扩展。与 Kubernetes 类似,OpenShift 对于安装基于 Spring 的应用程序有很多选择。 OpenShift 具有描述如何部署 Spring Boot 应用程序的许多资源,包括: Amazon Web 服务提供了多种安装基于 Spring Boot 的应用程序的方法,既可以作为传统的 web 应用程序(war),也可以作为带有嵌入式 web 服务器的可执行 jar 文件。选项包括:
每个都有不同的特点和定价模式。在本文中,我们只描述最简单的选择:AWS Elastic Beanstalk。 正如官方 Elastic Beanstalk Java 指南中所描述的,部署 Java 应用程序有两个主要选项。你可以使用 Tomcat 平台或 Java SE 平台。
此选项适用于生成 jar 文件并运行嵌入式 Web 容器的 Spring Boot 项目。Elastic Beanstalk 环境在端口 80上 运行 nginx 实例来代理在端口 5000 上运行的实际应用程序。若要配置它,请在 server.port=5000
这是实现 AWS 的最简单方法之一,但是还有很多事情需要介绍,比如如何将 Elastic Beanstalk 集成到任何 CI / CD 工具中,使用 Elastic Beanstalk Maven 插件而不是 CLI,等等。有一篇博客文章更详细地介绍了这些主题。 Boxfuse 通过将 Spring Boot 可执行 jar 或 war 转换为一个最小的 VM 映像来工作,该映像可以在 VirtualBox 上或在 AWS 上进行不变的部署。Boxfuse 提供了对 Spring Boot 的深度集成,并使用 Spring Boot 配置文件中的信息来自动配置端口和健康检查 URL。Boxfuse 不仅利用它生成的映像的信息,还利用它提供的所有资源(实例、安全组、弹性负载平衡器等等)的信息。
一旦你创建了一个 Boxfuse 账户,将它连接到你的 AWS 帐户,安装了 Boxfuse 客户端的最新版本,并确保应用程序是由 Maven 或 Gradle(例如,通过使用 $ boxfuse run myapp-1.0.jar -env=prod
有关的更多选项请参阅
此时, 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 http://52.28.235.61/ ... Payload started in 00:29.266s -> http://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 http://myapp-axelfontaine.boxfuse.io/ 你的应用程序现在应该在 AWS 上运行。 请参阅关于在 EC2 上部署 Spring Boot 应用程序的博客文章 以及 Boxfuse Spring Boot 集成的文档 ,以开始使用 Maven 构建来运行应用程序。 Google Cloud 有几个可以用来启动 Spring Boot 应用程序的选项。最容易入门的可能是 App Engine,但是你也可以找到在具有容器引擎的容器中或者在具有计算引擎的虚拟机上运行 Spring Boot 的方法。 为了在 App Engine 中运行,可以先在 UI 中创建一个项目,它为你设置一个唯一的标识符,并且还设置 HTTP 路由。将 Java 应用程序添加到项目中,并将其留空,然后使用 Google Cloud SDK 从命令行或 CI 构建中将你的 Spring Boot 应用程序推到该槽中。 App Engine 标准要求你使用 WAR 包。按照这些步骤将 App Engine 标准应用程序部署到 Google Cloud。
另外,App Engine Flex 要求你创建一个 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 插件),如下面的示例所示: <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>appengine-maven-plugin</artifactId> <version>1.3.0</version> <configuration> <project>myproject</project> </configuration> </plugin>
然后使用
除了使用
要使用 Maven 创建一个完全可执行的 jar,请使用以下插件配置: <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin> 下面的例子展示了等效的 Gradle 配置: bootJar { launchScript() }
然后,您可以通过键入
默认脚本支持大多数 Linux 发行版,并在 CentOS 和 Ubuntu 上进行测试。其它平台,如 OS X 和 FreeBSD,需要使用自定义的
Spring Boot 应用程序可以通过使用
如果你配置了 Spring Boot 的 Maven 或 Gradle 插件来生成一个完全可执行的 jar,并且没有使用定制的 脚本支持以下特性:
假设你有一个安装在 $ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp 一旦安装完毕,就可以以通常的方式启动和停止服务。例如,在基于 Debian 的系统中,可以用以下命令启动它: $ service myapp start
还可以通过使用标准操作系统工具来标记应用程序自动启动。例如,在 Debian 上,你可以使用以下命令: $ update-rc.d myapp defaults <priority>
当作为 root 执行时,就像使用 root 启动 init.d 服务一样,默认的可执行脚本作为拥有 jar 文件的用户运行应用程序。你不应该运行 Spring Boot 应用程序作为 $ chown bootapp:bootapp your-app.jar
在这种情况下,默认的可执行脚本将应用程序运行为
还应该采取措施防止修改应用程序的 jar 文件。首先,配置其权限,使其不能写入,只能由其所有者读取或执行,如下例所示: $ chmod 500 your-app.jar
其次,如果应用程序或正在运行的帐户受到损害,还应该采取措施限制损坏。如果攻击者确实获得访问权限,则可以使 jar 文件可写并更改其内容。防止这种情况的一种方法是使用 $ sudo chattr +i your-app.jar 这将阻止任何用户,包括 root 用户,修改 jar。
如果 root 用于控制应用程序的服务,并使用 $ chmod 400 your-app.conf $ sudo chown root:root your-app.conf
假设你在 [Unit] Description=myapp After=syslog.target [Service] User=myapp ExecStart=/var/myapp/myapp.jar SuccessExitStatus=143 [Install] WantedBy=multi-user.target
注意,与作为 若要标记应用程序在系统引导时自动启动,请使用以下命令: $ systemctl enable myapp.service
详情请参阅
由 Maven 或 Gradle 插件编写的默认嵌入式启动脚本可以以多种方式定制。对于大多数人来说,使用默认脚本以及一些自定义通常是足够的。如果发现无法自定义需要的内容,请使用 在开始写入脚本到 jar 文件中时,自定义启动脚本的元素通常是有意义的。例如,init.d 脚本可以提供一个描述。既然你知道前面的描述(而且它不需要改变),你也可以在生成 jar 时提供它。
要自定义编写的元素,请使用 Spring Boot Maven 或 Gealle 插件的 默认脚本支持以下属性替换:
对于在编写 jar 之后需要定制的脚本项,可以使用环境变量或配置文件。 下面的环境属性在默认脚本中支持:
除了 myapp.conf. JAVA_OPTS=-Xmx1024M LOG_FOLDER=/custom/log/folder
若要了解如何妥善保护此文件,请参阅保护 init.d 服务的准则。 查看 Cloud Foundry、Heroku、OpenShift 和 Boxfuse 网站,了解更多关于 PaaS 可以提供的特性的信息。这些只是最流行的 Java PaaS 供应商中的四个。由于 Spring Boot 非常适合基于云的部署,因此你也可以自由地考虑其他提供商。 下一部分将继续介绍 Spring Boot CLI,或者你可以跳转到阅读有关构建工具插件的内容。 |