Desenvolva e Implemente o Relay do Evento
Crie um aplicativo do Oracle Functions que consuma eventos de blockchain e os retransmita ao Oracle Streaming Service.
O aplicativo de retransmissão de eventos precisa de credenciais para estabelecer conexão com o serviço de streaming. As credenciais são mantidas no Oracle Cloud Infrastructure Vault. As credenciais são armazenadas no Vault quando você executa o código do Terraform. As credenciais são geradas quando você faz a configuração inicial do seu ambiente OCI.
A Função fornece os seguintes serviços:
- Recuperar credenciais do Serviço de Streaming do Vault.
- Descriptografar as credenciais (O Vault armazena valores criptografados).
- Decodificar da string codificada em base64.
- Use as credenciais decodificadas para estabelecer conexão com o Serviço de Streaming usando a API compatível com o Kafka.
- Crie e preencha um objeto Java chamado event na mensagem de evento JSON.
- Use a API do Kafka para enviar a mensagem de evento.
Criar o Relay do Evento
Você pode criar o retransmissão em qualquer linguagem de programação, mas, como as APIs Kafka são documentadas no Java, é melhor usar o Java.
A classe EventProducer terá os seguintes métodos:
@FnConfiguration
public void config(RuntimeContext ctx) { ... }
private String decryptData(String cipherText) { ... }
public String handleRequest(Event event) { ... }
As seguintes dependências também são necessárias no arquivo 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>
.
.
.
Certifique-se de ter a ferramenta CLI fn instalada. Consulte https://github.com/fnproject/fn#quickstart para obter mais informações.
Crie o Relay do Evento
Antes de enviar uma imagem, você deve primeiro usar o comando docker tag
para criar uma cópia da imagem de origem local como uma nova imagem (a nova imagem é, na verdade, apenas uma referência para a imagem de origem existente). Como um nome para a nova imagem, especifique o caminho totalmente qualificado para o local de destino no Oracle Cloud Infrastructure Registry onde deseja enviar a imagem.
Você precisa das seguintes informações para a tag:
- O ponto final do registro do Docker da sua região
- Seu namespace do serviço Object Storage
Para obter o ponto final da sua região, procure sua região na tabela em Disponibilidade por Região. Por exemplo, o ponto final do registro para Leste dos EUA (Ashburn) é https://iad.ocir.io
.
Para localizar seu namespace do serviço Object Storage:
- No menu de navegação, clique em Administração e, em seguida, clique em Detalhes da Tenancy.
- O Namespace de Armazenamento de Obseto está na seção Definições de Armazenamento de Objetos
Enviar o Relay do Evento para o Registro
Depois que o retransmissão de eventos for criado e tiver a tag adequada, você poderá enviá-la para o Oracle Cloud Infrastructure Registry.
- Ponto final da API para sua região: Por exemplo,
iad.ocir.io
. É o mesmo valor que você usou anteriormente para marcar a imagem do Docker. - Namespace da Tenancy: a string de namespace do Object Storage gerada automaticamente de sua tenancy (conforme mostrado na página Informações da Tenancy).
- Nome do Usuário: Seu nome de usuário no Oracle Cloud Infrastructure.
- Token de Autenticação: o token criado anteriormente na seção Plano.
Criar uma Chave de API
Gere um par de chaves e faça upload da chave pública para o perfil de usuário do Oracle Cloud Infrastructure.
Você pode fazer isso de duas maneiras, mas aqui usaremos o Cloud Shell porque você pode fazer upload seguro da chave gerada diretamente para sua conta.
Aplicar a Configuração do Terraform
Faça download da configuração do Terraform no repositório do GitHub, atualize o arquivo de variáveis do Terraform e aplique a configuração.
terraform.tvars
.
- Região - o Identificador da Região da região. Você pode extrair isso do URL da Console do Oracle Cloud Infrastructure. Por exemplo, se o URL for
https://console.us-ashburn-1.oraclecloud.com/compute/instances
, o Identificador de Região será us-ashburn-1. Se o URL forhttps://cloud.oracle.com/compute/instances
, você precisará pesquisar o Identificador da Região em https://docs.oracle.com/iaas/Content/General/Concepts/regions.htm - OCID do Compartimento - o OCID do compartimento que contém os recursos do projeto. Se você seguiu as instruções na seção Plano, precisará do OCID do compartimento OBP_Events.
- Impressão Digital - a impressão digital da Chave de API pública que você gerou e fez upload para seu perfil anteriormente.
- Chave privada - o caminho completo e o nome do arquivo da Chave de API privada que você gerou anteriormente. Por exemplo,
/home/opc/oci_api_key.pem
. Não use~
no caminho. - OCID do Usuário - Você pode obter isso na página Detalhes do Usuário. Abra o menu da Console, vá para Identidade e clique em Usuários. Clique em seu nome de usuário na lista.
- OCID da Tenancy - Você pode obter isso na página Detalhes da Tenancy. Abra o menu Console, vá para Administração e clique em Detalhes da Tenancy.
Quando você tiver as informações, faça download e aplique a configuração do Terraform.
Assinar Eventos do Blockchain
Registre um URL de callback para que o API Gateway possa receber eventos de blockchain.
https://joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com/obpevents/callback
. Você também precisará do ponto final de implantação do API Gateway, que foi exibido como use_to_extract_ssl_certificate quando o processo do Terraform for concluído. É no formato joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com:443
Você também precisa do ponto final da API REST do Oracle Blockchain Platform para assinar eventos de chaincode. Ele tem o seguinte formato:
https://<rest_server_url:port/restproxy#>/bcsgw/rest/v1/event/subscribe
<rest_server_url:port/restproxy#>
é o URL do proxy REST que é listado na console do Oracle Blockchain Platform. Na console, abra a página Nós e procure o nó proxy REST. Na coluna Rota, um URL, incluindo porta e um número de proxy REST, é listado.
Para assinar eventos de blockchain:
Criar e Testar o Consumidor de Eventos
O consumidor de eventos usa APIs Kafka para autenticar e recuperar mensagens de blockchain do Streaming do Oracle Cloud Infrastructure.
Para criar um consumidor, você precisa de informações para as seguintes Strings:
- USER-NAME: Seu nome de usuário.
- AUTH-TOKEN: Este é o token gerado e copiado anteriormente.
- TENANCY-NAME: Você pode encontrar esse valor na página Detalhes da Tenancy da console do OCI. Para abrir a página Detalhes da Tenancy, no menu de navegação da Console, selecione Administração e clique em Detalhes da Tenancy.
- STREAM-POOL-OCID: Este é o OCID do pool de fluxos que foi criado quando você executou o script Terraform. Para localizar esse valor, abra o menu de navegação da Console e vá para Administração e clique em Streaming. Selecione o pool de fluxos e na página que abre a cópia do OCID.
- REGION: "us-ashburn-1". Sua região pode ser diferente.
- EVENT-NAME: Este é o mesmo nome de evento usado anteriormente quando você registrou o URL de callback para receber eventos de blockchain.
Use o exemplo a seguir para testar e validar se o sistema está funcionando conforme o esperado.
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());
}
}
}
Quando você inicia o consumidor, ele consome todos os eventos existentes que já foram enviados para o fluxo.
Depois que o exemplo estiver funcionando e demonstrar que a solução funciona, você está pronto para criar um ou mais aplicativos de consumidor de nível de produção. Os aplicativos podem ser criados em JavaScript, Python ou outra linguagem.