Ich habe versucht, Pub / Sub zu verwenden, um andere Funktionen aus Google Cloud-Funktionen aufzurufen.
Messaging und Ingesting für ereignisgesteuerte Systeme und Streaming-Analyse. Cloud Pub/Sub | Google Cloud
Pub / Sub ist ein asynchroner Messaging-Dienst, der den Dienst, der Ereignisse verarbeitet, von dem Dienst trennt, der Ereignisse generiert. Pub/Was ist Sub| Cloud Pub/Unterdokument| Google Cloud
Das offizielle Dokument ist leicht verständlich für die Beziehung zwischen Begriffen und Zeichen. Publisher-Subscriber-Beziehung
Der allgemeine Fluss ist wie folgt.
Verlage und Abonnenten können frei auf Eins-zu-Viele oder Viele-zu-Viele anstatt Eins-zu-Eins eingestellt werden.
3 HTTP-Trigger-> 1 Thema-> 2 Funktionen Es wird der Fluss.
"Erstellen Sie ein Thema" über die Themen GCP-Konsole> Pub / Sub>. Legen Sie eine beliebige Zeichenfolge für die Themen-ID fest.
"Erstellen Sie eine Funktion" über GCP Console> Cloud-Funktionen. Setzen Sie den Triggertyp auf "Cloud Pub / Sub", wählen Sie das in 1 erstellte Thema aus und speichern Sie die Konfiguration.
Wählen Sie die gewünschte Codelaufzeit. Diesmal ist es Java 11.
Wenn Sie dies eingerichtet haben, kehren Sie zum Pub / Sub-Thema in 1 zurück und stellen Sie sicher, dass es ausgelöst wird. Öffnen Sie das Thema in der GCP-Konsole> Pub / Sub> und unter "Nachricht veröffentlichen". Ich möchte es nur überprüfen, also füge die Nachricht "einmal" in "Eine Nachricht veröffentlichen" hinzu.
Öffnen Sie das "Protokoll" der Zielfunktion unter GCP Console> Cloud Functions. Wenn alles gut geht, wird eine Nachricht wie diese veröffentlicht.
Erstellt mit gradle unter Bezugnahme auf die Quelle des offiziellen Dokuments. Veröffentlichen Sie eine Nachricht zu einem Thema| Cloud Pub/Sub | Google Cloud
PublishFunction.java
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.protobuf.ByteString;
import com.google.cloud.pubsub.v1.Publisher;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.pubsub.v1.PubsubMessage;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutionException;
public class PublishFunction implements HttpFunction {
private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT");
private static final String TOPIC_NAME = System.getenv("GOOGLE_CLOUD_PUBSUB_TOPIC");
@Override
public void service(HttpRequest request, HttpResponse response) throws Exception {
String message = request.getFirstQueryParameter("message").get();
ByteString byteStr = ByteString.copyFrom(message, StandardCharsets.UTF_8);
PubsubMessage pubsubApiMessage = PubsubMessage.newBuilder().setData(byteStr).build();
try {
Publisher publisher = Publisher.newBuilder(ProjectTopicName.of(PROJECT_ID, TOPIC_NAME)).build();
try {
publisher.publish(pubsubApiMessage).get();
response.setStatusCode(200);
response.getWriter().write(message);
} finally {
publisher.shutdown();
publisher.awaitTermination(1, TimeUnit.MINUTES);
}
} catch (InterruptedException | ExecutionException e) {
System.out.println("Error publishing Pub/Sub message: " + e.getMessage());
response.setStatusCode(500);
response.getWriter().write(message);
}
}
}
Stellen Sie Folgendes ein
build.gradle
dependencies {
implementation platform("com.google.cloud:libraries-bom:5.3.0");
implementation("com.google.cloud:google-cloud-pubsub");
implementation('com.google.protobuf:protobuf-java:3.13.0')
}
Registrieren Sie die erstellte Quelle in Funktionen (bereitgestellt von Cloud Build). Der Triggertyp sollte HTTP sein.
Sie müssen auch die Laufzeitvariable GOOGLE_CLOUD_PROJECT
setzen.
Der TOPIC_NAME
kann direkt in den Code geschrieben werden, diesmal wurde er jedoch als Laufzeitvariable festgelegt.
Verwendung von Umgebungsvariablen | Dokumente zu Google Cloud-Funktionen
Rufen Sie den HTTP-Trigger der in 3 erstellten Funktion auf.
Da der URL-Parameter message
übergeben werden kann, setzen Sie hier ein beliebiges Zeichen.
Wenn dies in 1 als Nachricht an Pub / Sub veröffentlicht und schließlich in 2 an die Funktion ausgegeben wird, ist dies erfolgreich.
Selbst wenn ich die Umgebungsvariable "GOOGLE_APPLICATION_CREDENTIALS" lokal setze, tritt die folgende Ausnahme auf. Ich weiß nicht, wie ich es hier machen soll: Denken:
java.io.IOException: The Application Default Credentials are not available.
They are available if running in Google Compute Engine.
Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials.
See https://developers.google.com/accounts/docs/application-default-credentials for more information.
Ich kam in Pub / Sub an und suchte nach Möglichkeiten, um Funktionen zu verknüpfen. Funktionen werden für die Startzeit berechnet, daher erscheint es zweckmäßig, sie asynchron verarbeiten zu können.
Recommended Posts