Google Cloud Functions
Google Cloud Functions 适配器使 Spring Cloud Function 应用程序能够在 Google Cloud Functions 无服务器平台上运行。您可以使用开源的 Google Functions Framework for Java 在本地运行该函数,也可以在 GCP 上运行。
项目依赖
首先将 spring-cloud-function-adapter-gcp 依赖添加到你的项目中。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-adapter-gcp</artifactId>
</dependency>
...
</dependencies>
此外,添加 spring-boot-maven-plugin,它将构建要部署的函数的 JAR。
请注意,我们还将 spring-cloud-function-adapter-gcp 作为 spring-boot-maven-plugin 的依赖项进行引用。这是必要的,因为它会修改插件,以便将您的函数打包成正确的 JAR 格式,以便部署到 Google Cloud Functions。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<outputDirectory>target/deploy</outputDirectory>
</configuration>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-adapter-gcp</artifactId>
</dependency>
</dependencies>
</plugin>
最后,添加作为 Java 的 Google Functions Framework 的一部分提供的 Maven 插件。这允许你通过 mvn function:run 在本地测试你的函数。
函数目标应始终设置为 org.springframework.cloud.function.adapter.gcp.GcfJarLauncher;这是一个适配器类,充当从 Google Cloud Functions 平台进入您的 Spring Cloud Function 的入口点。
<plugin>
<groupId>com.google.cloud.functions</groupId>
<artifactId>function-maven-plugin</artifactId>
<version>0.9.1</version>
<configuration>
<functionTarget>org.springframework.cloud.function.adapter.gcp.GcfJarLauncher</functionTarget>
<port>8080</port>
</configuration>
</plugin>
一个完整的 pom.xml 示例可以在 Spring Cloud Functions GCP 示例 中找到。
HTTP 函数
Google Cloud Functions 支持部署 HTTP 函数,这些函数可以通过 HTTP 请求调用。以下章节描述了将 Spring Cloud Function 部署为 HTTP 函数的说明。
入门
让我们从一个简单的 Spring Cloud Function 示例开始:
@SpringBootApplication
public class CloudFunctionMain {
public static void main(String[] args) {
SpringApplication.run(CloudFunctionMain.class, args);
}
@Bean
public Function<String, String> uppercase() {
return value -> value.toUpperCase();
}
}
在 resources/META-INF/MANIFEST.MF 中指定你的配置主类。
Main-Class: com.example.CloudFunctionMain
然后在本地运行该函数。这由项目依赖项部分中描述的 Google Cloud Functions function-maven-plugin 提供。
mvn function:run
调用 HTTP 函数:
curl http://localhost:8080/ -d "hello"
构建并部署到 GCP
首先打包你的应用程序。
mvn package
如果你添加了上面定义的自定义 spring-boot-maven-plugin 插件,你应该会在 target/deploy 目录中看到生成的 JAR。这个 JAR 的格式正确,可以部署到 Google Cloud Functions。
接下来,请确保已安装Cloud SDK CLI。
从项目根目录运行以下命令来部署。
gcloud functions deploy function-sample-gcp-http \
--entry-point org.springframework.cloud.function.adapter.gcp.GcfJarLauncher \
--runtime java11 \
--trigger-http \
--source target/deploy \
--memory 512MB
调用 HTTP 函数:
curl https://REGION-PROJECT_ID.cloudfunctions.net/function-sample-gcp-http -d "hello"
设置自定义 HTTP statusCode:
Functions can specify a custom HTTP response code by setting the `FunctionInvoker.HTTP_STATUS_CODE` header.
@Bean
public Function<String, Message<String>> function() {
String payload = "hello";
Message<String> message = MessageBuilder.withPayload(payload).setHeader(FunctionInvoker.HTTP_STATUS_CODE, 404).build();
return input -> message;
};
背景函数
Google Cloud Functions 还支持部署Background Functions,这些函数是在响应某个事件时间接调用的,例如 Cloud Pub/Sub 主题上的消息、Cloud Storage 存储桶中的更改或 Firebase 事件。
spring-cloud-function-adapter-gcp 也允许将函数部署为后台函数。
以下部分描述了编写 Cloud Pub/Sub 主题后台函数的过程。但是,有多种不同类型的事件可以触发后台函数执行,这些在此处未讨论;这些在后台函数触发器文档中有所描述。
GCP 入门
让我们从一个简单的 Spring Cloud Function 开始,它将作为一个 GCF 背景函数运行:
@SpringBootApplication
public class BackgroundFunctionMain {
public static void main(String[] args) {
SpringApplication.run(BackgroundFunctionMain.class, args);
}
@Bean
public Consumer<PubSubMessage> pubSubFunction() {
return message -> System.out.println("The Pub/Sub message data: " + message.getData());
}
}
此外,在项目中创建 PubSubMessage 类,定义如下。此类表示传递给您的函数的 Pub/Sub 事件结构。
public class PubSubMessage {
private String data;
private Map<String, String> attributes;
private String messageId;
private String publishTime;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Map<String, String> getAttributes() {
return attributes;
}
public void setAttributes(Map<String, String> attributes) {
this.attributes = attributes;
}
public String getMessageId() {
return messageId;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public String getPublishTime() {
return publishTime;
}
public void setPublishTime(String publishTime) {
this.publishTime = publishTime;
}
}
在 resources/META-INF/MANIFEST.MF 中指定你的配置主类。
Main-Class: com.example.BackgroundFunctionMain
然后在本地运行该函数。这由项目依赖项部分中描述的 Google Cloud Functions function-maven-plugin 提供。
mvn function:run
调用 HTTP 函数:
curl localhost:8080 -H "Content-Type: application/json" -d '{"data":"hello"}'
验证函数是否被调用,可以通过查看日志来确认。
部署到 GCP
为了将您的后台函数部署到 GCP,首先需要打包您的应用程序。
mvn package
如果你添加了上面定义的自定义 spring-boot-maven-plugin 插件,你应该会在 target/deploy 目录中看到生成的 JAR。这个 JAR 的格式正确,可以部署到 Google Cloud Functions。
接下来,请确保已安装Cloud SDK CLI。
从项目基础目录运行以下命令以进行部署。
gcloud functions deploy function-sample-gcp-background \
--entry-point org.springframework.cloud.function.adapter.gcp.GcfJarLauncher \
--runtime java11 \
--trigger-topic my-functions-topic \
--source target/deploy \
--memory 512MB
Google Cloud Function 现在会在每次向由 --trigger-topic 指定的主题发布消息时调用该函数。
有关测试和验证您的后台函数的步骤,请参阅运行GCF 后台函数示例的说明。
示例函数
该项目提供了以下示例函数作为参考:
-
function-sample-gcp-http 是一个 HTTP 函数,您可以在本地测试并尝试部署。
-
function-sample-gcp-background 展示了一个后台函数的示例,该函数由发布到指定 Pub/Sub 主题的消息触发。