Déploiement et mise à l’échelle d’une application ASP.NET Core sur Azure Container Apps

Les applications déployées sur Azure qui rencontrent une forte demande intermittente bénéficient de la scalabilité pour y répondre. Les applications évolutives peuvent effectuer un scale-out pour garantir la capacité pendant les pics de charge de travail, puis effectuer un scale-down automatiquement lorsque le pic diminue, ce qui peut réduire les coûts. La mise à l’échelle horizontale (scale-out ou montée en charge) consiste à ajouter des instances d’une ressource, comme des machines virtuelles ou des réplicas de base de données. Cet article explique comment déployer une application ASP.NET Core horizontalement évolutive sur des applications conteneur Azure en effectuant les tâches suivantes :

  1. Configurer l’exemple de projet
  2. Déployer l’application sur Azure Container Apps
  3. Mettre à l’échelle et résoudre les problèmes de l’application
  4. Créer les services Azure
  5. Connecter les services Azure
  6. Configurer et redéployer l’application

Cet article utilise Razor Pages, mais s’applique en grande partie aux autres applications ASP.NET Core.

Dans certains cas, les applications ASP.NET Core de base peuvent être mises à l’échelle sans considérations particulières. Toutefois, les applications qui utilisent certaines fonctionnalités de framework ou certains modèles architecturaux nécessitent des configurations supplémentaires, notamment les suivantes :

  • Envois de formulaires sécurisés : Les applications Razor Pages, MVC et d’API web s’appuient souvent sur les envois de formulaires. Par défaut, ces applications utilisent des jetons de falsification intersite et des services de protection des données internes pour sécuriser les requêtes. Lorsqu’elles sont déployées dans le cloud, ces applications doivent être configurées pour gérer les problèmes de service de protection des données dans un emplacement sécurisé et centralisé.

  • CircuitsSignalR : les applications Blazor Server nécessitent l’utilisation d’une instance Azure SignalR Service centralisée pour une mise à l’échelle sécurisée. Ces services utilisent également les services de protection des données mentionnés précédemment.

  • Mise en cache centralisée ou services de gestion d’état : les applications évolutives peuvent utiliser Azure Cache pour Redis pour fournir une mise en cache distribuée. Le Stockage Azure peut être nécessaire pour stocker l’état de frameworks comme Microsoft Orleans, ce qui peut vous aider à écrire des applications qui gèrent l’état sur de nombreuses instances d’application différentes.

Les étapes de cet article montrent comment répondre correctement aux préoccupations précédentes en déployant une application évolutive sur Azure Container Apps. La plupart des concepts de ce tutoriel s’appliquent également lors de la mise à l’échelle des instances Azure App Service.

Configurer l’exemple de projet

Utilisez l’exemple d’application GitHub Explorer pour suivre ce tutoriel. Clonez l’application à partir de GitHub en utilisant la commande suivante :

git clone "https://github.com/dotnet/AspNetCore.Docs.Samples.git"

Accédez au dossier /tutorials/scalable-razor-apps/start et ouvrez le ScalableRazor.csproj.

L’exemple d’application utilise un formulaire de recherche pour parcourir les dépôts GitHub par nom. Le formulaire s’appuie sur les services de protection des données intégrés ASP.NET Core pour gérer les problèmes de falsification. Par défaut, lorsque l’application est mise à l’échelle horizontalement sur Container Apps, le service de protection des données lève une exception.

Test de l'application

  1. Lancez l’application dans Visual Studio. Le projet inclut un fichier Docker, ce qui signifie que la flèche en regard du bouton Exécuter peut être sélectionnée pour démarrer l’application à l’aide d’une installation Docker Desktop ou du serveur web local standard ASP.NET Core.

Utilisez le formulaire de recherche pour rechercher des dépôts GitHub par nom.

A screenshot showing the GitHub Explorer app.

Déployer l’application sur Azure Container Apps

Visual Studio est utilisé pour déployer l’application dans Azure Container Apps. Les applications conteneur fournissent un service managé conçu pour simplifier l’hébergement d’applications en conteneur et de microservices.

Remarque

La plupart des ressources créées pour l’application nécessitent un emplacement. Pour cette application, l’emplacement n’est pas important. Une application réelle doit sélectionner l’emplacement le plus proche des clients. Vous pouvez sélectionner un emplacement près de vous.

  1. Dans l’Explorateur de solutions Visual Studio, faites un clic droit sur le nœud de projet de niveau supérieur puis sélectionnez Publier.

  2. Dans la boîte de dialogue de publication, sélectionnez Azure comme cible de déploiement, puis sélectionnez Suivant.

  3. Pour la cible spécifique, sélectionnez Azure Container Apps (Linux),puis sélectionnez Suivant.

  4. Créez une nouvelle application conteneur à déployer. Sélectionnez l’icône + verte pour ouvrir une nouvelle boîte de dialogue et entrez les valeurs suivantes :

    A screenshot showing Visual Studio deployment.

    • Nom de l’application conteneur : conservez la valeur par défaut ou entrez un nom.
    • Nom de l’abonnement : sélectionnez l’abonnement à déployer.
    • Groupe de ressources : sélectionnez Nouveau et créez un nouveau groupe de ressources appelé msdocs-scalable-razor.
    • Environnement des applications conteneur : sélectionnez Nouveau pour ouvrir la boîte de dialogue d’environnement des applications conteneur et entrez les valeurs suivantes :
      • Nom de l’environnement : conservez la valeur par défaut.
      • Emplacement : sélectionnez un emplacement près de vous.
      • Espace de travail Azure Log Analytics : sélectionnez Nouveau pour ouvrir la boîte de dialogue de l’espace de travail Log Analytics.
        • Nom : conservez la valeur par défaut.
        • Emplacement : sélectionnez un emplacement près de vous, puis sélectionnez Ok pour fermer la boîte de dialogue.
      • Sélectionnez Ok pour fermer la boîte de dialogue d’environnement des applications conteneur.
    • Sélectionnez Créer pour fermer la boîte de dialogue des applications conteneur d’origine. Visual Studio crée la ressource d’application conteneur dans Azure.
  5. Une fois la ressource créée, vérifiez qu’elle est sélectionnée dans la liste des applications conteneur, puis sélectionnez Suivant.

  6. Vous devrez créer un Azure Container Registry pour stocker l’artefact d’image publié pour votre application. Sélectionnez l’icône verte + sur l’écran du registre de conteneurs.

    A screenshot showing how to create a new container registry.

  7. Conservez les valeurs par défaut, puis sélectionnez Créer.

    A screenshot showing the values for a new container registry.

  8. Une fois le registre de conteneurs créé, assurez-vous qu’il est sélectionné, puis sélectionnez Terminer pour fermer le workflow de boîte de dialogue et afficher un résumé du profil de publication.

    Si Visual Studio vous demande d’autoriser l’utilisateur administrateur à accéder au conteneur Docker publié, sélectionnez Oui.

  9. Sélectionnez Publier en haut à droite du résumé du profil de publication pour déployer l’application sur Azure.

Une fois le déploiement terminé, Visual Studio lance le navigateur pour afficher l’application hébergée. Recherchez Microsoft dans le champ de formulaire ; une liste de dépôts s’affiche.

Mettre à l’échelle et résoudre les problèmes de l’application

L’application fonctionne actuellement sans aucun problème, mais nous aimerions la mettre à l’échelle sur d’autres instances en prévision de volumes de trafic élevés.

  1. Dans le Portail Azure, recherchez l’application conteneur razorscaling-app-**** dans la barre de recherche de niveau supérieur et sélectionnez-la dans les résultats.
  2. Dans la page Vue d’ensemble, sélectionnez Mettre à l’échelle dans le volet de navigation gauche, puis + Modifier et déployer.
  3. Dans la page Révisions, basculez vers l’onglet Échelle.
  4. Définissez les instances min et max sur 4, puis sélectionnez Créer. Ce changement de configuration garantit que votre application est mise à l’échelle horizontalement sur quatre instances.

Revenez à l’application. Lorsque la page se charge, il semble d’abord que tout fonctionne correctement. Toutefois, lorsqu’un terme de recherche est entré et envoyé, une erreur peut se produire. Si aucune erreur n’est affichée, envoyez le formulaire plusieurs fois.

Résolution des problèmes liés à l’erreur

La raison pour laquelle les requêtes de recherche échouent n’est pas immédiatement évidente. Les outils de navigateur indiquent qu’une réponse 400 Requête incorrecte a été renvoyée. Toutefois, vous pouvez utiliser les fonctionnalités de journalisation des applications conteneur pour diagnostiquer les erreurs qui se produisent dans votre environnement.

  1. Dans la page Vue d’ensemble de l’application conteneur, sélectionnez Journaux dans le volet de navigation gauche.

  2. Dans la page Journaux, fermez la fenêtre contextuelle qui s’ouvre et accédez à l’onglet Tables.

  3. Développez l’élément Journaux personnalisés pour afficher le nœud ContainerAppConsoleLogs_CL. Cette table contient différents journaux de l’application conteneur qui peuvent être interrogés pour résoudre les problèmes.

    A screenshot showing the container app logs.

  4. Dans l’éditeur de requête, composez une requête de base pour rechercher les exceptions récentes dans la table ContainerAppConsoleLogs_CL Journaux, comme dans le script suivant :

    ContainerAppConsoleLogs_CL
    | where Log_s contains "exception"
    | sort by TimeGenerated desc
    | limit 500
    | project ContainerAppName_s, Log_s
    

    La requête précédente recherche dans la table ContainerAppConsoleLogs_CL toutes les lignes qui contiennent le mot exception. Les résultats sont triés en fonction de l’heure de génération, limités à 500 résultats, et incluent uniquement les colonnes ContainerAppName_s et Log_s pour faciliter la lecture des résultats.

  5. Sélectionnez Exécuter ; une liste de résultats s’affiche. Lisez les journaux et notez que la plupart d’entre eux sont liés aux jetons antifalsification et au chiffrement.

    A screenshot showing the logs query.

    Important

    Les erreurs dans l’application sont provoquées par les services de protection des données .NET. Lorsque plusieurs instances de l’application sont en cours d’exécution, il n’est pas garanti que la requête HTTP POST d’envoi du formulaire soit acheminée vers le même conteneur que celui qui a initialement chargé la page à partir de la requête HTTP GET. Si les requêtes sont gérées par différentes instances, les jetons antifalsification ne sont pas gérés correctement, et une exception se produit.

    Dans les étapes à venir, ce problème est résolu en centralisant les clés de protection des données dans un service de stockage Azure et en les protégeant avec Key Vault.

Créer les services Azure

Pour résoudre les erreurs précédentes, les services suivants sont créés et connectés à l’application :

  • Compte de stockage Azure : gère le stockage des données pour les services de protection des données. Fournit un emplacement centralisé pour stocker les données clés à mesure que l’application est mise à l’échelle. Des comptes de stockage peuvent également être utilisés pour stocker des documents, des données de file d’attente, des partages de fichiers et presque n’importe quel type de données blob.
  • Azure KeyVault : ce service stocke les secrets d’une application et est utilisé pour aider à gérer les problèmes de chiffrement pour les services de protection des données.

Créer le service de compte de stockage

  1. Dans la barre de recherche du Portail Azure, entrez Storage accounts et sélectionnez le résultat correspondant.
  2. Dans la page listant les Comptes de stockage, sélectionnez + Créer.
  3. Sous l’onglet Informations de base, entrez les valeurs suivantes :
    • Abonnement : sélectionnez le même abonnement que celui que vous avez choisi pour l’application conteneur.
    • Groupe de ressources : sélectionnez le groupe de ressources msdocs-scalable-razor que vous avez créé précédemment.
    • Nom du compte de stockage : nommez le compte scalablerazorstorageXXXX où les X sont des chiffres aléatoires de votre choix. Ce nom doit être unique dans tout Azure.
    • Région : sélectionnez la même région que celle que vous avez sélectionnée précédemment.
  4. Laissez le reste des valeurs par défaut et sélectionnez Vérifier. Une fois qu’Azure a validé les entrées, sélectionnez Créer.

Azure approvisionne le nouveau compte de stockage. Une fois la tâche terminée, choisissez Accéder à la ressource pour afficher le nouveau service.

Créer le conteneur de stockage

Créez un conteneur pour stocker les clés de protection des données de l’application.

  1. Dans la page Vue d’ensemble du nouveau compte de stockage, sélectionnez Navigateur de stockage dans le volet de navigation gauche.
  2. Sélectionnez conteneurs d’objets blob.
  3. Sélectionnez + Ajouter un conteneur pour ouvrir le menu volant Nouveau conteneur.
  4. Entrez le nom scalablerazorkeys, laissez le reste des paramètres par défaut, puis sélectionnez Créer.

Les nouveaux conteneurs apparaissent dans la liste de pages.

Créer le service de coffre de clés

Créez un coffre de clés pour contenir les clés qui protègent les données dans le conteneur de stockage d’objets blob.

  1. Dans la barre de recherche du Portail Azure, entrez Key Vault et sélectionnez le résultat correspondant.
  2. Dans la page de liste de coffres de clés, sélectionnez + Créer.
  3. Sous l’onglet Informations de base, entrez les valeurs suivantes :
    • Abonnement : sélectionnez le même abonnement que celui précédemment sélectionné.
    • Groupe de ressources : sélectionnez le groupe de ressources msdocs-scalable-razor créé précédemment.
    • Nom du coffre de clés : entrez le nom scalablerazorvaultXXXX.
    • Région : sélectionnez une région proche de votre emplacement.
  4. Conservez les valeurs par défaut du reste des paramètres, puis sélectionnez Vérifier + créer. Attendez qu’Azure valide vos paramètres, puis sélectionnez Créer.

Azure approvisionne le nouveau coffre de clés. Une fois la tâche terminée, sélectionnez Accéder à la ressource pour afficher le nouveau service.

Créer la clé

Créez une clé secrète pour protéger les données dans le compte de stockage d’objets blob.

  1. Dans la page Vue d’ensemble principale du coffre de clés, sélectionnez Clés dans le volet de navigation gauche.
  2. Dans la page Créer une clé, sélectionnez + Générer/Importer pour ouvrir le menu volant Créer une clé.
  3. Entrez razorkey dans le champ Nom. Laissez les autres paramètres à leurs valeurs par défaut, puis sélectionnez Créer. Une nouvelle clé s’affiche sur la page de liste de clés.

Connecter les services Azure

L’application conteneur nécessite une connexion sécurisée au compte de stockage et aux services de coffre de clés pour résoudre les erreurs de protection des données et effectuer une mise à l’échelle correcte. Les nouveaux services sont connectés ensemble en procédant comme suit :

Important

La propagation des attributions de rôles de sécurité via Service Connector et d’autres outils prend généralement une ou deux minutes et, dans certains cas, jusqu’à huit minutes.

Connecter le compte de stockage

  1. Dans le portail Azure, accédez à la page de vue d’ensemble de l’application conteneur.
  2. Dans la navigation de gauche, sélectionnez Connecteur de services
  3. Dans la page Connecteur de service, choisissez + Créer pour ouvrir le panneau volant Connexion de création et entrez les valeurs suivantes :
    • Conteneur : sélectionnez l’application conteneur créée précédemment.
    • Type de service : Choisissez Stockage - blob.
    • Abonnement : sélectionnez l’abonnement utilisé précédemment.
    • Nom de la connexion : conservez la valeur par défaut.
    • Compte de stockage : sélectionnez le compte de stockage créé précédemment.
    • Type de client : sélectionnez .NET.
  4. Sélectionnez Suivant : Authentification pour passer à l’étape suivante.
  5. Sélectionnez Identité managée affectée par le système, puis choisissez Suivant : Mise en réseau.
  6. Laissez les options de mise en réseau par défaut sélectionnées, puis sélectionnez Vérifier et créer.
  7. Une fois qu’Azure a validé les paramètres, sélectionnez Créer.

Le connecteur de service active une identité managée affectée par le système sur l’application conteneur. Il attribue également un rôle Contributeur aux données Blob du stockage à l’identité afin qu’elle puisse effectuer des opérations de données sur les conteneurs de stockage.

Connecter le coffre de clés

  1. Dans le portail Azure, accédez à la page de vue d’ensemble de votre application conteneur.
  2. Dans la navigation de gauche, sélectionnez Connecteur de services.
  3. Dans la page Connecteur de service, choisissez + Créer pour ouvrir le panneau volant Connexion de création et entrez les valeurs suivantes :
    • Conteneur : sélectionnez l’application conteneur créée précédemment.
    • Type de service : choisissez Coffre de clés.
    • Abonnement : sélectionnez l’abonnement utilisé précédemment.
    • Nom de la connexion : conservez la valeur par défaut.
    • Coffre de clés : sélectionnez le coffre de clés créé précédemment.
    • Type de client : sélectionnez .NET.
  4. Sélectionnez Suivant : Authentification pour passer à l’étape suivante.
  5. Sélectionnez Identité managée affectée par le système, puis choisissez Suivant : Mise en réseau.
  6. Laissez les options de mise en réseau par défaut sélectionnées, puis sélectionnez Vérifier et créer.
  7. Une fois qu’Azure a validé les paramètres, sélectionnez Créer.

Le connecteur de service attribue un rôle à l’identité afin qu’elle puisse effectuer des opérations de données sur les clés du coffre de clés.

Configurer et redéployer l’application

Les ressources Azure nécessaires ont été créées. Dans cette section, le code d’application est configuré pour utiliser les nouvelles ressources.

  1. Installez les packages NuGet suivants :

    • Azure.Identity : fournit les classes pour travailler avec les services de gestion des identités et des accès Azure.
    • Microsoft.Extensions.Azure : fournit des méthodes d’extension utiles pour effectuer des configurations Azure de base.
    • Azure.Extensions.AspNetCore.DataProtection.Blobs : permet de stocker des clés DataProtection ASP.NET Core dans le Stockage Blob Azure afin que les clés puissent être partagées entre plusieurs instances d’une application web.
    • Azure.Extensions.AspNetCore.DataProtection.Keys : permet de protéger les clés au repos à l’aide de la fonctionnalité de chiffrement/inclusion dans un wrapper d’Azure Key Vault.
    dotnet add package Azure.Identity
    dotnet add package Microsoft.Extensions.Azure
    dotnet add package Azure.Extensions.AspNetCore.DataProtection.Blobs
    dotnet add package Azure.Extensions.AspNetCore.DataProtection.Keys
    
  2. Mettez à jour Program.cs avec le code mis en évidence suivant :

    using Azure.Identity;
    using Microsoft.AspNetCore.DataProtection;
    using Microsoft.Extensions.Azure;
    
    var builder = WebApplication.CreateBuilder(args);
    var BlobStorageUri = builder.Configuration["AzureURIs:BlobStorage"];
    var KeyVaultURI = builder.Configuration["AzureURIs:KeyVault"];
    
    builder.Services.AddRazorPages();
    builder.Services.AddHttpClient();
    builder.Services.AddServerSideBlazor();
    
    builder.Services.AddAzureClientsCore();
    
    builder.Services.AddDataProtection()
                    .PersistKeysToAzureBlobStorage(new Uri(BlobStorageUri),
                                                    new DefaultAzureCredential())
                    .ProtectKeysWithAzureKeyVault(new Uri(KeyVaultURI),
                                                    new DefaultAzureCredential());
    var app = builder.Build();
    
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    
    app.UseRouting();
    
    app.UseAuthorization();
    
    app.MapRazorPages();
    
    app.Run();
    

Les modifications précédentes permettent à l’application de gérer la protection des données à l’aide d’une architecture centralisée et évolutive. DefaultAzureCredential détecte les configurations d’identité managée activées précédemment lorsque l’application est redéployée.

Mettez à jour les espaces réservés dans la section AzureURIs du fichier appsettings.json pour inclure les éléments suivants :

  1. Remplacez l’espace réservé <storage-account-name> par le nom du compte de stockage scalablerazorstorageXXXX.

  2. Remplacez l’espace réservé <container-name> par le nom du conteneur de stockage scalablerazorkeys.

  3. Remplacez l’espace réservé <key-vault-name> par le nom du coffre de clés scalablerazorvaultXXXX.

  4. Remplacez l’espace réservé <key-name> dans l’URI du coffre de clés par le nom razorkey créé précédemment.

    {
      "GitHubURL": "https://api.github.com",
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*",
      "AzureURIs": {
        "BlobStorage": "https://<storage-account-name>.blob.core.windows.net/<container-name>/keys.xml",
        "KeyVault": "https://<key-vault-name>.vault.azure.net/keys/<key-name>/"
      }
    }
    

Redéployer l’application

L’application est maintenant correctement configurée pour utiliser les services Azure créés précédemment. Redéployez l’application pour que les modifications de code soient appliquées.

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet, puis sélectionnez Publier.
  2. Dans la vue de résumé du profil de publication, sélectionnez le bouton Publier dans le coin supérieur droit.

Visual Studio redéploie l’application dans l’environnement d’applications conteneur créé précédemment. Une fois les processus terminés, le navigateur se lance sur la page d’accueil de l’application.

Testez à nouveau l’application en recherchant Microsoft dans le champ de recherche. La page devrait maintenant se recharger avec les résultats corrects chaque fois que vous effectuez un envoi.

Configurer des rôles pour le développement local

Le code et la configuration existants de l’application peuvent également fonctionner lors de l’exécution locale pendant le développement. La classe DefaultAzureCredential configurée précédemment est en mesure de récupérer les informations d’identification de l’environnement local pour s’authentifier auprès des services Azure. Vous devez attribuer les mêmes rôles à votre propre compte que ceux qui ont été attribués à l’identité managée de votre application pour que l’authentification fonctionne. Il doit s’agir du même compte que celui que vous utilisez pour vous connecter à Visual Studio ou à Azure CLI.

Connexion à votre environnement de développement local

Vous devez être connecté à Azure CLI, Visual Studio ou Azure PowerShell pour que vos informations d’identification soient récupérées par DefaultAzureCredential.

az login

Attribuer des rôles à votre compte de développeur

  1. Dans le portail Azure, accédez au compte de stockage scalablerazor**** créé précédemment.
  2. Dans le menu de navigation de gauche, sélectionnez Contrôle d’accès (IAM).
  3. Choisissez + Ajouter, puis Ajouter une attribution de rôle dans le menu déroulant.
  4. Dans la page Ajouter une attribution de rôle, recherchez Storage blob data contributor, sélectionnez le résultat correspondant, puis Suivant.
  5. Assurez-vous que l’option Utilisateur, groupe ou principal de service est sélectionnée, puis choisissez + Sélectionner des membres.
  6. Dans le menu volant Sélectionner des membres, recherchez votre propre compte utilisateur@domaine et sélectionnez-le dans les résultats.
  7. Choisissez Suivant, puis Vérifier et attribuer. Une fois qu’Azure a validé les paramètres, sélectionnez à nouveau Vérifier et affecter.

Comme indiqué précédemment, la propagation des autorisations d’attribution de rôle peut prendre une ou deux minutes ou, dans de rares cas, jusqu’à huit minutes.

Répétez les étapes précédentes pour attribuer un rôle à votre compte afin qu’il puisse accéder au service de coffre de clés et au secret.

  1. Dans le Portail Azure, accédez au coffre de clés razorscalingkeys créé précédemment.
  2. Dans le menu de navigation de gauche, sélectionnez Contrôle d’accès (IAM).
  3. Choisissez + Ajouter, puis Ajouter une attribution de rôle dans le menu déroulant.
  4. Dans la page Ajouter une attribution de rôle, recherchez Key Vault Crypto Service Encryption User, sélectionnez le résultat correspondant, puis Suivant.
  5. Assurez-vous que l’option Utilisateur, groupe ou principal de service est sélectionnée, puis choisissez + Sélectionner des membres.
  6. Dans le menu volant Sélectionner des membres, recherchez votre propre compte utilisateur@domaine et sélectionnez-le dans les résultats.
  7. Choisissez Suivant, puis Vérifier et attribuer. Une fois qu’Azure a validé vos paramètres, sélectionnez à nouveau Vérifier et affecter.

Vous devrez peut-être attendre à nouveau que cette attribution de rôle se propage.

Vous pouvez ensuite revenir à Visual Studio et exécuter l’application localement. Le code devrait continuer à fonctionner comme prévu. DefaultAzureCredential utilise vos informations d’identification Visual Studio ou Azure CLI existantes.

Modèles d’application web fiables

Consultez Le modèle d’application web fiable for.NETvidéos YouTube et l’article pour obtenir des conseils sur la création d’une application ASP.NET Core moderne, fiable, performante, testable, économique et évolutive, que ce soit à partir de zéro ou en refactorisant une application existante.