Développer et déployer le relais d'événement
Créez une application Oracle Functions qui consomme des événements de chaîne de blocs et les relaie dans Oracle Streaming Service.
L'application de relais d'événements a besoin d'informations d'identification pour se connecter au service de transmission en continu. Les informations d'identification sont conservées dans Oracle Cloud Infrastructure Vault. Les informations d'identification sont stockées dans Vault lorsque vous exécutez le code Terraform. Les informations d'identification sont générées lorsque vous effectuez la configuration initiale de votre environnement OCI.
La fonction fournit les services suivants :
- Extrayez les informations d'identification du service Streaming à partir de Vault.
- Déchiffrez les informations d'identification (Vault stocke les valeurs cryptées).
- Décoder à partir de la chaîne encodée base64.
- Utilisez les informations d'identification décodées pour vous connecter au service Streaming à l'aide de l'API compatible Kafka.
- Créez et remplissez un objet Java appelé event à partir du message d'événement JSON.
- Utilisez l'API Kafka pour envoyer le message d'événement.
Créer le relais d'événement
Vous pouvez créer le relais dans n'importe quel langage de programmation, mais comme les API Kafka sont documentées dans Java, il est préférable d'utiliser Java.
La classe EventProducer aura les méthodes suivantes :
@FnConfiguration
public void config(RuntimeContext ctx) { ... }
private String decryptData(String cipherText) { ... }
public String handleRequest(Event event) { ... }Les dépendances suivantes sont également nécessaires dans le fichier pom.xml :
<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>
.
.
.
Assurez-vous que l'outil CLI fn est installé. Pour plus d'informations, reportez-vous à https://github.com/fnproject/fn#quickstart.
Créer le relais d'événement
Pour pouvoir propager une image, vous devez d'abord utiliser la commande docker tag afin de créer une copie de l'image source locale en tant que nouvelle image (la nouvelle image est en fait simplement une référence à l'image source existante). En tant que nom de la nouvelle image, indiquez le chemin qualifié complet de l'emplacement cible dans Oracle Cloud Infrastructure Registry vers lequel propager l'image.
Pour la balise, vous devez disposer des informations suivantes :
- Adresse de registre Docker pour votre région
- Votre espace de noms Object Storage
Pour obtenir l'adresse de votre région, recherchez la région dans la table Disponibilité par région. Par exemple, l'adresse de registre pour Est des Etats-Unis (Ashburn) est https://iad.ocir.io.
Pour trouver votre espace de noms Object Storage, procédez comme suit :
- Dans le menu de navigation, cliquez sur Administration, puis sur Informations sur la location.
- L'espace de noms Obect Storage figure dans la section Paramètres Object Storage
Transmettre le relais d'événement au registre
Une fois le relais d'événement créé et doté de la balise appropriée, vous pouvez le propager vers Oracle Cloud Infrastructure Registry.
- Adresse d'API pour votre région : par exemple,
iad.ocir.io. Il s'agit de la même valeur que celle que vous avez utilisée précédemment pour baliser l'image Docker. - Espace de noms de location : chaîne d'espace de noms Object Storage générée automatiquement pour votre location (comme indiqué sur la page Informations sur la location).
- Nom utilisateur : nom utilisateur dans Oracle Cloud Infrastructure.
- Jeton d'authentification : jeton que vous avez créé précédemment dans la section Plan.
Création d'une clé d'API
Générez une paire de clés et téléchargez la clé publique vers votre profil utilisateur Oracle Cloud Infrastructure.
Vous pouvez effectuer cette opération de deux façons, mais ici, nous allons utiliser Cloud Shell car vous pouvez télécharger la clé générée directement sur votre compte en toute sécurité.
Application de la configuration Terraform
Téléchargez la configuration Terraform à partir du référentiel GitHub, mettez à jour le fichier de variables Terraform, puis appliquez la configuration.
terraform.tvars.
- Région : identificateur de région. Vous pouvez l'extraire à partir de l'URL de la console Oracle Cloud Infrastructure. Par exemple, si l'URL est
https://console.us-ashburn-1.oraclecloud.com/compute/instances, l'identificateur de votre région est us-ashburn-1. Si votre URL esthttps://cloud.oracle.com/compute/instances, vous devez rechercher votre identifiant de région dans https://docs.oracle.com/iaas/Content/General/Concepts/regions.htm. - OCID de compartiment : OCID du compartiment contenant les ressources du projet. Si vous avez suivi les instructions de la section Plan, vous avez besoin de l'OCID pour le compartiment OBP_Events.
- Empreinte - empreinte de la clé d'API publique que vous avez générée et téléchargée précédemment dans votre profil.
- Clé privée : chemin complet et nom de fichier de la clé d'API privée que vous avez générée précédemment. Par exemple,
/home/opc/oci_api_key.pem. N'utilisez pas~dans le chemin. - OCID utilisateur : vous pouvez l'obtenir à partir de la page Détails de l'utilisateur. Ouvrez le menu de la console, accédez à Identité et cliquez sur Utilisateurs. Cliquez sur votre nom utilisateur dans la liste.
- OCID de location : vous pouvez l'obtenir à partir de la page Détails de location. Ouvrez le menu de la console, accédez à Administration et cliquez sur Détails de location.
Lorsque vous disposez des informations, téléchargez et appliquez la configuration Terraform.
S’abonner aux événements Blockchain
Enregistrez une URL de rappel afin qu'API Gateway puisse recevoir des événements de chaîne de blocs.
https://joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com/obpevents/callback. Vous aurez également besoin de l'adresse de déploiement de passerelle d'API, affichée sous la forme use_to_extract_ssl_certificate lorsque le processus Terraform sera terminé. Elle se présente sous la forme joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com:443Vous avez également besoin de l'adresse d'API REST Oracle Blockchain Platform pour vous abonner à des événements de code chaîne. Il se présente comme suit :
https://<rest_server_url:port/restproxy#>/bcsgw/rest/v1/event/subscribe<rest_server_url:port/restproxy#> est l'URL du proxy REST répertoriée dans la console Oracle Blockchain Platform. Dans la console, ouvrez la page Noeuds et recherchez le noeud proxy REST. Dans la colonne Route, une URL incluant le port et un numéro de proxy REST est répertoriée.
Pour vous abonner aux événements blockchain :
Création et test du consommateur d'événements
Le consommateur d'événements utilise des API Kafka pour authentifier et extraire des messages de chaîne de blocs à partir d'Oracle Cloud Infrastructure Streaming.
Pour créer un destinataire, vous devez fournir des informations sur les chaînes suivantes :
- USER-NAME : nom utilisateur.
- AUTH-TOKEN : jeton que vous avez généré et copié précédemment.
- TENANCY-NAME : Cette valeur est disponible sur la page Détails de location de la console OCI. Pour ouvrir la page Détails de location, dans le menu de navigation de la console, sélectionnez Administration, puis cliquez sur Détails de location.
- STREAM-POOL-OCID : OCID du pool de flux de données créé lors de l'exécution du script Terraform. Pour trouver cette valeur, ouvrez le menu de navigation de la console, accédez à Administration et cliquez sur Traitement en continu. Sélectionnez le pool de flux de données et, sur la page qui s'ouvre, copiez l'OCID.
- REGION : "us-ashburn-1". Votre région peut être différente.
- EVENT-NAME : Il s'agit du même nom d'événement que celui que vous avez utilisé précédemment lorsque vous avez inscrit l'URL de rappel pour recevoir des événements de chaîne de blocs.
Utilisez l'exemple suivant pour tester et valider le fonctionnement attendu du système.
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());
}
}
}Lorsque vous démarrez le consommateur, il consomme tous les événements existants qui ont déjà été propagés dans le flux.
Une fois que l'exemple fonctionne et montre que la solution fonctionne, vous êtes prêt à créer une ou plusieurs applications de consommation au niveau de la production. Les applications peuvent être écrites en JavaScript, Python ou dans un autre langage.