Use o Spring Kafka para acessar um serviço do Event Streams

5 min de leitura
Patrocinado
Imagem de: Use o Spring Kafka para acessar um serviço do Event Streams
Avatar do autor

Equipe TecMundo

@tec_mundo

Por: William Korando e Ozzy Osborne.

Publicado em: 15 de maio de 2019.

Objetivos de aprendizado

O IBM Event Streams é um barramento de mensagens escalável e de alto rendimento que oferece uma interface Apache Kafka. O Spring Boot fornece um cliente Kafka, facilitando a comunicação com o Event Streams para aplicativos Spring. Neste tutorial, aprenda como utilizar o Spring Kafka para acessar um serviço IBM Event Streams na IBM Cloud.

Você executará as seguintes etapas:

  • Criar uma instância do Event Streams na IBM Cloud

  • Configurar um aplicativo Spring Boot para se comunicar com a instância do Event Streams

  • Criar uma API RESTful para enviar e receber mensagens

Pré-requisitos

Para acompanhar este tutorial, você precisará de:

Tempo estimado

Este tutorial levará aproximadamente 30 minutos para ser concluído.

Crie um aplicativo Spring Boot usando o Spring Initializr

  • 1. Usando o Spring Initializr, crie um projeto com dependências de Webe Kafka. Para este exemplo, usamos o grupo com.ibm.developer e o artefato event-streams-kafka.

Spring InitializrSpring Initializr

  • 2. Faça o download do projeto.
  • 3. Descompacte o projeto.
  • 4. Abra o projeto no IDE que preferir.

Crie uma instância do Event Streams na IBM Cloud

  • 1. Navegue para o IBM Cloud Catalog.
  • 2. Selecione Event Streams.
  • 3. Clique em Criar para criar uma instância de serviço – para este tutorial, o plano lite deve ser suficiente. Instruções detalhadas sobre a escolha de um plano podem ser encontradas aqui.
  • 4. Clique no botão + (Adicionar) para criar um tópico.
  • 5. Para este projeto, nomeie o tópico como spring e aceite os padrões.

Criação de tópico
Criação de tópico

  • 6. Use a guia Credenciais de Serviço no lado esquerdo da tela para criar um novo conjunto de credenciais que serão usadas pelo seu aplicativo para acessar o serviço. Depois que as credenciais forem criadas, observe os valores para os campos de usuário e senha, juntamente com os servidores listados na seção kafka_brokers_sasl.

Configure o Spring Boot para conversar com o Event Streams

A configuração de um aplicativo Spring Boot para conversar com um serviço Kafka geralmente pode ser realizada com as propriedades do Spring Boot em um arquivo application.properties ou application.yml. Vamos apresentar as propriedades necessárias para conectar nosso aplicativo Spring Boot a uma instância do Event Streams na IBM Cloud. As propriedades usadas neste exemplo são apenas um subconjunto das propriedades disponíveis.

No projeto que criamos anteriormente em /src/main/resources, abra application.properties e adicione as seguintes propriedades, usando o nome de usuário e a senha que você gerou na etapa anterior:

#Connection

spring.kafka.jaas.enabled=true

spring.kafka.jaas.login-module=org.apache.kafka.common.security.plain.PlainLoginModule

spring.kafka.jaas.options.username=

spring.kafka.jaas.options.password=

spring.kafka.bootstrap-servers=

spring.kafka.properties.security.protocol=SASL_SSL

spring.kafka.properties.sasl.mechanism=PLAIN

 

#Producer

spring.kafka.template.default-topic=spring

spring.kafka.producer.client-id=event-streams-kafka

spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer

spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer

 

#Consumer

listener.topic=spring

spring.kafka.consumer.group-id=foo

spring.kafka.consumer.auto-offset-reset=earliest

spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer

spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer

Em application.properties, as propriedades de configuração foram separadas em três grupos:

1. O primeiro grupo, chamado Conexão, são propriedades dedicadas à configuração da conexão com a instância do fluxo de eventos. Embora neste exemplo apenas um servidor esteja definido, o spring.kafka.bootstrap-servers pode obter uma lista separada por vírgula de URLs do servidor. Observe que a URL do servidor acima é us-south, que pode não ser a região correta para o seu aplicativo.

2. O segundo grupo, chamado Produtor, são propriedades que definem o envio de mensagens para o Kafka.

  • spring.kafka.template.default-topic define o tópico para o qual iremos escrever (neste caso, o tópico que criamos na etapa anterior – spring). O tópico para o qual escrever também pode ser definido programaticamente, o que será mostrado na próxima etapa. 

  • spring.kafka.producer.client-id é usado para fins de registro, para que um nome lógico possa ser fornecido além da porta e do endereço IP. 

  • spring.kafka.producer.key-serializer e spring.kafka.producer.value-serializer definem o tipo e a classe de Java para serializar a chave e o valor da mensagem que está sendo enviada ao fluxo Kafka.

3. O terceiro e último grupo é o Consumidor, o qual define a leitura de mensagens do Kafka. 

  • listener.topic não é uma propriedade definida pelo Spring, mas será utilizada na próxima etapa. 

  • spring.kafka.consumer.group-id define o grupo do qual o consumidor será membro

  • spring.kafka.consumer.auto-offset-reset informa ao consumidor em qual deslocamento iniciar a leitura de mensagens no fluxo, caso um deslocamento não esteja inicialmente disponível.

  • Assim como com o produtor, também precisamos definir o(s) tipo(s) para a chave e o valor da mensagem e como desserializá-los, o que é feito com as propriedades spring.kafka.consumer.key-deserializer espring.kafka.consumer.value-deserializer.

A descrição acima trata de um exemplo muito básico de como se conectar a uma instância do Event Stream e configurar um produtor e consumidor Kafka. Verifique os seguintes guias para obter informações mais avançadas sobre como configurar o seu aplicativo:

Nota: O Spring Kafka utiliza o padrão String como o tipo de chave e valor ao construir um KafkaTemplate, o qual usaremos na próxima etapa. A rigor, não precisamos definir valores como spring.kafka.consumer.key-deserializer ou spring.kafka.producer.key-serializer em nossas application.properties. No entanto, como String geralmente não é suficiente, as propriedades foram mostradas acima como um exemplo de como definir o tipo de (des)serialização de chave/valor de mensagens Kafka.

Defina o controlador

No pacote com.ibm.developer.eventstreamskafka, crie uma nova classe chamada EventStreamsController. Utilizaremos este controlador para enviar e ler mensagens do tópico que foi criado anteriormente, no conforto do nosso navegador! A classe finalizada deve ficar assim:

@RestController

public class EventStreamsController {

    private KafkaTemplate template;

    private List messages = new CopyOnWriteArrayList<>();

 

    public EventStreamsController(KafkaTemplate template) {

        this.template = template;

    }

 

    @KafkaListener(topics = "${listener.topic}")

    public void listen(ConsumerRecord cr) throws Exception {

        messages.add(cr.value());

    }

 

    @GetMapping(value = "send/{msg}")

    public void send(@PathVariable String msg) throws Exception {

        template.sendDefault(msg);

    }

 

    @GetMapping("received")

    public String recv() throws Exception {

        String result = messages.toString();

        messages.clear();

        return result;

    }

}

Vamos verificar o que está acontecendo nesta classe:                       

public EventStreamsController(KafkaTemplate template) {

    this.template = template;

}

                                                                                    

O suporte ao cliente do Spring Kafka é baseado em um KafkaTemplate. Utilizando a configuração da etapa anterior, um KafkaTemplate foi adicionado ao contexto do aplicativo. Como o EventStreamsController é um bean gerenciado pelo Spring definido com um único construtor, o contêiner do Spring fornecerá automaticamente o KafkaTemplate.

@KafkaListener(topics = "${listener.topic}")

public void listen(ConsumerRecord cr) throws Exception {

    messages.add(cr.value());

}

                                                                                                                          

Aqui estamos configurando um KafkaListener (javadoc). OKafkaListener fará a verificação e lerá as mensagens que foram gravadas no tópico em que foi definido. ${listener.topic} faz referência à propriedade que definimos em application.properties da etapa anterior, que é configurada como spring.

@GetMapping(value = "send/{msg}")

public void send(@PathVariable String msg) throws Exception {

    template.sendDefault(msg);

}

                                                                                                                                          

Este método está definindo o endpoint GET/send/{msg}, que está sendo usado para enviar uma mensagem ao Kafka. No corpo do método, que estamos chamando de template.sendDefault(msg), alternativamente, o tópico para o qual a mensagem está sendo enviada pode ser definido de maneira programática ao ser chamado de template.send(String topic, T data).

@GetMapping("received")

public String recv() throws Exception {

    String result = messages.toString();

    messages.clear();

    return result;

}

                                                                                                                                                   

Por fim, estamos definindo um segundo endpoint GET chamadoreceived para ler as mensagens que o KafkaListener leu do tópico spring.

Crie o aplicativo e execute os endpoints REST

Crie e execute seu aplicativo com o seguinte comando:

mvn spring-boot:run                                                                                                                                                                               

Agora você pode executar o terminal REST para envio, http://localhost: 8080/send/Hello. Esse comando enviará a mensagem Hello utilizando o KafkaTemplate para o Event Streams.

Após enviar uma mensagem, você pode executar o endpoint REST para recebimento, http://localhost:8080/received. Você deve ver a resposta do endpoint com o conteúdo da mensagem que foi enviada.

Sumário

O suporte ao Spring Kafka facilita o envio e o recebimento de mensagens para o Event Streams utilizando as APIs do KafkaTemplate e do KafkaListener do Spring, com a configuração do Spring.

O código utilizado neste artigo pode ser encontrado no GitHub.

...

Quer ler mais conteúdo especializado de programação? Conheça a IBM Blue Profile e tenha acesso a matérias exclusivas, novas jornadas de conhecimento e testes personalizados. Confira agora mesmo, consiga as badges e dê um upgrade na sua carreira!

Use o Spring Kafka para acessar um serviço do Event Streams