Ereignisrelais entwickeln und bereitstellen
Erstellen Sie eine Oracle Functions-Anwendung, die Blockchain-Ereignisse verbraucht und an Oracle Streaming Service weiterleitet.
Die Ereignisrelais-Anwendung benötigt Zugangsdaten für die Verbindung mit dem Streaming-Service. Die Zugangsdaten werden in Oracle Cloud Infrastructure Vault gespeichert. Die Zugangsdaten werden in Vault gespeichert, wenn Sie den Terraform-Code ausführen. Die Zugangsdaten werden beim Ausführen der anfänglichen Konfiguration der OCI-Umgebung generiert.
Die Funktion stellt die folgenden Services bereit:
- Streaming Service-Zugangsdaten aus Vault abrufen.
- Entschlüsseln Sie die Zugangsdaten (Vault speichert verschlüsselte Werte).
- Decode aus base64-codierter Zeichenfolge.
- Verwenden Sie die decodierten Zugangsdaten, um mit der Kafka-kompatiblen API eine Verbindung zum Streaming-Service herzustellen.
- Erstellen und füllen Sie ein Java-Objekt mit dem Namen event aus der JSON-Ereignismeldung.
- Verwenden Sie die Kafka-API, um die Ereignisnachricht zu senden.
Ereignisverschiebung erstellen
Sie können das Relay in jeder Programmiersprache erstellen. Da Kafka-APIs jedoch in Java dokumentiert sind, ist es am besten, Java zu verwenden.
Die Klasse EventProducer verfügt über die folgenden Methoden:
@FnConfiguration
public void config(RuntimeContext ctx) { ... }
private String decryptData(String cipherText) { ... }
public String handleRequest(Event event) { ... }
Die folgenden Abhängigkeiten sind auch in der Datei pom.xml
erforderlich:
<dependencies>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-keymanagement</artifactId>
<version>1.12.5</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>com.fnproject.fn</groupId>
<artifactId>api</artifactId>
<version>${fdk.version}</version>
</dependency>
.
.
.
Stellen Sie sicher, dass das fn CLI-Tool installiert ist. Weitere Informationen finden Sie unter https://github.com/fnproject/fn#quickstart.
Ereignisverschiebung erstellen
Bevor Sie ein Image per Push übergeben können, müssen Sie zuerst den Befehl docker tag
verwenden, um eine Kopie des lokalen Quellimage als neues Image zu erstellen (das neue Image ist eigentlich nur ein Verweis auf das vorhandene Quellimage). Geben Sie als Namen für das neue Image den vollqualifizierten Pfad zum Zielspeicherort in Oracle Cloud Infrastructure Registry an, in den Sie das Image per Push übergeben möchten.
Sie benötigen die folgenden Informationen für das Tag:
- Der Docker-Registry-Endpunkt für Ihre Region
- Ihr Object Storage-Namespace
Um den Endpunkt für Ihre Region abzurufen, suchen Sie in der Tabelle unter Verfügbarkeit nach Region nach Ihrer Region. Beispiel: Der Registry-Endpunkt für US East (Ashburn) ist https://iad.ocir.io
.
So suchen Sie den Object Storage-Namespace:
- Klicken Sie im Navigationsmenü auf Administration und dann auf Mandantendetails.
- Der Obect-Speicher-Namespace befindet sich im Abschnitt "Object Storage-Einstellungen".
Ereignis-Relay an die Registry übertragen
Nachdem das Ereignisrelais erstellt wurde und über das richtige Tag verfügt, können Sie es in Oracle Cloud Infrastructure Registry übertragen.
- API-Endpunkt für Ihre Region: Beispiel:
iad.ocir.io
. Dies ist derselbe Wert, den Sie zuvor zum Taggen des Docker-Images verwendet haben. - Mandanten-Namespace: Die automatisch generierte Object Storage-Namespace-Zeichenfolge Ihres Mandanten (wie auf der Seite Mandanteninformationen angezeigt).
- Benutzername: Ihr Benutzername in Oracle Cloud Infrastructure.
- Authentifizierungstoken: Das Token, das Sie zuvor im Abschnitt "Plan" erstellt haben.
API-Schlüssel erstellen
Generieren Sie ein Schlüsselpaar, und laden Sie den Public Key in Ihr Oracle Cloud Infrastructure-Benutzerprofil hoch.
Dies können Sie auf unterschiedliche Weise tun, aber hier verwenden wir die Cloud-Shell, weil Sie den generierten Schlüssel sicher direkt in Ihren Account hochladen können.
Terraform-Konfiguration anwenden
Laden Sie die Terraform-Konfiguration aus dem GitHub-Repository herunter, aktualisieren Sie die Terraform-Variablendatei, und wenden Sie dann die Konfiguration an.
terraform.tvars
erforderlich.
- Region - Die Regions-ID für die Region. Sie können diesen aus der URL der Oracle Cloud Infrastructure-Konsole extrahieren. Beispiel: Wenn die URL
https://console.us-ashburn-1.oraclecloud.com/compute/instances
lautet, lautet die Regions-ID us-ashburn-1. Wenn die URLhttps://cloud.oracle.com/compute/instances
lautet, müssen Sie die Regions-ID in https://docs.oracle.com/iaas/Content/General/Concepts/regions.htm suchen. - Compartment-OCID: Die OCID des Compartments, das die Ressourcen für das Projekt enthält. Wenn Sie die Anweisungen im Abschnitt "Plan" befolgt haben, benötigen Sie die OCID für das Compartment OBP_Events.
- Fingerprint: Der Fingerprint des öffentlichen API-Schlüssels, den Sie zuvor generiert und in Ihr Profil hochgeladen haben.
- Private Key - Der vollständige Pfad und Dateiname des zuvor generierten privaten API-Schlüssels. Beispiel:
/home/opc/oci_api_key.pem
. Verwenden Sie~
nicht im Pfad. - Benutzer-OCID - Sie können diese auf der Seite Benutzerdetails abrufen. Öffnen Sie das Menü "Konsole", navigieren Sie zu Identität, und klicken Sie auf Benutzer. Klicken Sie in der Liste auf Ihren Benutzernamen.
- Mandanten-OCID - Sie können diese auf der Seite Mandantendetails abrufen. Öffnen Sie das Menü "Konsole", navigieren Sie zu Administration, und klicken Sie auf Mandantendetails.
Wenn Sie die Informationen haben, laden Sie die Terraform-Konfiguration herunter und wenden sie an.
Blockchain-Ereignisse abonnieren
Registrieren Sie eine Callback-URL, damit API Gateway Blockchain-Ereignisse empfangen kann.
https://joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com/obpevents/callback
. Sie benötigen außerdem den API-Gateway-Deployment-Endpunkt, der beim Abschluss des Terraform-Prozesses als use_to_extract_ssl_certificate angezeigt wurde. Es hat die Form joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com:443
Sie benötigen außerdem den REST-API-Endpunkt von Oracle Blockchain Platform, um Chaincode-Ereignisse abonnieren zu können. Sie hat folgende Form:
https://<rest_server_url:port/restproxy#>/bcsgw/rest/v1/event/subscribe
<rest_server_url:port/restproxy#>
ist die URL für den REST-Proxy, der in der Oracle Blockchain Platform-Konsole aufgeführt wird. Öffnen Sie in der Konsole die Seite "Knoten", und suchen Sie nach dem REST-Proxyknoten. In der Spalte "Route" wird eine URL mit Port und einer REST-Proxynummer aufgeführt.
So abonnieren Sie Blockchain-Ereignisse:
Ereignis-Consumer erstellen und testen
Der Event Consumer verwendet Kafka-APIs zur Authentifizierung und zum Abrufen von Blockchain-Nachrichten aus Oracle Cloud Infrastructure Streaming.
Um einen Consumer zu erstellen, benötigen Sie Informationen für die folgenden Zeichenfolgen:
- USER-NAME: Ihr Benutzername.
- AUTH-TOKEN: Dies ist das Token, das Sie zuvor generiert und kopiert haben.
- TENANCY-NAME: Sie finden diesen Wert auf der Seite Mandantendetails der OCI-Konsole. Um die Seite Mandantendetails zu öffnen, wählen Sie im Navigationsmenü der Konsole die Option Administration und klicken dann auf Mandantendetails.
- STREAM-POOL-OCID: Dies ist die OCID des Streampools, der bei der Ausführung des Terraform-Skripts erstellt wurde. Um diesen Wert zu ermitteln, öffnen Sie das Navigationsmenü der Konsole, gehen Sie zu Administration, und klicken Sie auf Streaming. Wählen Sie den Streampool und auf der Seite, die geöffnet wird, die OCID kopieren.
- REGION: "us-ashburn-1". Ihre Region könnte anders sein.
- EVENT-NAME: Dies ist derselbe Ereignisname, den Sie zuvor bei der Registrierung der Callback-URL für den Empfang von Blockchain-Ereignissen verwendet haben.
Im folgenden Beispiel können Sie testen und prüfen, ob das System wie erwartet funktioniert.
import java.util.Properties;
import java.util.Arrays;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.ConsumerRecord;
public class Consumer {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.put("bootstrap.servers", "streaming.REGION.oci.oraclecloud.com:9092");
props.put("security.protocol", "SASL_SSL");
props.put("sasl.mechanism", "PLAIN");
props.put("sasl.jaas.config", "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"TENANCY-NAME/USER-NAME/STREAM-POOL-OCID\" password=\"AUTH-TOKEN\";");
props.put("group.id", "group-0");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
// Create a consumer and subscribe to it
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("EVENT-NAME"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s\n",
record.offset(), record.key(), record.value());
}
}
}
Wenn Sie den Consumer starten, werden alle vorhandenen Ereignisse verbraucht, die bereits in den Stream übertragen wurden.
Nachdem das Beispiel funktioniert und die Lösung funktioniert, können Sie eine oder mehrere Consumer-Apps auf Produktionsebene erstellen. Die Apps können in JavaScript, Python oder einer anderen Sprache geschrieben werden.