美妙的 GCP:使用 Spring Cloud GCP 访问关系数据 (2/8)

工程 | Josh Long | 2018年8月23日 | ...

嗨,Spring 粉丝们!在这个简短的 8 部分系列中,我们将了解 Google Cloud Platform 的 Spring Cloud 集成,称为 Spring Cloud GCP。Spring Cloud GCP 代表了 Google 和 Pivotal 之间的共同努力,旨在为使用 Google Cloud Platform 的 Spring Cloud 开发人员提供一流的体验。Pivotal Cloud Foundry 用户将享受更轻松与 GCP 服务代理集成。我编写这些部分时参考了 Google Cloud 开发者布道师,也是我的朋友,Ray Tsang 的意见。您还可以在我们的 Google Next 2018 会议上观看 Spring Cloud GCP 的演练,Bootiful Google Cloud Platform。谢谢我的朋友!一如既往,如果您有任何反馈,我很乐意听到您的声音

本系列共有八篇文章。它们都在这里

](https://springframework.org.cn/blog/2018/09/06/bootiful-gcp-supporting-observability-with-spring-cloud-gcp-stackdriver-trace-6-8)

  • [美妙的 GCP:使用 Spring Cloud GCP 连接到其他 GCP 服务 (7/8)

](https://springframework.org.cn/blog/2018/09/10/bootiful-gcp-use-spring-cloud-gcp-to-connect-to-other-gcp-services-7-8)

在本部分中,我们将了解如何将基于 Spring Boot 的应用程序连接到在 Google Cloud Platform 上运行的 SQL 数据存储,例如 PostgreSQL 或 MySQL。GCP 提供托管的 SQL 服务,包括 MySQL 和 PostgreSQL。让我们配置一个 MySQL 实例并从基于 Spring Boot 的应用程序中使用它。您需要首先在 Google Cloud 中启用 SQL API。

 gcloud services enable sqladmin.googleapis.com

然后,您需要在特定区域中配置新的 Google Cloud SQL 实例。默认值为 MySQL。(这可能需要几分钟!)

gcloud sql instances create reservations --region=us-central1

然后,在该 Google Cloud SQL 实例中配置一个新的数据库。

gcloud sql databases create reservations --instance reservations

有几种方法可以建立与该 CloudSQL 实例的安全连接,例如配置 JDBC 驱动程序使用 SSL Socket Factory 和/或使用 SQL Proxy。但是,为了简化所有配置,您可以添加 GCP MySQL 启动器:org.springframework.cloudspring-cloud-gcp-starter-sql-mysql。此启动器和一些配置可以将您的应用程序连接到平台。

您可能会问,什么配置?Spring 应用程序具有 bean 定义(在 Java 代码中)和属性定义(在许多不同的属性源中,包括.yaml.properties 文件,以及我们稍后将看到的 GCP 的 RuntimeConfig 机制)。您可以使用配置文件选择性地激活特定的 bean 定义和属性定义。Spring 配置文件是标识不同 bean 和属性配置的任意标签,这些配置可以被选择性地激活。在此示例中,我们使用mysql 配置文件。

让我们看一下src/main/resources/application.propertiesmysql 配置文件的配置。

application.properties。

spring.cloud.gcp.sql.database-name=reservations
spring.cloud.gcp.sql.instance-connection-name=pgtm-jlong:us-central1:reservations

spring.datasource.initialization-mode=always
spring.datasource.hikari.maximum-pool-size=2
  • 这些属性标识客户端应连接到的 GCP SQL 实例和数据库。
  • 告诉 Spring 通过运行src/main/resources/schema.sql(如果存在)来初始化模式。

src/main/resources/schema.sql 包含用于创建预订表的 DDL。

在此示例中,我们让 Spring Boot 配置数据库。还有其他方法。我们可以使用gcloud sql connect $GCP_SQL_INSTANCE,其中$GCP_SQL_INSTANCE 应替换为您的 GCP SQL 实例名称。在本例中,SQL 实例名称为reservations。这将使您进入连接到远程数据库的 MySQL 会话,您可以在其中交互地发出相关的模式 DDL。

这是一个演示,所以让我们也安装一些示例数据。您可以创建一个文件src/main/resources/data.sql,Spring 将在应用程序启动时执行该文件,或者您可以使用gcloud sql connect。无论哪种方式,请运行以下语句。

insert into reservations(name) values('ray');
insert into reservations(name) values('josh');

现在您可以像使用任何其他 SQL 数据库一样从 Spring 应用程序与数据库进行通信。

package com.example.gcp.mysql;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.annotation.Profile;
import org.springframework.context.event.EventListener;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import java.util.Collection;

@SpringBootApplication
public class MySqlApplication {

        private final Log log = LogFactory.getLog(getClass());

        private final JdbcTemplate template;

        private final RowMapper<Reservation> rowMapper =
            (rs, rowNum) -> new Reservation(rs.getLong("id"), rs.getString("name"));

        MySqlApplication(JdbcTemplate template) {
                this.template = template;
        }

        @EventListener(ApplicationReadyEvent.class)
        public void ready() {
                Collection<Reservation> reservations = this.template
                    .query("select * from reservations", this.rowMapper);
                reservations.forEach(reservation -> log.info("reservation: " + reservation.toString()));
        }

        public static void main(String args[]) {
                SpringApplication.run(MySqlApplication.class, args);
        }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Reservation {
        private Long id;
        private String reservationName;
}

运行应用程序并确认结果是否反映在输出中。

此时,您应该已经很熟悉了;您可以使用 Spring Data JPA 和 Spring Data REST、JOOQ、MyBatis 或任何其他基于 JDBC 的技术以及 Spring Boot 来使用此 GCP 托管的 MySQL 实例。

在这篇文章中,我们使用了 Google Cloud 托管的 MySQL。这并不是特别有趣;这不是您应该使用 GCP 的原因。任何人都可以运行 MySQL!在下期文章中,我们将了解如何使用 Spring Cloud GCP 使用 Google Cloud Spanner。请务必在下周一查看下一期文章。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部