Enviando mensagem do APIM para o Azure Service Bus
Neste artigo, vamos explorar como utilizar um endpoint no API Management (APIM) para publicar mensagens diretamente em uma fila do Service Bus, oferecendo uma solução prática e eficiente para a sincronização de dados entre aplicações legadas e novas. Vamos demonstrar como essa implementação pode simplificar o fluxo de comunicação entre sistemas, evitando a necessidade de criar workers ou outras soluções complexas no backend, otimizando o processo de migração e integração de dados.
Onde aplicar esta implementação?
Suponha que você tenha duas aplicações, uma legada, que ainda está em operação e uma nova aplicação, que servirá para substituir a legada futuramente. Outro ponto, são base de dados distintas!
Mas nesse cenário, ambas as aplicações estão em operação, então você precisa ter uma sincronização dos dados gerados do legado para sua nova aplicação.
É aí que entra esta implementação, como uma alternativa rápida para esse fluxo, já que te poupa de ter que criar um worker da vida ou alguma implementação no seu backend só para realizar essa sincronização!
[Service Bus] — Criando a Política de Acesso Compartilhado (Shared Access Policies) na fila
Mas atenção: esse texto considera que você já possui uma fila criada no Service Bus.
Então, nesse caso, você precisa acessar sua fila e criar uma shared access policies. Basta clicar em “Add”, criar um nome para sua política e fornecer a permissão desejada, no nosso caso, vamos dar apenas permissão de envio.
Após isso, sua política de acesso está configurada e agora você pode clicar sobre ela para ver as informações necessárias para conectar a sua fila.
As informações necessárias da nossa shared access policies para gerar o SAS Token são:
• Primary Key
• Nome da nossa política. Ex: sendOnly
[APIM] — Criando a policy para publicar a mensagem
Nós iremos utilizar a Echo API que o APIM nos disponibiliza para alterar a policy de um recurso e assim enviar uma mensagem para o Service Bus.
Iremos alterar a policy para o recurso “Create Resource”, para isso basta clicar em Echo API > Create Resource > Policies. Inicialmente, sua policy estará dessa forma:
Em seguida, iremos colocar o seguinte conteúdo dentro da tag “Inbound” para gerar o SAS Token e redirecionar a mensagem para o service bus.
<policies>
<inbound>
<set-variable name="sharedKeyName" value="<sharedAccessPolicyName>" />
<set-variable name="sharedKey" value="<PrimaryKey>" />
<set-variable name="uri" value="https://<nomeDoDominio>.servicebus.windows.net" />
<set-variable name="sasToken" value="@{
TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
var week = 60 * 60 * 24 * 7;
var expiry = Convert.ToString((int)sinceEpoch.TotalSeconds + week);
string stringToSign = System.Net.WebUtility.UrlEncode(context.Variables.GetValueOrDefault<string>("uri")) + "\n" + expiry;
HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(context.Variables.GetValueOrDefault<string>("sharedKey")));
var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
var sasToken = String.Format("SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
System.Net.WebUtility.UrlEncode(context.Variables.GetValueOrDefault<string>("uri")),
System.Net.WebUtility.UrlEncode(signature), expiry, context.Variables.GetValueOrDefault<string>("sharedKeyName")); return sasToken; }" />
<set-header name="Authorization" exists-action="override">
<value>@(context.Variables.GetValueOrDefault<string>("sasToken"))</value>
</set-header>
<set-header name="Content-Type" exists-action="override">
<value>application/json</value>
</set-header>
<set-backend-service base-url="https://<nomeDoDominio>.servicebus.windows.net" />
<rewrite-uri template="<nomeDaFila>/messages" />
<base />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
Explicando um pouco as variáveis utilizadas:
• Linha 3 temos a sharedKeyName, esse é o nome da nossa shared access policies criada no service bus. Ex: sendOnly
• Linha 4 temos a sharedKey, esse é o nome da nossa primary key dentro da shared access policies criada no service bus.
• Linha 5 temos a uri, essa informação conseguimos dentro do service bus acessando nossa fila. Segue o exemplo abaixo:
• Linha 22 temos o redirecionamento para o nosso service bus. Lembra que o APIM funciona como um Gateway? Pois é, ele consegue fazer essa comunicação redirecionando para uma outra URL.
• Linha 23 temos o complemento da nossa URL para conseguir enviar a mensagem para a fila correta. O /messages é a terminação utilizada pelo service bus para publicarmos uma mensagem. Essa informação está na documentação do Azure, disponível aqui.
Sobre a geração do SAS Token, essa informação também está disponível na própria documentação do Azure. Nela você pode encontrar como é a estrutura que o token deve ter e alguns exemplos de como gerar o SAS Token em outras linguagens de programação. Acesse aqui.
Vamos testar?
Após fazer todas essas configurações, criar política de acesso para sua fila, gerar o SAS Token e redirecionar a chamada para o service bus, vamos testar!
Voltaremos no APIM, mas dessa vez vamos selecionar a aba “Test” e clicar no botão “Send”. Mas note que na API possui um Request Body, esse é o conteúdo da nossa mensagem, você também pode enviar informações nos headers que aparecerão nas properties da mensagem no service bus.
Após enviar sua requisição, iremos no service bus e acessaremos a fila para verificar a mensagem.
Pronto, agora o fluxo está completo e seu APIM publicando mensagens para o service bus. Espero ter ajudado!
Conclusão
Em resumo, ao utilizar o API Management para publicar mensagens no Service Bus, você simplifica a integração entre sistemas legados e novas aplicações, garantindo uma comunicação eficiente e em tempo real. Essa solução não só facilita a sincronização de dados entre diferentes bases, mas também elimina a necessidade de criar implementações complexas no backend. Com isso, é possível otimizar o tempo e os recursos da equipe, garantindo um fluxo ágil e seguro para o seu ambiente de TI.
Vinicius Alves é desenvolvedor Java na Programmers. Atualmente, participa de um projeto do setor bancário, atuando na modernização do sistema com o uso de tecnologia em nuvem.Desde o início da carreira, sempre gostou de trabalhar no backend e explorar novas tecnologias. Nos momentos de lazer, Vinicius pratica boxe, joga videogame, participa de partidas de vôlei e cuida de suas duas gatas.