Google Cloud Functions

Google Cloud 函数适配器使 Spring Cloud 功能应用程序能够运行在 Google Cloud Functions无服务器平台上。您可以使用开源 Google Functions Framework for Java在本地运行功能,也可以在 GCP 上运行。

Project Dependencies

首先,将 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 的依赖项。这是必要的,因为它修改了插件以将你的函数打包成适用于在 Google Cloud Functions 上部署的正确 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>

最后,添加作为 Google Functions Framework for Java 的一部分提供的 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>

您可以在 Spring Cloud Functions GCP sample中找到一个正在运行的 `pom.xml`及其完整示例。

HTTP Functions

Google Cloud 函数支持部署 HTTP Functions,这些函数由 HTTP 请求调用。以下部分描述了如何将 Spring Cloud 函数部署为 HTTP 函数的说明。

Getting Started

让我们从一个简单的 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"

Buikd & Deploy to 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;
};

Background Functions

Google Cloud 函数还支持部署 Background Functions,这些函数是响应某个事件进行间接调用的,例如 Cloud Pub/Sub主题上的消息、 Cloud Storage存储桶中的更改或 Firebase事件。

spring-cloud-function-adapter-gcp 还允许将函数部署为后台函数。

以下部分描述了编写 Cloud Pub/Sub 主题后台函数的过程。但是,有许多不同的事件类型可以触发后台函数的执行,这里未对其进行讨论;这些内容在 Background Function triggers documentation中进行了描述。

GCP Getting Started

我们从一个简单的 Spring Cloud 函数开始,它将作为 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 event structure,该 Pub/Sub event structure会在 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"}'

通过查看日志确认函数是否已被调用。

Deploy to 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

每次向 --trigger-topic 指定的主题发布消息时,Google Cloud Function 现在都会调用该函数。

有关测试和验证后台函数的演练,请参阅运行 GCF Background Function sample 的说明。

Sample Functions

该项目提供以下示例函数供参考: