O que é AWS SNS:
A utilização de tópicos do AWS SNS pode ser uma estratégia muito interessante no desenvolvimento de sistemas com microsserviços. Este tutorial trata da configuração de uma aplicação Spring Boot para a utilização desse tipo de serviço, utilizando o AWS SDK.
Propriedades de configuração do Spring Boot:
Tendo construído o projeto da aplicação Spring Boot, abra o arquivo application.properties
para a criação de duas variáveis que serão utilizadas para a configuração mais adiante. São
elas:
- Região da Amazon Web Services;
- ARN do tópico SNS.
A primeira variável será responsável por configurar o cliente do SNS da aplicação Spring Boot, sobre qual é a região em que está em execução.
A segunda variável é o Amazon Resource Name, ou apenas ARN, que é o endereço que representa o tópico que foi criado no AWS SNS.
Veja como deve ficar essas duas variáveis no arquivo application.properties
:
Os nomes dessas variáveis podem ser definidas como o desenvolvedor desejar, porém o formato com "." facilita a criação das variáveis de ambiente a serem passadas para a tarefa que será executada no serviço do AWS ECS.
Para construir a infraestrutura do tópico SNS, bem
como configurar as permissões de acesso a ele e configurar a aplicação através de
variáveis de ambiente, consulte este tutorial.
Para construir a infraestrutura do tópico SNS, bem como configurar as permissões de acesso a ele e configurar a aplicação através de variáveis de ambiente, consulte este tutorial.
Configurando o cliente do AWS SNS:
Para criar o cliente do SNS na aplicação Spring Boot, é necessário adicionar a biblioteca do AWS SDK no arquivobuild.gradle
, como no trecho a seguir:
Com as variáveis do arquivo application.properties
e a bibliteca adicionada no
arquivo build.gradle
, é possível criar a classe de configuração para o cliente
do
SDK e a representação do tópico do SNS.
Para isso, crie um arquivo chamado SnsConfig.java
, como no trecho a seguir:
Perceba que a classe SnsConfig
está anotada com @Configuration
.
Essa é a forma de indicar ao Spring Boot que essa se trata de uma classe de configuração, e
que deve ser executada durante o processo de inicialização da aplicação.
Veja que os dois atributos da classe estão anotados com @Value
. Esses dois
atributos receberão os valores das variáveis criadas no arquivo
application.properties
, como mostrado anteriormente.
Os valores desses dois atributos serão definidos pelas variáveis de
ambiente
da
tarefa em execução no serviço do AWS ECS, ou seja, eles serão contextuais à região
em
que a aplicação estiver de fato em execução.
Os valores desses dois atributos serão definidos pelas variáveis de ambiente da tarefa em execução no serviço do AWS ECS, ou seja, eles serão contextuais à região em que a aplicação estiver de fato em execução.
Essa estratégia de variáveis de ambiente permite que a configuração da aplicação Spring Boot fique independente do ambiente ou região da Amazon Web Services que ela é executada.
Ainda dentro dessa classe, construa o método que irá criar e expor o cliente do AWS SNS
através de um bean
do Spring Boot, como no trecho a seguir:
O cliente do AWS SNS, retornado por esse método, será utilizado no publicador de eventos, que será criado mais adiante nesse tutorial.
Veja que o atributo awsRegion
é utilizado para configurar o cliente do AWS SNS
com a região em que a aplicação está em execução.
Representando o tópico do AWS SNS:
O último método a ser construído nessa classe é o que irá criar a representação do tópico do AWS SNS, como pode ser visto no trecho a seguir:
Note que o atributo productEventstopic
é utilizado para passar o ARN desse
tópico, recebido como parâmetro no arquivo application.properties
.
Perceba também que o bean
criado nesse método possui um nome, que é productEventsTopic
.
Essa é uma estratégia útil quando se tem mais de um tópico na mesma aplicação. Com esse
nome, será possível especificar claramente qual tópico deve ser utilizado para publicar
alguma mensagem, como será visto mais adiante.
Criando o publicador de mensagens no tópico:
Tendo tudo configurado no projeto do Spring Boot, crie o arquivo
ProductPublisher.java
, que conterá o serviço para publicar de fato as mensagens
no
AWS SNS:
A classe ProductPublisher
é anotada com @Service
, indicando ao
Spring Boot que ela deve ser tratada como um service, capaz de ser injetado em outros
componentes, como controllers.
Veja que o cliente do SNS e o tópico, criados na classe de configuração
SnsConfig
, são injetados no construtor de ProductPublisher
. Repare
também que o nome que representa o tópico a ser utilizado aqui é passado como parâmetro da
anotação @Qualifier
, indicando o tópico específico.
Esse dois atributos do construtor já foram construídos e configurados em
SnsConfig
, e podem ser reutilizados em qualquer parte do projeto.
Esse dois atributos do construtor já foram construídos e configurados em
SnsConfig
, e podem ser reutilizados em qualquer parte do projeto.
Publicando de mensagens no tópico SNS:
Por fim, crie um novo método na classe ProductPublisher
, para de fato publicar
mensagens no tópico SNS, utilizando o cliente que foi injetado nessa classe:
Repare que o método publish
do cliente SNS é utilizado para publicar mensagens.
Esse método recebe como parâmetro o tópico em si e a mensagem a ser publicada.
A resposta desse método é um objeto do tipo PublishResult
, que contém a
identificação única da mensagem que foi publicada no tópico do SNS. Esse número é importante
para se fazer um rastreamento das mensagens, nas várias partes do sistema em que ela passar.
Se você gostou desse conteúdo, siga-me no LinkedIn, para receber notificações de outros tutoriais como esse!
Referência:
Esse artigo foi baseado nos conceitos ministrados nesse curso online: Criando microsserviços em Java com AWS ECS e Fargate
Quem sou eu:
- Trabalhei diariamente com as tecnologias apresentadas nesse blog por quase 4 anos, atuando como desenvolvedor de soluções hospedadas na Amazon Web Services;
- Tenho lecionado disciplinas de cloud computing, principalmente AWS, em curso de pós-graduação há quase 10 anos;
- Tenho livros publicados sobre o assunto;
- Faço parte da comunidade global AWS Community Builder 2020/2021/2022, criada pela própria AWS.