领先一步
VMware 提供培训和认证,助您加速进步。
了解更多各位Spring的粉丝们大家好!在这个简短的8部分系列中,我们将探讨Spring Cloud对Google Cloud Platform的集成,该集成被称为Spring Cloud GCP。 Spring Cloud GCP 是Google和Pivotal之间的一项合作项目,旨在为使用Google Cloud Platform的Spring Cloud开发者提供一流的体验。Pivotal Cloud Foundry用户将享受到与GCP服务代理 更简单的集成。我撰写这些章节时,得到了Google Cloud开发者倡导者、我的朋友 Ray Tsang 的协助。您也可以在我们的Google Next 2018会议 Bootiful Google Cloud Platform 中观看Spring Cloud GCP的演示。谢谢你,朋友!一如既往,如果您有任何反馈, 我很乐意倾听。
该系列共有八篇文章。以下是全部内容:
在我们完成这些示例的过程中,我们依赖于 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.properties 或 application.yml 文件。我们可以将其存储在特定于环境的运行时配置中。我们可以在运行应用程序时将其作为 -D 参数或环境变量提供。因此,我们可以轻松地说 java -Dspring.cloud.gcp.credentials.encoded-key=… -jar .. 来提供一个新值,该值会贡献一个新值给应用程序或覆盖 src/main/resources/application.properties 中的现有值。
对于 Cloud Foundry 或 Heroku 等平台,环境变量更自然,因为我们不必控制应用程序的运行方式,即其 java 命令。平台 Buildpack 会为我们处理这些。让我们看看如何在本地运行应用程序。
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.sh和deploy.sh中,我们都使用了base64 -w0来以 Base64 编码.json服务帐号文件。我们中的一个人运行 Linux,另一个人运行 OS X。-w0参数确保在 Linux 上针对GNUbase64工具运行时,Base64 编码的文件不会硬换行,而是成为一个连续的文本行。