美妙的 GCP:迈向生产环境!(8/8)

工程 | Josh Long | 2018年9月13日 | ...

嗨,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 的演练,美妙的 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)

在我们完成这些示例的过程中,我们依赖于 Google Cloud SDK 和 Spring Cloud GCP 的默认身份验证与 Google Cloud SDK 的本地安装和 gcloud CLI 一起工作。Spring Cloud GCP 的自动配置配置了一个 DefaultCredentialsProvider,它寻找某种身份验证方式。到目前为止,一切都在我们的本地机器上运行良好,因为我们运行了交互式身份验证提示,并在 Google Cloud 网站上确认了我们的权限与该应用程序的链接。但是,如果您想在 CI 环境中运行测试或将应用程序部署到云平台怎么办?

我们需要一种方法在这些环境中传达我们的授权。我们可以在 Google Cloud 上使用服务帐号来实现这一点。此处说明了该过程。要点是,您需要尽可能狭义地描述您的应用程序可以使用 Google Cloud 服务帐号拥有的权限,然后将这些凭据呈现到一个文件中,然后我们将将其提供给应用程序。

PROJECT_ID=$(gcloud config list --format 'value(core.project)')


NAME=gcp-service-app


gcloud iam service-accounts create $NAME


gcloud projects add-iam-policy-binding $PROJECT_ID  --member "serviceAccount:${NAME}@${PROJECT_ID}.iam.gserviceaccount.com" --role "roles/owner"


gcloud iam service-accounts keys create ${NAME}.json --iam-account ${NAME}@${PROJECT_ID}.iam.gserviceaccount.com
  • 名称是任意的。您可以使用反映应用程序性质的名称。

  • 创建服务帐号并为其命名

  • 添加一个角色 - roles/owner - 到我们的服务绑定。您最好更细致地分配角色。

  • 生成一个包含密钥的文件 gcp-service-app.json

此过程的结果应为本地机器上的 .json 文件 gcp-service-app.json

警告

.json 文件是机密!请勿共享或丢失它!

您需要告诉 Spring Cloud 应用程序在哪里可以找到此凭据。您可以将其作为文件位置或 Base 64 编码的 String 传递给 Spring Cloud GCP。让我们执行后者。我们可以使用 spring.cloud.gcp.credentials.encoded-key 传达我们刚刚生成的文件的 Base64 编码内容。

这是一个机密值,它在不同的环境中会不同。我们不希望将其检入版本控制中,在 src/main/resources/application.properties 中,即使我们这样做,我们仍然需要维护不同的特定于环境的值。Spring Boot 允许我们在运行应用程序时提供覆盖。我们可以使用 application.propertiesapplication.yml 文件。我们可以将它们存储在特定于环境的 Runtime Config 中。我们可以在运行应用程序时将其作为 -D 参数或环境变量提供。因此,我们可以轻松地说 java -Dspring.cloud.gcp.credentials.encoded-key=…​ -jar .. 来提供一个值,该值要么为应用程序贡献一个新值,要么覆盖 src/main/resources/application.properties 中的现有值。

环境变量更适合 Cloud Foundry 或 Heroku 等平台,在这些平台上我们不一定希望控制应用程序的运行方式,控制其 java 调用。平台构建包会为我们做到这一点。让我们看看如何在本地运行应用程序。

run.sh。

#!/bin/bash


export SPRING_CLOUD_GCP_CREDENTIALS_ENCODED_KEY=$( cat $GCP_SERVICE_ACCOUNT_KEY_FILE | base64 -w0  )
export SPRING_CLOUD_GCP_PROJECT_ID=$(gcloud config list --format 'value(core.project)')

mvn clean spring-boot:run
  • 在运行此脚本时,请在运行应用程序之前设置环境变量 SPRING_CLOUD_GCP_CREDENTIALS_ENCODED_KEY,以指向服务帐户 .json 文件的位置。

在我的机器上,我能够像这样运行该脚本:GCP_SERVICE_ACCOUNT_KEY_FILE=/home/jlong/keys/gcp-service-account.json ./run.sh。您 .json 文件的本地路径很可能会有所不同。

您可以根据您的特定 CI 环境翻译这些环境变量。一旦您的应用程序经过测试和集成,它就可以投入生产!对我来说,生产环境是 Cloud Foundry(运行在 Google Cloud 之上,当然)。以下是一个将应用程序部署到我已通过身份验证的 Cloud Foundry 实例的脚本。

deploy.sh。

#!/usr/bin/env bash

mvn -DskipTests=true clean package


cf d -f $APP_NAME


cf push --no-start --random-route -p $JAR $APP_NAME
cf set-env $APP_NAME SPRING_CLOUD_GCP_CREDENTIALS_ENCODED_KEY "$( cat $GCP_SERVICE_ACCOUNT_KEY_FILE | base64 -w0 )"
cf set-env $APP_NAME SPRING_CLOUD_GCP_PROJECT_ID $(gcloud config list --format 'value(core.project)')


cf restart $APP_NAME
  • 警告!此脚本会删除现有应用程序。您不需要这样做,但这可以确保事物被干净地重置 :)

  • 在这里,我们推送应用程序,为其提供随机路由,并告诉 Cloud Foundry不要启动它。然后,我们为应用程序指定环境变量。

  • 最后,在我们完成安全性设置后,我们启动应用程序。

提示

run.shdeploy.sh 中,我们都使用了 base64 -w0 来以 Base64 编码 .json 服务帐户文件。我们中有人在 Linux 上运行,而另一些人在 OS X 上运行。-w0 操作数确保在 Linux 上针对 GNU base64 实用程序运行时,Base64 编码的文件不会被硬换行,它是一行连续的文本。

获取 Spring Newsletter

通过 Spring Newsletter 保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部