Google Cloud Pub/Sub é um serviço de mensagens assíncronas e distribuídas fornecido pelo Google Cloud Platform (GCP), projetado para trocar mensagens entre aplicativos.
Integrar o Spring Boot com o Google Cloud Pub/Sub oferece uma maneira eficiente e escalável de trocar mensagens entre diferentes componentes de um sistema distribuído.
Isso permite a comunicação assíncrona entre partes do sistema, o que é fundamental para aplicativos modernos que precisam lidar com grandes volumes de dados ou processamento distribuído.
Integração Google Cloud Pub/Sub com Spring Boot
A integração entre o Spring Boot e o Google Cloud Pub/Sub geralmente envolve o uso da biblioteca cliente do Pub/Sub fornecida pelo Google Cloud. Esta biblioteca oferece as ferramentas necessárias para se conectar e interagir com os tópicos (topics) e inscrições (subscriptions) do Pub/Sub.
Alguns passos comuns para integrar o Spring Boot com o Google Cloud Pub/Sub incluem:
Configuração do Projeto no Google Cloud Platform:
- Criar um Projeto: Você precisará de um projeto no Google Cloud Platform para usar o serviço Pub/Sub.
- Ativar a API do Pub/Sub: Certifique-se de ativar a API do Google Cloud Pub/Sub para o seu projeto.
- Configurar Credenciais: Para que o Spring Boot acesse o Google Cloud Pub/Sub, você precisará de credenciais de autenticação, geralmente configuradas como um arquivo JSON.
Configuração no Spring Boot:
Adicionar Dependências: No arquivo pom.xml se estiver usando Maven) ou build.gradle (se estiver usando Gradle), inclua as dependências necessárias para o Google Cloud Pub/Sub e o Spring Boot Starter:
Exemplo (Maven):
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-gcp-starter-pubsub</artifactId> </dependency>
Configurar Propriedades do GCP: No arquivo application.properties ou application.yml, adicione as configurações do Google Cloud Pub/Sub, como credenciais, ID do projeto etc.
Exemplo (application.properties):
spring.cloud.gcp.project-id= id-projeto spring.cloud.gcp.credentials.location=file:/caminho/para/seu/arquivo-de-credenciais.json
Uso no Código Spring Boot:
- Criar um Publisher: Utilize a biblioteca cliente do Google Cloud Pub/Sub para criar um Publisher e publicar mensagens em um tópico.
- Criar um Subscriber: Crie um Subscriber para consumir mensagens de um tópico específico ou inscrição.
- Definir Handlers: No Spring Boot, defina handlers (manipuladores) para processar as mensagens recebidas e realizar a lógica.
Vamos criar uma classe Subscriber para consumir mensagens de um tópico específico.
Subscriber para Consumir Mensagens do Google Cloud Pub/Sub
package br.com.virandoprogramador.pubsub import com.google.cloud.spring.pubsub.core.PubSubTemplate; import com.google.cloud.spring.pubsub.integration.inbound.PubSubInboundChannelAdapter; import com.google.cloud.spring.pubsub.support.converter.ConvertedAcknowledgeablePubsubMessage; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.channel.DirectChannel; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; @Configuration public class PubSubSubscriberConfig { @Value("${pubsub.subscription-name}") private String subscriptionName; @Bean public MessageChannel pubSubInputChannel() { return new DirectChannel(); } @Bean public PubSubInboundChannelAdapter messageChannelAdapter( PubSubTemplate pubSubTemplate, MessageChannel pubSubInputChannel) { PubSubInboundChannelAdapter adapter = new PubSubInboundChannelAdapter(pubSubTemplate, subscriptionName); adapter.setOutputChannel(pubSubInputChannel); return adapter; } @Bean @ServiceActivator(inputChannel = "pubSubInputChannel") public MessageHandler messageReceiver() { return message -> { System.out.println("Mensagem recebida: " + message.getPayload()); ConvertedAcknowledgeablePubsubMessage originalMessage = (ConvertedAcknowledgeablePubsubMessage) message; originalMessage.ack(); }; } }
Esta classe de configuração PubSubSubscriberConfig configura um PubSubInboundChannelAdapter que escuta um tópico específico e envia as mensagens para o canal pubSubInputChannel. Em seguida, um ServiceActivator é configurado para processar as mensagens recebidas pelo canal.
Atualizando a Classe Principal
Vamos atualizar a classe principal (PubSubApplication) para iniciar o Subscriber juntamente com o Publisher:
package br.com.virandoprogramador.pubsub import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.gcp.core.GcpProjectIdProvider; @SpringBootApplication public class PubSubApplication implements CommandLineRunner { private final PubSubPublisher pubSubPublisher; private final GcpProjectIdProvider projectIdProvider; @Autowired public PubSubApplication(PubSubPublisher pubSubPublisher, GcpProjectIdProvider projectIdProvider) { this.pubSubPublisher = pubSubPublisher; this.projectIdProvider = projectIdProvider; } public static void main(String[] args) { SpringApplication.run(PubSubApplication.class, args); } @Override public void run(String... args) { String topicName = "topico-virando-programador"; String message = "msg para o tópico"; pubSubPublisher.publishMessage(topicName, message); } }
Observações Importantes
- No arquivo application.properties, certifique-se de adicionar a propriedade pubsub.subscription-name com o nome da inscrição que será ouvida pelo Subscriber.
- Esta configuração pressupõe que o arquivo de credenciais para o GCP esteja configurado corretamente.
- Não se esqueça de adicionar as dependências necessárias ao seu arquivo pom.xml ou build.gradle, incluindo a dependência para a integração Spring Cloud GCP Pub/Sub.
Funcionamento do Google Cloud Pub/Sub:
- Modelo de Mensagens: O Pub/Sub opera com um modelo de publicação e assinatura. Neste modelo, os aplicativos publicam mensagens em tópicos e recebem mensagens desses tópicos através de inscrições.
- Tópicos e Inscrições: Um tópico é um canal de mensagens onde os dados são publicados. As inscrições são pontos de extremidade que os aplicativos usam para receber mensagens de um tópico específico.
- Assincronismo e Escalabilidade: O serviço é altamente assíncrono e pode lidar com altos volumes de mensagens distribuídas. Ele oferece escalabilidade automática para lidar com picos de carga sem comprometer o desempenho.
- Durabilidade e Confiabilidade: As mensagens são armazenadas de forma durável e mantidas até que sejam confirmadas como entregues. Isso garante a confiabilidade na entrega, mesmo em condições de falha.
- Tempo Real e Latência Baixa: O Pub/Sub fornece baixa latência, permitindo a comunicação em tempo real entre aplicativos distribuídos em diferentes localidades geográficas.
Casos de Uso Comuns do Google Cloud Pub/Sub:
- Integração de Sistemas: É usado para integrar sistemas e aplicativos distribuídos, permitindo a comunicação assíncrona entre eles. Por exemplo, integrar microsserviços em arquiteturas baseadas em nuvem.
- Análise de Big Data em Tempo Real: O Pub/Sub é útil para ingestão e processamento de dados em tempo real para análises de big data, permitindo a coleta contínua e o processamento de grandes volumes de dados.
- Streaming de Eventos: É utilizado em aplicativos que lidam com eventos em tempo real, como IoT (Internet das Coisas), streaming de mídia, processamento de transações financeiras, entre outros.
- Sistemas Distribuídos e Escaláveis: Ajuda na construção de sistemas distribuídos altamente escaláveis, permitindo que aplicativos distribuídos se comuniquem de maneira confiável e eficiente.
- Processamento de Mensagens Assíncronas: Ideal para aplicativos que precisam lidar com processamento de mensagens assíncronas, como fila de tarefas, notificações e processamento de pedidos.
Para finalizar:
O Google Cloud Pub/Sub oferece uma solução poderosa para comunicação assíncrona e distribuída em aplicativos modernos baseados em nuvem.
Sua capacidade de lidar com grandes volumes de mensagens, garantir a entrega confiável e oferecer baixa latência o torna uma escolha popular para arquiteturas de sistemas distribuídos, análises em tempo real e integração de aplicativos na nuvem.