Création d'applications sans serveur avec Azure Functions et des solutions .NET

Publié: 2023-09-21

Création d'applications sans serveur avec Azure Functions et des solutions .NET

L'informatique sans serveur est un modèle d'exécution cloud qui permet aux développeurs de créer et d'exécuter des applications et des services sans penser aux serveurs. Avec le sans serveur, les applications ne dépendent pas du fonctionnement des serveurs : le fournisseur de cloud gère de manière dynamique l'allocation et le provisionnement des serveurs. Cela permet aux développeurs de se concentrer sur le codage de la logique métier plutôt que sur la gestion des serveurs.

Microsoft Azure Functions est un service de calcul sans serveur permettant de créer et d'héberger des points de terminaison Web et des tâches de traitement en arrière-plan sans avoir à provisionner ou gérer des serveurs. Avec Azure Functions, vous pouvez exécuter du code à la demande en réponse à des événements sans avoir à provisionner ou gérer explicitement l’infrastructure. Dans cet article de blog, nous explorerons comment créer des applications sans serveur avec Azure Functions à l'aide de solutions .NET, notamment en tirant parti des services de développement ASP.NET .

Qu’est-ce qu’Azure Functions ?

Azure Functions vous permet d'exécuter du code dans le cloud sans déployer ni gérer d'infrastructure. Avec Functions, vous écrivez uniquement le code dont vous avez besoin pour résoudre le problème sans vous soucier de la gestion des serveurs. Azure gère toute l'infrastructure et les serveurs pour vous.

Quelques aspects et avantages clés d’Azure Functions :

  • Basé sur les événements : les fonctions sont déclenchées par des événements provenant de nombreux services Azure et tiers. Ceux-ci incluent les requêtes HTTP, les minuteries, les files d'attente, les API sans serveur et bien plus encore. Vous pouvez exécuter du code en réponse à ces événements.
  • Mise à l'échelle automatique : Azure gère et met à l'échelle automatiquement les fonctions en fonction du taux de requêtes entrantes et de la charge de traitement. Vous n'avez pas besoin de provisionner et de mettre à l'échelle les serveurs manuellement.
  • Paiement à l'exécution : vous payez uniquement pour les ressources de calcul nécessaires à l'exécution de votre code. Il n'y a pas de frais d'inactivité lorsque vos fonctions ne sont pas exécutées.
  • Plusieurs langages : les fonctions prennent en charge C#, JavaScript, Python, PowerShell, Java et plus encore. Vous pouvez développer des fonctions dans votre langue préférée.
  • Expérience sans serveur : avec Functions, vous vous concentrez sur l’écriture du code et laissez Azure gérer tout le provisionnement, la configuration et la gestion du serveur. Vous obtenez une véritable expérience sans serveur.

Développement de fonctions .NET localement

Pour développer des fonctions .NET localement, vous avez besoin des outils Azure Functions Core, qui sont une interface de ligne de commande permettant de développer, tester et déployer Azure Functions à la fois localement et sur Azure.

Pour configurer l'environnement de développement :

  1. Installer la dernière version du SDK .NET Core
  2. Installez les outils de base Azure Functions à l'aide de l'outil dotnet install -g Microsoft.Azure.WebJobs.Script.WebHost
  3. Créez un répertoire pour le projet d'application de fonctions et exécutez func init
  4. Cela échafaudera un exemple de projet de fonctions avec un modèle de fonction

Vous pouvez désormais ajouter du code de fonction, le tester localement et le publier sur Azure à l'aide de la func CLI. Ajoutez un fichier run.csx pour une fonction C# déclenchée par HTTP :

Source {csharp}

Copie

#r « Newtonsoft.Json »

en utilisant Microsoft.AspNetCore.Mvc ;

en utilisant Microsoft.Extensions.Primitives ;

en utilisant Newtonsoft.Json ;

en utilisant System.Net ;

en utilisant System.Threading.Tasks ;

tâche asynchrone statique publique<IActionResult> Run (requête HttpRequest, journal ILogger)

{

log.LogInformation ("La fonction de déclenchement HTTP C# a traité une requête.");

nom de chaîne = req.Query["nom"];

string requestBody = wait new StreamReader(req.Body).ReadToEndAsync();

données dynamiques = JsonConvert.DeserializeObject(requestBody);

nom = nom ?? données?.nom;

retourner le nom != null

? (ActionResult)nouveau OkObjectResult($”Bonjour, {name}”)

: new BadRequestObjectResult("Veuillez transmettre un nom sur la chaîne de requête ou dans le corps de la requête");

}

Testez-le localement en exécutant func host start qui démarre la passerelle de fonctions sur votre hôte local. Vous pouvez maintenant le déclencher à l'aide de Postman ou d'un navigateur avec http://localhost:7071/api/HttpExample?name=John.

Choisir les déclencheurs et les liaisons Azure Functions

Azure Functions prend en charge de nombreuses sources et cibles d’événements différentes appelées déclencheurs et liaisons. Choisir les bons déclencheurs et liaisons est important en fonction de votre cas d'utilisation.

Certains déclencheurs courants dans les fonctions sont :

  • Déclencheur HTTP : pour créer des API REST et des points de terminaison Web. Le code est déclenché par des requêtes HTTP.
  • Déclencheur de minuterie : pour les tâches planifiées qui s'exécutent selon un calendrier, par exemple toutes les 5 minutes.
  • Déclencheur de file d'attente : pour traiter les messages des files d'attente de stockage.
  • Déclencheur Blob : pour réagir aux objets blob nouveaux ou mis à jour dans le stockage Azure Blob.

Les liaisons permettent aux fonctions d'interagir avec des magasins de données et des services externes. Les liaisons courantes incluent :

  • File d'attente de stockage : pour envoyer des messages vers les files d'attente de stockage.
  • Stockage Blob : pour lire et écrire sur le stockage Azure Blob.
  • Cosmos DB : pour interroger et modifier des documents dans le service de base de données Azure Cosmos DB.
  • Service Bus : pour gérer les messages des files d’attente et des sujets Azure Service Bus.

Choisir le bon déclencheur et les bonnes liaisons permet de créer des solutions de bout en bout en intégrant différentes fonctions aux données et aux services.

Utiliser des fonctions durables

Les fonctions durables permettent d'écrire des fonctions avec état qui permettent d'effectuer des séquences d'opérations de manière fiable même en cas de panne ou de redémarrage. Il vous permet de structurer des flux de travail de longue durée sous forme de machines à états.

Par exemple, vous pouvez créer un flux de travail à l'aide de fonctions durables qui consiste en :

  • Fonction orchestrateur : agit comme une machine à états qui coordonne l'exécution des fonctions d'activité dans le bon ordre.
  • Fonctions d'activité : Petites unités de travail indépendantes pouvant être appelées par les fonctions d'orchestrateur.

Les avantages de l’utilisation des fonctions durables incluent :

  • Nouvelles tentatives fiables : Durable Functions réessaye automatiquement les fonctions d’activité en cas d’échec.
  • Appels asynchrones : la fonction orchestrateur peut exécuter des fonctions d'activité de manière asynchrone et attendre leur achèvement.
  • Points de contrôle : l'état est vérifié en permanence afin que les flux de travail puissent être restaurés même après le redémarrage ou l'échec de l'application.

Voyons un workflow simple qui orchestre deux activités :

Source {csharp}

Copie

[NomFonction("Orchestre")]

tâche asynchrone statique publique RunOrchestrator (

[OrchestrationTrigger] Contexte IDurableOrchestrationContext)

{

var output1 = wait context.CallActivityAsync<string>("DotNetActivity", "Bonjour");

var sortie2 = attendre contexte.CallActivityAsync<string>("DotNetActivity", sortie1);

// renvoie le résultat

retourner la sortie2 ;

}

[NomFonction("DotNetActivity")]

public static Task<string> Exécuter(

Entrée de chaîne [ActivityTrigger],

Journal ILogger)

{

log.LogInformation($”Fonction DotNetActivity traitée : {input}”);

return Task.FromResult(input.ToUpper());

}

Les fonctions durables permettent de décomposer des processus complexes en flux de travail fiables.

Meilleures pratiques pour le développement d’Azure Functions

Quelques bonnes pratiques à suivre pour le développement d’Azure Functions :

  • Utiliser l'injection de dépendances : Dépendance Injectez des services dans des fonctions pour une meilleure testabilité.
  • Évitez les processus longs : les fonctions sont destinées à exécuter du code sur de petites unités de traitement. Gardez l’exécution du code courte.
  • Utilisez des types de données immuables : les fonctions sont sans état, évitez donc les types mutables/effets secondaires qui peuvent causer des problèmes.
  • Gestion centralisée des erreurs : ajoutez une logique commune de gestion des erreurs plutôt que de gérer les erreurs individuellement partout.
  • Journalisation structurée : la journalisation standardisée facilite le débogage, la surveillance et les pistes d'audit.
  • Limitation et tentatives : gérez les erreurs de limitation en implémentant des tentatives avec des interruptions exponentielles.
  • Gestion des versions : déclenchez fortement les versions, les liaisons et les entrées/sorties pour éviter les modifications brutales.
  • Surveillance et instrumentation : utilisez des outils tels qu'Application Insights pour la journalisation, la surveillance des performances et l'analyse de l'utilisation.
  • Utiliser les liaisons de contexte : exploitez les liaisons de contexte pour accéder à des éléments tels que les paramètres de l'application sans dépendances supplémentaires.

Le respect de ces bonnes pratiques permet de créer des applications sans serveur robustes, fiables et évolutives avec Azure Functions.

Déploiement de fonctions sur Azure

Une fois les fonctions prêtes, vous pouvez les déployer sur Azure via Azure CLI, PowerShell, Visual Studio ou directement à partir de la CLI des outils principaux d'Azure Functions :

Copie

func azure functionapp publier <function-app-name>

Cela publiera le dossier du projet de fonctions dans une application Azure Function. Voici quelques avantages clés du déploiement de fonctions sur Azure :

  • Mise à l'échelle automatique – Les fonctions évoluent en fonction du volume des demandes entrantes ou des déclencheurs temporels.
  • Haute disponibilité – Plusieurs instances dans les centres de données offrent une haute disponibilité.
  • Surveillance et journalisation – Utilisez des outils tels qu'Application Insights pour surveiller les performances, les erreurs, etc.
  • Plateforme sans serveur – Aucun serveur à provisionner/gérer. Vous vous concentrez uniquement sur le code.
  • Déploiement continu – Utilisez les pipelines CI/CD pour un déploiement automatisé sur les modifications de code.

Azure gère toute l'infrastructure, évite les coûts d'inactivité et fournit une plate-forme entièrement sans serveur pour exécuter des applications sans serveur à grande échelle de manière fiable.

Conclusion

L'informatique sans serveur avec Azure Functions permet aux développeurs de se concentrer sur la logique métier tout en confiant toute la gestion de l'infrastructure et des opérations vers Azure. La prise en charge native du développement .NET, y compris la possibilité d' embaucher des développeurs ASP.NET Core , permet de créer facilement des solutions sans serveur robustes en C#. Grâce aux déclencheurs, aux liaisons et aux fonctions durables, les développeurs peuvent créer des architectures et des flux de travail de bout en bout basés sur les événements sous forme de fonctions sans état et avec état. Combinées aux meilleures pratiques, Azure Functions permet de créer et de déployer des applications sans serveur dans le cloud avec simplicité et évolutivité.