Mensagens com o Spring AMQP

Mensagens com o Spring AMQP

*1. Visão geral *

Neste tutorial, exploraremos a comunicação baseada em mensagens no AMQP usando a estrutura Spring AMQP. Primeiro, abordaremos alguns dos principais conceitos de mensagens. Em seguida, passaremos a um exemplo prático.

===* 2. Comunicação baseada em mensagem __ *

Mensagens é uma técnica para comunicação entre aplicativos. Ele se baseia na passagem de mensagens assíncrona em vez da arquitetura baseada em resposta de solicitação síncrona.* Os produtores e consumidores de mensagens são dissociados por uma camada intermediária de mensagens conhecida como intermediário de mensagens *. Um intermediário de mensagens fornece recursos como armazenamento persistente de mensagens, filtragem de mensagens e transformação de mensagens.

Em um caso de mensagens entre aplicativos gravados em Java, a API JMS (Java Message Service) é comumente usada. Para interoperabilidade entre diferentes fornecedores e plataformas, não poderemos usar clientes e corretores JMS. É aqui que o AMQP é útil .

*3. AMQP - Protocolo avançado de enfileiramento de mensagens __ *

AMQP é uma especificação de fio padrão aberto para comunicação de mensagens assíncronas. Ele fornece uma descrição de como uma mensagem deve ser construída.

====* 3.1 Como o Amqp é diferente do Jms *

Como o AMQP é um padrão de protocolo binário de plataforma neutra, as bibliotecas podem ser escritas em diferentes linguagens de programação e executadas em diferentes ambientes.

Não há bloqueio de protocolo baseado em fornecedor, como é o caso ao migrar de um broker JMS para outro. Para obter mais detalhes, consulte JMS vs AMQP e Entendendo o AMQP. Alguns dos corretores AMQP amplamente utilizados são RabbitMQ , OpenAMQ e StormMQ.

====* 3.2 Entidades AMQP __ *

Resumidamente, o AMQP é composto por trocas, filas e ligações:

  • Exchanges são como agências postais ou caixas de correio e os clientes publicam uma mensagem em uma central AMQP. Existem quatro tipos de troca integrados

  • Troca direta - direciona mensagens para uma fila, correspondendo a uma chave de roteamento completa

  • Fanout Exchange - Encaminha mensagens para todas as filas ligadas a ele

  • Troca de tópico - direciona mensagens para várias filas, correspondendo uma chave de roteamento a um padrão

  • Troca de cabeçalhos - direciona as mensagens com base nos cabeçalhos

  • Queues são vinculados a uma troca usando uma chave de roteamento *Messages são enviadas para uma central com uma chave de roteamento. A central distribui cópias das mensagens para as filas

Para obter mais detalhes, consulte AMQP Concepts e https://spring.io/blog/2011/04/01/routing-topologies- for-performance-and-scalability-with-rabbitmq/[Topologias de roteamento.]

====* 3.3 Spring AMQP *

O Spring AMQP compreende dois módulos: spring-amqp e spring-rabbit. Juntos, esses módulos fornecem abstrações para:

  • Entidades do AMQP - criamos entidades com as classes Message, Queue, Binding e Exchange

  • Gerenciamento de conexões - nos conectamos ao nosso broker RabbitMQ usando um CachingConnectionFactory

  • Publicação de mensagens - usamos um RabbitTemplate para enviar mensagens *Consumo de mensagens - usamos um _ @ RabbitListener_ para ler mensagens de uma fila

===* 4. Configurar um Broker Rabbitmq *

Precisamos de um corretor RabbitMQ disponível para nos conectarmos. A maneira mais simples de fazer isso é usando o Docker para buscar e executar uma imagem RabbitMQ para nós:

docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management

Expomos a porta 5672 para que nosso aplicativo possa se conectar ao RabbitMQ.

E expomos a porta 15672 para que possamos ver o que nosso broker RabbitMQ está fazendo através da UI de gerenciamento: http://localhost: 15672 ou da API HTTP: http://localhost: 15672/api/index.html.

===* 5. Criando nosso aplicativo Spring Amqp *

Então, agora vamos criar nosso aplicativo para enviar e receber um simples "Olá, mundo!" mensagem usando o Spring AMQP.

====* 5.1. Dependências do Maven *

Para adicionar os módulos spring-amqp e spring-rabbit ao nosso projeto, adicionamos a dependência spring-boot-starter-amqp ao nosso pom.xml:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.1.6.RELEASE</version>
    </dependency>
</dependencies>

Podemos encontrar a versão mais recente em https://search.maven.org/classic/#search%7Cga%7C1%7C(g%3A%22org.springframework.boot%22%20AND%20a%3A%22spring-boot -starter-amqp% 22) [Maven Central].

====* 5.2 Conexão com o Rabbitmq Broker *

*Usaremos a configuração automática do Spring Boot para criar nossos _ConnectionFactory_, _RabbitTemplate_ e _RabbitAdmin_ beans* . Como resultado, obtemos uma conexão com nosso broker RabbitMQ na porta 5672, usando o nome de usuário e a senha padrão de "guest". Então, apenas anotamos nosso aplicativo com _ @ SpringBootApplication_:
@SpringBootApplication
public class HelloWorldMessageApp {
  //...
}

5.3. Crie nossa fila

*Para criar nossa fila, simplesmente definimos um bean do tipo _Queue _.* _RabbitAdmin_ o encontrará e o vincula à troca padrão com uma chave de roteamento "myQueue":
@Bean
public Queue myQueue() {
    return new Queue("myQueue", false);
}

Definimos a fila como não durável, para que a fila e quaisquer mensagens nela sejam removidas quando o RabbitMQ for parado. Observe, no entanto, que reiniciar nosso aplicativo não terá efeito na fila.

5.4 Envie Nossa Mensagem

Vamos usar o RabbitTemplate para enviar nosso "Olá, mundo!" mensagem:

rabbitTemplate.convertAndSend("myQueue", "Hello, world!");

5.5. Consuma nossa mensagem

Implementaremos um consumidor de mensagem anotando um método com _ @ RabbitListener_:

@RabbitListener(queues = "myQueue")
public void listen(String in) {
    System.out.println("Message read from myQueue : " + in);
}

*6. Executando nosso aplicativo *

Primeiro, começamos o broker RabbitMQ:

docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management

Em seguida, executamos o aplicativo de inicialização da primavera executando HelloWorldMessage.java, executando o método _main () _:

mvn spring-boot:run -Dstart-class=com..springamqp.simple.HelloWorldMessageApp

Enquanto o aplicativo estiver sendo executado, veremos que:

  • O aplicativo envia uma mensagem para o intercâmbio padrão com "myQueue" como a chave de roteamento

  • Em seguida, a fila "myQueue" recebe a mensagem *Por fim, o método listen consome a mensagem de "myQueue" e a imprime no console

Também podemos usar a página de gerenciamento do RabbitMQ em http://localhost: 15672 para ver que nossa mensagem foi enviada e consumida.

===* 7. Conclusão*

Neste tutorial, abordamos a arquitetura baseada em mensagens no protocolo AMQP usando o Spring AMQP para comunicação entre aplicativos.

O código fonte completo e todos os trechos de código deste tutorial estão disponíveis em o projeto GitHub.