.NET Core + Serverless: melhorando a experiência de Desenvolvimento com Azure Functions 3.x | pt 1

Renato Groffe
Azure na Pratica
Published in
4 min readMay 24, 2020

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):

https://bit.ly/anp-serverless3-blog-groffe-pre

.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:

.NET Core 3.1 + Console Application + Envio de Mensagens + RabbitMQ + Azure Service Bus (Queues e Topics) + Apache Kafka

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:

.NET Core + Azure Functions 3.x + Injeção de Dependências

--

--

Renato Groffe
Azure na Pratica

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker