Desarrollo y despliegue de la transmisión de eventos
Cree una aplicación de Oracle Functions que consuma eventos de cadena de bloques y los transmita a Oracle Streaming Service.
La aplicación de retransmisión de eventos necesita credenciales para conectarse al servicio de transmisión. Las credenciales se mantienen en Oracle Cloud Infrastructure Vault. Las credenciales se almacenan en Vault al ejecutar el código de Terraform. Las credenciales se generan cuando se realiza la configuración inicial del entorno de OCI.
La función proporciona los siguientes servicios:
- Recupere las credenciales del servicio de flujo de Vault.
- Descifrar las credenciales (el almacén almacena valores cifrados).
- Desechar de cadena codificada en base64.
- Utilice las credenciales descodificadas para conectarse al servicio Streaming mediante una API compatible con Kafka.
- Cree y rellene un objeto Java denominado event desde el mensaje de evento de JSON.
- Utilice la API de Kafka para enviar el mensaje de evento.
Crear Relé de Eventos
Puede crear la transmisión en cualquier lenguaje de programación, pero como las API de Kafka están documentadas en Java, es mejor utilizar Java.
La clase EventProducer tendrá los siguientes métodos:
@FnConfiguration
public void config(RuntimeContext ctx) { ... }
private String decryptData(String cipherText) { ... }
public String handleRequest(Event event) { ... }
Las siguientes dependencias también son necesarias en el archivo 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>
.
.
.
Asegúrese de tener instalada la herramienta de CLI de fn. Consulte https://github.com/fnproject/fn#quickstart para obtener más información.
Crear Relé de Eventos
Antes de poder transferir una imagen, debe utilizar el comando docker tag
para crear una copia de la imagen de origen local como una nueva imagen (la nueva imagen es realmente solo una referencia a la imagen de origen existente). Como nombre de la nueva imagen, especifique la ruta de acceso totalmente cualificada a la ubicación de destino en Oracle Cloud Infrastructure Registry en la que desea transferir la imagen.
Necesita la siguiente información para la etiqueta:
- El punto final del registro de Docker para su región
- Su espacio de nombres de Object Storage
Para obtener el punto final de su región, consulte su región en la tabla de Disponibilidad por región. Por ejemplo, el punto final de registro para Este de EE. UU. (Ashburn) es https://iad.ocir.io
.
Para buscar el espacio de nombres de Object Storage:
- En el menú de navegación, haga clic en Administración y, a continuación, en Detalles de arrendamiento.
- El espacio de nombres de almacenamiento de objetos está en la sección Object Storage Settings.
Enviar Relé de Evento al Registro
Una vez creada la retransmisión del evento y con la etiqueta adecuada, puede enviarla a Oracle Cloud Infrastructure Registry.
- Punto final de API para su región: por ejemplo,
iad.ocir.io
. Es el mismo valor que utilizó anteriormente para etiquetar la imagen de Docker. - Espacio de nombres de arrendamiento: cadena de espacio de nombres de almacenamiento de objetos generada automáticamente de su arrendamiento (como se muestra en la página Información de arrendamiento).
- Nombre de usuario: su nombre de usuario en Oracle Cloud Infrastructure.
- Token de autenticación: token que creó anteriormente en la sección Plan.
Crear una clave de API
Genere un par de claves y cargue la clave pública en su perfil de usuario de Oracle Cloud Infrastructure.
Puede hacerlo de dos formas, pero aquí usaremos Cloud Shell porque puede cargar de forma segura la clave generada directamente en su cuenta.
Aplicación de la configuración de Terraform
Descargue la configuración de Terraform desde el repositorio de GitHub, actualice el archivo de variables de Terraform y, a continuación, aplique la configuración.
terraform.tvars
.
- Región: el identificador de región de la región. Puede extraer esto de la URL de la consola de Oracle Cloud Infrastructure. Por ejemplo, si la URL es
https://console.us-ashburn-1.oraclecloud.com/compute/instances
, el identificador de región es us-ashburn-1. Si la URL eshttps://cloud.oracle.com/compute/instances
, debe buscar el identificador de región en https://docs.oracle.com/iaas/Content/General/Concepts/regions.htm. - OCID de compartimento: el OCID del compartimento que contiene los recursos del proyecto. Si ha seguido las instrucciones de la sección Plan, necesita el OCID para el compartimento OBP_Events.
- Huella: huella de la clave de API pública que ha generado y cargado en el perfil anteriormente.
- Clave privada: la ruta completa y el nombre de archivo de la clave de API privada que ha generado anteriormente. Por ejemplo,
/home/opc/oci_api_key.pem
. No utilice~
en la ruta de acceso. - OCID de usuario: puede obtenerlo de la página Detalles de usuario. Abra el menú de la consola, vaya a Identidad y haga clic en Usuarios. Haga clic en su nombre de usuario en la lista.
- OCID de arrendamiento: puede obtenerlo de la página Detalles de arrendamiento. Abra el menú de la consola, vaya a Administración y haga clic en Detalles de arrendamiento.
Cuando tenga la información, descargue y aplique la configuración de Terraform.
Suscribirse a eventos de cadena de bloques
Registre una URL de devolución de llamada para que el gateway de API pueda recibir eventos de cadena de bloques.
https://joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com/obpevents/callback
. También necesitará el punto final de despliegue de gateway de API, que se mostró como use_to_extract_ssl_certificate cuando se completó el proceso de Terraform. Tiene el formato joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com:443
También necesita el punto final de la API de REST de Oracle Blockchain Platform para suscribirse a eventos de chaincode. Tiene el siguiente formato:
https://<rest_server_url:port/restproxy#>/bcsgw/rest/v1/event/subscribe
<rest_server_url:port/restproxy#>
es la URL del proxy REST que se muestra en la consola de Oracle Blockchain Platform. En la consola, abra la página Nodes y busque el nodo de proxy REST. En la columna Ruta, se muestra una URL que incluye el puerto y un número de proxy REST.
Para suscribirse a eventos de cadena de bloques:
Creación y Prueba del Consumidor de Eventos
El consumidor de eventos utiliza API de Kafka para autenticar y recuperar mensajes de cadena de bloques de la transmisión de Oracle Cloud Infrastructure.
Para crear un consumidor, necesita información para las siguientes cadenas:
- USER-NAME: nombre de usuario.
- AUTH-TOKEN: es el token que ha generado y copiado anteriormente.
- TENANCY-NAME: puede encontrar este valor en la página Detalles de arrendamiento de la consola de OCI. Para abrir la página Detalles de arrendamiento, en el menú de navegación de la consola, seleccione Administración y, a continuación, haga clic en Detalles de arrendamiento.
- STREAM-POOL-OCID: es el OCID del pool de flujos creado al ejecutar el script de Terraform. Para buscar este valor, abra el menú de navegación de la consola y vaya a Administración y haga clic en Flujo. Seleccione el pool de flujos y en la página que abre copie el OCID.
- REGION: "us-ashburn-1". Su región puede ser diferente.
- EVENT-NAME: es el mismo nombre de evento que utilizó anteriormente al registrar la URL de devolución de llamada para recibir eventos de cadena de bloques.
Utilice el siguiente ejemplo para probar y validar que el sistema funciona como se esperaba.
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());
}
}
}
Al iniciar el consumidor, consume todos los eventos existentes que ya se han introducido en el flujo.
Después de que el ejemplo funcione y demuestre que la solución funciona, está listo para crear una o más aplicaciones de consumidor a nivel de producción. Las aplicaciones se pueden escribir en JavaScript, Python u otro lenguaje.