遥遥领先
VMware 提供培训和认证以加速您的进步。
了解更多大家好,Spring 粉丝!在这个简短的 8 部分系列中,我们将了解 Google Cloud Platform 的 Spring Cloud 集成,称为 Spring Cloud GCP。Spring Cloud GCP 代表 Google 和 Pivotal 之间的共同努力,旨在为 Spring Cloud 开发人员在使用 Google Cloud Platform 时提供一流的体验。 Pivotal Cloud Foundry 用户将享受更 轻松地与 GCP 服务代理集成。 我在撰写这些文章时得到了 Google Cloud Developer Advocate 和我的朋友 Ray Tsang 的投入。 您还可以在我们的 Google Next 2018 会议 Bootiful Google Cloud Platform 中观看 Spring Cloud GCP 的演练。 谢谢哥们!与往常一样,如果您有任何反馈,我很乐意收到您的来信。
该系列共有八篇文章。 它们都在这里
当我们完成这些示例时,我们依赖于 Google Cloud SDK 的默认身份验证,以及与 Google Cloud SDK 和 gcloud
CLI 的本地安装一起使用的 Spring Cloud GCP。 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
文件。 我们可以将它们隐藏在特定于环境的 Runtime Config 中。 我们可以将它们作为 -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
将.json
服务帐户文件编码为 Base64。 我们中的一个运行在 Linux 上,另一个运行在 OS X 上。-w0
操作数确保 Base64 编码的文件不会被硬包装,即在针对GNU
base64
实用程序在 Linux 上运行时,它是一条连续的文本行。