领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多嗨,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。谢谢朋友!与往常一样,如果您有任何反馈,我都很乐意听取您的意见。
该系列共有八篇文章。以下是所有文章
在我们完成这些示例的过程中,我们依赖于 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
文件。我们可以将它们存储在特定于环境的 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.sh
和deploy.sh
中,我们都使用了base64 -w0
来以 Base64 编码.json
服务帐户文件。我们中有人在 Linux 上运行,而另一些人在 OS X 上运行。-w0
操作数确保在 Linux 上针对GNU
base64
实用程序运行时,Base64 编码的文件不会被硬换行,它是一行连续的文本。