谷歌云函数
谷歌云函数适配器使得 Spring Cloud Function 应用能够在 谷歌云函数 无服务器平台上运行。你可以使用开源的 Java 版 Google Functions Framework 在本地运行函数,也可以在 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 格式打包你的函数,从而在谷歌云函数上进行部署。 |
<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 ;这是一个适配器类,它作为谷歌云函数平台访问你的 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 函数
谷歌云函数支持部署 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
然后在本地运行函数。这是由项目依赖项部分描述的谷歌云函数 function-maven-plugin
提供的。
mvn function:run
调用 HTTP 函数
curl https://:8080/ -d "hello"
构建并部署到 GCP
首先打包你的应用。
mvn package
如果你添加了上面定义的自定义 spring-boot-maven-plugin
插件,你应该在 target/deploy
目录中看到生成的 JAR 包。此 JAR 包已正确格式化,可用于部署到谷歌云函数。
接下来,确保你已安装 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 状态码
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;
};
后台函数
谷歌云函数还支持部署 后台函数,它们间接响应事件而被调用,例如 Cloud Pub/Sub 主题上的消息、Cloud Storage 存储桶中的更改或 Firebase 事件。
spring-cloud-function-adapter-gcp
也允许将函数部署为后台函数。
以下各节描述了编写 Cloud Pub/Sub 主题后台函数的过程。但是,有许多不同类型的事件可以触发后台函数执行,本文未在此讨论;这些在 后台函数触发器文档 中有描述。
GCP 入门
让我们从一个将作为 GCF 后台函数运行的简单 Spring Cloud Function 示例开始
@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 主题事件中传递给你的函数的 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
然后在本地运行函数。这是由项目依赖项部分描述的谷歌云函数 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 包已正确格式化,可用于部署到谷歌云函数。
接下来,确保你已安装 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
现在,每当消息发布到由 --trigger-topic
指定的主题时,谷歌云函数就会调用该函数。
有关测试和验证后台函数的详细步骤,请参阅运行 GCF 后台函数示例 的说明。
示例函数
项目提供了以下示例函数作为参考
-
function-sample-gcp-http 是一个 HTTP 函数,你可以在本地测试并尝试部署。
-
function-sample-gcp-background 展示了一个后台函数的示例,该函数由发布到指定 Pub/Sub 主题的消息触发。