谷歌雲函式
谷歌雲函式介面卡使得 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 主題的訊息觸發。