.NET Core + Serverless: melhorando a experiência de Desenvolvimento com Azure Functions 3.x | pt 1
Recentemente participei de 2 lives no Canal .NET com meu amigo Milton Câmara e que focaram na implementação de soluções serverless com .NET Core + Azure Functions 3.x. Nosso objetivo com estes eventos foi demonstrar que é possível aproximar a experiência de desenvolvimento com Azure Functions daquilo a que muitos Desenvolvedores estão habituados em ASP.NET Core. Para isto abordamos:
- Mensageria com Azure Queue Storage, Azure Service Bus (filas e tópicos), RabbitMQ e Apache Kafka;
- O uso de injeção de dependências com Azure Functions + .NET Core;
- Utilização do Redis como solução de armazenamento de dados;
- Acesso a dados com Dapper, Dapper.Contrib e soluções de ORM como Entity Framework Core e FluentNHibernate;
- Validações com FluentValidation;
- O uso de HttpClientFactory e da biblioteca Refit;
- Resiliência com a biblioteca Polly;
- Chaos Engineering utilizando de forma combinada Polly + Simmy.
Neste novo artigo (primeiro post de uma série de 3 artigos) trago as gravações de cada uma destas lives (que podem ser assistidas gratuitamente), alguns dos exemplos utilizados, bem como dicas/orientações sobre mensageria e injeção de dependências com Azure Functions.
E aproveito este espaço para um convite… Que tal participar do próximo treinamento online promovido pelo Azure na Prática e que acontecerá durante o dia 29/08/2020 (sábado), tendo como foco Serverless + Azure Functions e que engloba ainda o uso de tecnologias como Azure Logic Apps, RabbitMQ, Apache Kafka, SQL Server, MongoDB, Redis, Application Insights, Azure Cosmos DB e GitHub Actions? Acesse então o link a seguir para efetuar sua inscrição com o desconto especial de pré-venda (apenas R$ 200,00):
.NET Core + Serverless: Dicas e Truques com Azure Functions 3.x | Parte 1 [Vídeo]
.NET Core + Serverless: Dicas e Truques com Azure Functions 3.x | Parte 2 [Vídeo]
Mensageria
Atualmente podemos implementar Functions para consumir mensagens utilizando:
- Filas com Azure Queue Storage;
- Filas e Tópicos com Azure Service Bus.
Além do preço reduzido para se hospedar uma Function App no Microsoft Azure, a utilização de Azure Functions simplifica em muito a implementação de código consumindo as mensagens de uma fila. A seguir temos um exemplo disto com Azure Queue Storage:
Já o próximo exemplo apresenta o uso de uma fila baseada no Azure Service Bus:
Temos ainda a possibilidade de utilizar RabbitMQ com Azure Functions (suporte ainda em Preview), como indicado no exemplo a seguir:
Já abordei inclusive em detalhes o uso de RabbitMQ + Azure Functions no seguinte artigo:
Mensageria na nuvem com RabbitMQ, .NET Core e Azure Functions
Tópicos tornam possível o envio de mensagens a múltiplas aplicações. No caso de uma Function vinculada ao Azure Service Bus e outra aplicação qualquer, as mesmas apontarão para um mesmo tópico (topic-servicebus no exemplo) e estarão registradas com diferentes Subscriptions cada uma (groffe0 para esta Function específica):
O suporte a tópicos do Apache Kafka ainda está em Preview para as Azure Functions no momento da publicação deste artigo (final de Maio/2020). O exemplo a seguir vincula uma Function a um tópico chamado topic-kafka; já o topic-kafka-group0 indica o grupo ao qual a aplicação correspondente está associada (funcionando de maneira similiar às Subscriptions do Azure Service Bus):
Maiores informações sobre o uso de Kafka com .NET Core podem ser encontradas no link a seguir:
.NET + Apache Kafka: Guia de Referência
Os diferentes exemplos apresentados nesta seção foram agrupados em 2 repositórios do GitHub:
.NET Core + Azure Functions 3.x + Queue Storage + RabbitMQ + Azure Service Bus (Queue)
.NET Core + Azure Functions 3.x + Azure Service Bus + Apache Kafka + Topics
Por fim, deixo aqui um projeto que criei para testes simples de envio de mensagens envolvendo as tecnologias aqui mencionadas:
Injeção de Dependências
Essencial para o uso de ORMs (Entity Framework Core, FluentNHibernate) ou visando um melhor tratamento de falhas por meio da biblioteca Polly, já abordei como o mecanismo de injeção de dependências do ASP.NET Core também pode ser ativado em um projeto baseado em Azure Functions no artigo:
.NET Core + Serverless: utilizando injeção de dependências com Azure Functions
Tais ajustes passam pela inclusão de uma extensão própria para isto em uma Function App:
dotnet add package Microsoft.Azure.Functions.Extensions
E pela implementação de uma classe Startup baseada no tipo FunctionsStartup (namespace Microsoft.Azure.Functions.Extensions.DependencyInjection):
No caso específico de uma Function, a implementação dessa estrutura deverá ser alterada para o uso de uma classe contendo um construtor e um método não-estáticos:
O código-fonte do projeto detalhado nesta seção já está disponível no GitHub: