1. 概述

将 Spring Boot 应用部署到 Cloud Foundry 是一件非常简单的事。本教程将带你一步步完成整个流程。

2. 添加 Spring Cloud 依赖

由于项目需要引入 Spring Cloud 相关功能,我们首先在 pom.xml 中添加 Spring Cloud 的 BOM(Bill of Materials)依赖管理:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2023.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

你可以通过 Maven Central 获取最新版本的 spring-cloud-dependencies

为了方便构建 Cloud Foundry 特定版本,我们建议在 pom.xml 中创建一个名为 cloudfoundry 的 Maven Profile,并配置编译排除项和打包插件:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/logback.xml</exclude>
            </excludes>
        </resource>
    </resources>
    <plugins>
        <plugin>                        
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <finalName>${project.name}-cf</finalName>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>**/cloud/config/*.java</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

同时,为了避免将云平台相关的文件混入常规构建中,我们还在全局构建配置中添加了排除项:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>**/cloud/*.java</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

接下来,添加两个关键依赖:Spring Cloud Starter 和 Spring Cloud Connectors,它们提供了对 Cloud Foundry 的支持:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cloud-connectors</artifactId>
</dependency>

3. Cloud Foundry 环境准备

要完成本教程,你需要注册一个 Cloud Foundry 账户,比如 Pivotal Web Services,或者下载预配置好的开发环境:

别忘了安装 Cloud Foundry CLI 工具,安装指南见 这里

注册后你会获得一个 API URL(可通过左侧菜单的 Tools 选项找回)。

Cloud Foundry 支持将服务绑定到应用容器中。接下来,登录到你的 Cloud Foundry 环境:

cf login -a <url>

Cloud Foundry Marketplace 提供了丰富的服务,包括数据库、消息队列、邮件、监控、日志等,其中大多数都提供免费或试用计划。

我们可以通过以下命令搜索 Marketplace 中的 MySQL 服务:

cf marketplace | grep MySQL

输出示例:

>
cleardb     spark, boost*, amp*, shock*         Highly available MySQL for your Apps.

在 PCF 中,MySQL 服务名为 cleardb,付费套餐会标记 *

查看服务详情:

cf marketplace -s cleardb

输出示例:

>
service plan description                                                                 free or paid
spark        Great for getting started and developing your apps                             free
boost        Best for light production or staging your applications                         paid
amp          For apps with moderate data requirements                                       paid
shock        Designed for apps where you need real MySQL reliability, power and throughput  paid

创建一个名为 spring-bootstrap-db 的免费 MySQL 服务实例:

cf create-service cleardb spark spring-bootstrap-db

4. 应用配置

接下来,在 org.baeldung.cloud.config 包中创建一个继承 AbstractCloudConfig 并使用 @Configuration 注解的类,用于配置 DataSource

@Configuration
@Profile("cloud")
public class CloudDataSourceConfig extends AbstractCloudConfig {
 
    @Bean
    public DataSource dataSource() {
        return connectionFactory().dataSource();
    }
}

添加 @Profile("cloud") 是为了确保在本地测试时不会激活 Cloud Connector。同时,在集成测试中添加 @ActiveProfiles(profiles = {"local"})

使用以下命令构建应用:

mvn clean install spring-boot:repackage -P cloudfoundry

此外,我们还需要一个 manifest.yml 文件,用于将服务绑定到应用。

通常将 manifest.yml 放在项目根目录,但为了演示多云平台部署,我们将其放在 cloudfoundry 子目录中:

---
applications:
- name: spring-boot-bootstrap
  memory: 768M
  random-route: true
  path: ../target/spring-boot-bootstrap-cf.jar
  env:
    SPRING_PROFILES_ACTIVE: cloud,mysql
  services:
  - spring-bootstrap-db

5. 部署应用

部署应用非常简单,只需执行:

cd cloudfoundry
cf push

Cloud Foundry 将使用 Java Buildpack 自动部署应用,并分配一个随机路由。

查看最近的日志:

cf logs spring-boot-bootstrap --recent

实时查看日志:

cf logs spring-boot-bootstrap

获取应用路由地址:

cf app spring-boot-bootstrap

输出示例:

>
name:              spring-boot-bootstrap
requested state:   started
routes:            spring-boot-bootstrap-delightful-chimpanzee.cfapps.io
last uploaded:     Thu 23 Aug 08:57:20 SAST 2018
stack:             cflinuxfs2
buildpacks:        java-buildpack=v4.15-offline-...

type:           web
instances:      1/1
memory usage:   768M
     state     since                  cpu    memory           disk
#0   running   2018-08-23T06:57:57Z   0.5%   290.9M of 768M   164.7M of 1G

测试添加一本书:

curl -i --request POST \
    --header "Content-Type: application/json" \
    --data '{"title": "The Player of Games", "author": "Iain M. Banks"}' \
    https://<app-route>/api/books
# 或使用 httpie
http POST https://<app-route>/api/books title="The Player of Games" author="Iain M. Banks"

查看所有书籍:

curl -i https://<app-route>/api/books 
# 或
http https://<app-route>/api/books

输出示例:

>
HTTP/1.1 200 OK

[
    {
        "author": "Iain M. Banks",
        "id": 1,
        "title": "Player of Games"
    },
    {
        "author": "J.R.R. Tolkien",
        "id": 2,
        "title": "The Hobbit"
    }
]

6. 应用扩缩容

Cloud Foundry 的扩缩容操作也非常简单,使用 scale 命令即可:

cf scale spring-cloud-bootstrap-cloudfoundry <options>
Options:
-i <instances>         # 实例数
-m <memory-allocated>  # 内存大小,如 512M 或 1G
-k <disk-space-allocated> # 磁盘空间,如 1G 或 2G
-f                     # 强制重启,不提示确认

用完记得删除应用

cf delete spring-cloud-bootstrap-cloudfoundry

7. 总结

本文介绍了如何使用 Spring Cloud 简化 Spring Boot 应用在 Cloud Foundry 上的开发和部署流程。Cloud Foundry CLI 的详细文档可以参考 官方文档

更多 CLI 插件可在 插件仓库 中找到。

完整代码示例请访问 GitHub:spring-boot-bootstrap


原始标题:Deploying a Spring Boot Application to Cloud Foundry