Introdução
Neste tutorial, vamos explorar como implementar valas de dados utilizando Apache Kafka e Apache NiFi para criar fluxos de dados em tempo real em aplicações modernas. Os dados são uma das principais riquezas de uma organização, e a capacidade de gerenciá-los e processá-los em tempo real é um diferencial competitivo. O Apache Kafka é uma plataforma robusta de mensagens que permite a transmissão de dados entre serviços de forma escalável e resiliente, enquanto o Apache NiFi é uma ferramenta poderosa para automação do fluxo de dados. Juntos, esses sistemas formam uma solução eficiente para a orquestração e manipulação de dados. Você aprenderá a configurar ambos, criar tópicos no Kafka, projetar fluxos no NiFi e integrar tudo isso em uma aplicação Java com Spring Boot, proporcionando uma experiência prática e completa.
Etapas
Configurando o Ambiente
Antes de começarmos, garanta que você possui o JDK e o Maven instalados em sua máquina. Além disso, você precisará baixar e configurar tanto o Apache Kafka quanto o Apache NiFi. Verifique as versões instaladas usando os comandos ‘java -version’ e ‘mvn -version’. Se você não os tem, consulte a documentação oficial.
commands# Verificar versões instaladas
java -version
mvn -versionInstalando e Configurando o Apache Kafka
Baixe a distribuição do Apache Kafka e descompacte o arquivo. Navegue até o diretório do Kafka e inicie o servidor Zookeeper e o Kafka. Use os seguintes comandos no terminal para iniciar os serviços.
commands# Iniciar o Zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
# Iniciar o Kafka
bin/kafka-server-start.sh config/server.propertiesCriando um Tópico no Kafka
Crie um tópico no Kafka que será utilizado para a troca de mensagens. Execute o seguinte comando para criar um tópico chamado ‘dados’.
commandsbin/kafka-topics.sh --create --topic dados --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
Instalando e Configurando o Apache NiFi
Baixe e instale o Apache NiFi. Após a instalação, você poderá iniciar o NiFi usando o comando no terminal. O NiFi fornece uma interface web que facilita a configuração de fluxos de dados.
commands# Iniciar o NiFi
bin/nifi.sh startCriando um Fluxo de Dados no NiFi
Após iniciar o NiFi, acesse a interface web (geralmente em http://localhost:8080ifi). Crie um novo fluxo que leia de um arquivo JSON e envie os dados para o tópico ‘dados’ do Kafka. Utilize os processadores ‘GetFile’ para ler os arquivos e ‘PublishKafka’ para enviar os dados.
configurationAdicione um processador 'GetFile' e configure o diretório onde estão os arquivos JSON. Conecte-o a um processador 'PublishKafka', configurando-o para enviar dados para o tópico 'dados'.
Configurando a Aplicação Java com Spring Boot
Crie um novo projeto Spring Boot utilizando o Spring Initializr. Adicione as dependências ‘Spring Web’ e ‘Spring Kafka’ no arquivo pom.xml.
pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>valas-de-dados</artifactId> <version>0.0.1-SNAPSHOT</version> <name>valas-de-dados</name> <description>Valas de Dados com Kafka e NiFi</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Configurando a Classe KafkaProducer
Crie uma classe KafkaProducer que será responsável por enviar mensagens para o tópico ‘dados’. Implemente a lógica de produção de mensagens nesta classe.
KafkaProducer.javapackage com.example.valasdados; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @Component public class KafkaProducer { private final KafkaTemplate<String, String> kafkaTemplate; public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) { this.kafkaTemplate = kafkaTemplate; } public void sendMessage(String message) { kafkaTemplate.send("dados", message); } }
Implementando o Controlador para Receber Dados
Crie um controlador no Spring Boot que irá expor um endpoint para receber dados e enviá-los para o Kafka usando o KafkaProducer.
DataController.javapackage com.example.valasdados; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class DataController { @Autowired private KafkaProducer kafkaProducer; @PostMapping("/send") public void sendData(@RequestBody String data) { kafkaProducer.sendMessage(data); } }
Implementando Testes Unitários
Implemente testes unitários para validar a funcionalidade do controlador e do produtor de Kafka. Utilize o JUnit e Mockito para isso.
DataControllerTest.javapackage com.example.valasdados; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @AutoConfigureMockMvc public class DataControllerTest { @Autowired private MockMvc mockMvc; @Autowired private KafkaProducer kafkaProducer; @Test public void testSendData() throws Exception { Mockito.doNothing().when(kafkaProducer).sendMessage(Mockito.anyString()); mockMvc.perform(MockMvcRequestBuilders.post("/send") .contentType(MediaType.APPLICATION_JSON) .content("{\"data\":\"teste\"}")) .andExpect(status().isOk()); } }
Executando a Aplicação e Testes
Use o Maven para compilar e executar a aplicação Spring Boot. Em seguida, utilize ferramentas como Postman ou cURL para testar os endpoints do Kafka e do controlador de dados.
commands# Compilar e executar a aplicação
mvn spring-boot:run
# Executar os testes unitários
mvn test
# Enviar dados para o controlador
curl -X POST -H 'Content-Type: application/json' -d '{"data":"Teste de dados"}' http://localhost:8080/send
Conclusão
Neste tutorial, você aprendeu a implementar valas de dados utilizando Apache Kafka e Apache NiFi. Mostramos desde a configuração de ambiente e dos serviços até a implementação de uma aplicação em Spring Boot que se integra a esses sistemas, permitindo o envio e recebimento de dados em tempo real. Ao final, você obteve conhecimento não apenas sobre a tecnologia, mas também sobre como orquestrar dados de forma eficiente dentro de uma arquitetura moderna.