Modifier

Share via


Modèle d’application web fiable pour Java : appliquer le modèle

Azure App Service
Azure Front Door
Cache Azure pour Redis
Bibliothèque d’authentification Microsoft pour Java

Cet article vous montre comment appliquer le modèle d’application web fiable. Le modèle d’application web fiable est un ensemble de principes et de techniques d’implémentation qui définissent la façon dont vous devez modifier des applications web (création d'une nouvelle plateforme d'applications) lors de la migration vers le cloud. Il met l'accent sur les mises à jour minimales du code que vous devez effectuer pour tirer une expérience positive du cloud.

Pour faciliter la mise en œuvre de ces conseils, vous pouvez déployer l'implémentation de référence du modèle d'application web fiable.

Diagramme de l’architecture de l’implémentation de référence.Architecture de l'implémentation de référence. Téléchargez un fichier Visio de cette architecture.

Les instructions suivantes utilisent l’implémentation de référence comme exemple tout au long de cet article. Pour appliquer le modèle d'application web fiable, suivez ces recommandations alignées sur les piliers du Well-Architected Framework :

Fiabilité

La fiabilité permet de s’assurer que votre application tient vos engagements auprès de vos clients. Pour en savoir plus, consultez la liste de contrôle de l'examen de la conception pour la fiabilité. Le modèle d’application web fiable introduit deux modèles de conception clés au niveau du code pour améliorer la fiabilité : le modèle Nouvelle tentative et le modèle Disjoncteur.

Utiliser le modèle Nouvelle tentative

Le modèle Nouvelle tentative traite les interruptions de service temporaires, appelées erreurs temporaires, qui sont généralement résolues en quelques secondes. Ces erreurs résultent souvent de la limitation de service, de la distribution de charge dynamique et des problèmes réseau dans les environnements cloud. L’implémentation du modèle de nouvelle tentative implique de renvoyer des requêtes ayant échoué, en prévoyant des délais et des tentatives configurables avant de lever une exception.

Utilisez Resilience4j pour implémenter le modèle de nouvelle tentative en Java. Resilience4j est une bibliothèque légère et de tolérance de panne. Elle fournit des fonctions d’ordre supérieur (éléments décoratifs) pour améliorer les interfaces fonctionnelles, les expressions lambda et les références de méthode avec un modèle de conception Disjoncteur, Limiteur de débit, Nouvelle tentative ou Bulkhead.

Exemple : L’implémentation de référence ajoute le modèle de nouvelle tentative en décorant la méthode listServicePlans du contrôleur de plan de service avec des annotations de nouvelle tentative. En cas d'échec de l'appel initial, le code renouvelle l'appel à une liste des plans de service de la base de données.

    @GetMapping("/list")
    @PreAuthorize("hasAnyAuthority('APPROLE_AccountManager')")
    @CircuitBreaker(name = SERVICE_PLAN)
    @Retry(name = SERVICE_PLAN)
    public String listServicePlans(Model model) {
        List<serviceplandto> servicePlans = planService.getServicePlans();
        model.addAttribute("servicePlans", servicePlans);
        return "pages/plans/list";
    }

L’implémentation de référence configure la stratégie de nouvelles tentatives, y compris le nombre maximal de nouvelles tentatives, la durée d’attente et les exceptions à retenter. La stratégie de nouvelles tentatives est configurée dans application.properties.

Utiliser le modèle Circuit Breaker

L’association des modèles Nouvelle tentative and Disjoncteur accroît la capacité d'une application à gérer les interruptions de service qui ne sont pas liées à des erreurs temporaires. Le modèle Disjoncteur empêche une application d'essayer continuellement d'accéder à un service qui ne répond pas. Le modèle Disjoncteur libère l’application et évite de gaspiller les cycles de processeur afin que l’application conserve son intégrité de performance pour les utilisateurs finaux. Pour plus d’informations, consultez la documentation relative à Spring Circuit Breaker et à Resilience4j.

Exemple : L’implémentation de référence implémente le modèle Disjoncteur en décorant les méthodes avec l’attribut Disjoncteur.

Sécurité

La sécurité fournit des garanties contre les attaques délibérées, et contre l’utilisation abusive de vos données et systèmes importants. Pour en savoir plus, consultez la liste de contrôle de l'examen de la conception pour la sécurité. Le modèle d’application web fiable utilise des identités managées pour mettre en œuvre une sécurité centrée sur l'identité. Les points de terminaison privés, le pare-feu d’applications web et l’accès restreint à l’application web assurent une entrée sécurisée.

Appliquez les privilèges minimum

Pour des raisons de sécurité et d'efficacité, n'accordez aux utilisateurs (identités utilisateur) et aux services Azure (identités de charge de travail) que les autorisations dont ils ont besoin.

Attribuer des autorisations aux identités utilisateur

Évaluez les besoins de votre application pour définir un ensemble de rôles qui couvrent toutes les actions de l'utilisateur sans chevauchement. Mappez chaque utilisateur au rôle le plus approprié. Veillez à ce qu'ils n'aient accès qu'aux données nécessaires à l'exercice de leurs fonctions.

Attribuer des autorisations aux identités de charge de travail

N'accordez que les autorisations indispensables aux opérations, telles que les actions CRUD dans les bases de données ou l'accès aux secrets. Les autorisations des identités de charge de travail sont persistantes, de sorte que vous ne pouvez pas octroyer des autorisations ponctuelles ou à court terme aux identités de charge de travail.

  • Privilégiez le contrôle d’accès en fonction du rôle (RBAC). Commencez toujours par utiliser Azure RBAC pour attribuer des autorisations. Cette solution offre un contrôle précis, garantissant un accès à la fois contrôlable et granulaire. Utilisez Azure RBAC pour n'accorder que les autorisations nécessaires à l'exécution des fonctions prévues du service.

  • Ajoutez des contrôles d'accès au niveau du service Azure. Si Azure RBAC ne couvre pas un scénario spécifique, utilisez des politiques d'accès au niveau du service Azure.

Pour plus d’informations, consultez l’article suivant :

Configurer l’authentification et l’autorisation de l’utilisateur

L’authentification et l’autorisation sont des aspects critiques de la sécurité des applications web. L’authentificationest le processus de vérification de l'identité d'un client. L’autorisation spécifie les actions qu’un utilisateur est autorisé à effectuer dans l’application. L’objectif est d’implémenter l’authentification et l’autorisation sans affaiblir votre posture de sécurité. Pour atteindre cet objectif, vous devez utiliser les fonctionnalités de la plateforme d’applications Azure (Azure App Service) et du fournisseur d’identité (Microsoft Entra ID).

Configurer l’authentification de l’utilisateur

Sécurisez votre application web en activant l’authentification utilisateur via les fonctionnalités de votre plateforme. Azure App Service prend en charge l’authentification avec des fournisseurs d’identité tels que Microsoft Entra ID, ce qui permet de décharger votre code de la charge de travail liée à l'authentification.

Exemple : L’implémentation de référence utilise Microsoft Entra ID comme plateforme d’identité. Microsoft Entra ID nécessite d'inscrire une application dans le locataire principal. L’inscription de l’application garantit que les utilisateurs qui ont accès à l’application web possèdent des identités dans le locataire principal. Le code Terraform suivant consiste à créer une inscription d’application Entra ID avec un rôle Administrateur de comptes spécifique à l’application.

resource "azuread_application" "app_registration" {
  display_name     = "${azurecaf_name.app_service.result}-app"
  owners           = [data.azuread_client_config.current.object_id]
  sign_in_audience = "AzureADMyOrg"  # single tenant

  app_role {
    allowed_member_types = ["User"]
    description          = "Account Managers"
    display_name         = "Account Manager"
    enabled              = true
    id                   = random_uuid.account_manager_role_id.result
    value                = "AccountManager"
  }
}

Key Vault stocke en toute sécurité les données de configuration de nos clients et la plateforme App Service expose les informations à notre application sous forme de variables d'environnement.

Intégrer avec le fournisseur d’identité

Intégrez votre application web à Microsoft Entra ID pour une authentification et une autorisation sécurisées. Spring Boot Starter pour Microsoft Entra ID simplifie ce processus, en utilisant Spring Security et Spring Boot pour faciliter la configuration. Il offre des flux d’authentification variés, une gestion automatique des jetons et des stratégies d’autorisation personnalisables, ainsi que des fonctionnalités d’intégration avec les composants Spring Cloud. Ainsi, l'intégration de Microsoft Entra ID et d'OAuth 2.0 dans les applications Spring Boot est directe, sans configuration manuelle de la bibliothèque ou des paramètres.

Exemple : L’implémentation de référence utilise la plateforme d’identité Microsoft (Microsoft Entra ID) en tant que fournisseur d’identité pour l’application web. Il utilise l’octroi de code d’autorisation OAuth 2.0 pour connecter un utilisateur avec un compte Microsoft Entra. L’extrait de code XML suivant définit les deux dépendances requises du flux d’octroi de code d’autorisation OAuth 2.0. La dépendance com.azure.spring: spring-cloud-azure-starter-active-directory active l’authentification et l’autorisation Microsoft Entra dans une application Spring Boot. La dépendance org.springframework.boot: spring-boot-starter-oauth2-client prend en charge l’authentification et l’autorisation OAuth 2.0 dans une application Spring Boot.

<dependency>
    <groupid>com.azure.spring</groupid>
    <artifactid>spring-cloud-azure-starter-active-directory</artifactid>
</dependency>
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-oauth2-client</artifactid>
</dependency>

Pour plus d’informations, consultez support Spring Cloud Azure pour Spring Security.

Implémenter des règles métier d'authentification et d'autorisation

L’implémentation de règles métier d’authentification et d’autorisation implique la définition des stratégies de contrôle d’accès et des autorisations pour diverses fonctionnalités et ressources d’application. Vous devez configurer Spring Security pour utiliser Spring Boot Starter pour Microsoft Entra ID. Cette bibliothèque permet l’intégration à Microsoft Entra ID et vous permet de vous assurer que les utilisateurs sont authentifiés en toute sécurité. La configuration et l’activation de la bibliothèque d’authentification Microsoft (MSAL) permettent d’accéder à d’autres fonctionnalités de sécurité. Ces fonctionnalités incluent la mise en cache des jetons et l’actualisation automatique des jetons.

Exemple : L’implémentation de référence crée des rôles d’application reflétant les types de rôles d’utilisateur du système de gestion des comptes de Contoso Fiber. Les rôles sont finalement traduits en autorisations pendant l’autorisation. Parmi les exemples de rôles spécifiques à l’application CAMS, citons le gestionnaire de comptes, le conseiller du support de niveau 1 (L1) et le représentant Field Service. Le rôle Gestionnaire de comptes dispose des autorisations nécessaires pour ajouter de nouveaux utilisateurs et clients à l'application. Un représentant Field Service peut créer des tickets de support. L’attribut PreAuthorize limite l’accès à des rôles spécifiques.

    @GetMapping("/new")
    @PreAuthorize("hasAnyAuthority('APPROLE_AccountManager')")
    public String newAccount(Model model) {
        if (model.getAttribute("account") == null) {
            List<ServicePlan> servicePlans = accountService.findAllServicePlans();
            ServicePlan defaultServicePlan = servicePlans.stream().filter(sp -> sp.getIsDefault() == true).findFirst().orElse(null);
            NewAccountRequest accountFormData = new NewAccountRequest();
            accountFormData.setSelectedServicePlanId(defaultServicePlan.getId());
            model.addAttribute("account", accountFormData);
            model.addAttribute("servicePlans", servicePlans);
        }
        model.addAttribute("servicePlans", accountService.findAllServicePlans());
        return "pages/account/new";
    }
    ...

Pour procéder à l’intégration avec Microsoft Entra ID, l’implémentation de référence utilise le flux d’octroi du code d’autorisation OAuth 2.0. Ce flux permet aux utilisateurs de se connecter avec un compte Microsoft. L’extrait de code suivant vous montre comment configurer SecurityFilterChain de manière à utiliser Microsoft Entra à des fins d’authentification et d’autorisation.

@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
            .and()
                .authorizeHttpRequests()
            .requestMatchers(EndpointRequest.to("health")).permitAll()
            .anyRequest().authenticated()
            .and()
                .logout(logout -> logout
                            .deleteCookies("JSESSIONID", "XSRF-TOKEN")
                            .clearAuthentication(true)
                            .invalidateHttpSession(true));
        return http.build();
    }
}
...

Pour plus d’informations, consultez l’article suivant :

Configurer l’authentification et l’autorisation du service

Configurez l’authentification et l’autorisation des services afin que les services de votre environnement disposent des autorisations nécessaires pour exécuter les fonctions attendues. Utilisez les identités managées dans Microsoft Entra ID pour automatiser la création et la gestion des identités de service, et évitez ainsi de devoir gérer manuellement les informations d'identification. Une identité managée permet à votre application web d’accéder en toute sécurité aux services Azure, tels qu’Azure Key Vault et les bases de données. Elle facilite également l'intégration de pipelines CI/CD pour les déploiements vers Azure App Service. Toutefois, dans des scénarios tels que les déploiements hybrides ou avec des systèmes existants, continuez à utiliser vos solutions d'authentification locales pour simplifier la migration. Passez aux identités gérées lorsque votre système est adapté à une approche moderne de la gestion des identités. Pour plus d’informations, consultez la documentation relative à la surveillance des identités managées.

Exemple : L’implémentation de référence conserve le mécanisme d’authentification local de la base de données (nom d’utilisateur et mot de passe). Par conséquent, l’implémentation de référence stocke le secret de base de données dans Key Vault. L’application web utilise une identité managée (affectée par le système) pour récupérer les secrets de Key Vault.

Utiliser un magasin de secrets central pour gérer les secrets

Lorsque vous migrez votre application vers le cloud, utilisez Azure Key Vault pour stocker ces secrets en toute sécurité. Ce référentiel centralisé offre un stockage sécurisé, une rotation des clés, un audit des accès et une surveillance des services qui ne gèrent pas les identités managées. Pour les configurations d’application, il est recommandé d'utiliser Azure App Configuration.

Exemple : L’implémentation de référence stocke les secrets suivants dans Key Vault : (1) le nom d’utilisateur et le mot de passe de la base de données PostgreSQL, (2) le mot de passe du cache Redis et (3) le secret client pour Microsoft Entra ID associé à l’implémentation MSAL.

Ne placez pas Key Vault dans le flux de requêtes HTTP.

Chargez des secrets à partir de Key Vault au démarrage de l’application plutôt qu'à chaque requête HTTP. Key Vault est destiné à stocker et récupérer en toute sécurité des données sensibles pendant le déploiement. Les accès très fréquents dans le cadre de requêtes HTTP peuvent excéder les capacités de débit de Key Vault, ce qui entraîne des limitations de requêtes et des erreurs de code d’état HTTP 429. Pour plus d’informations, consultez limites de transaction Key Vault.

Utiliser une méthode pour accéder aux secrets dans Key Vault

Lors de la configuration d'une application web en vue d'accéder aux secrets dans Key Vault, deux options principales s'offrent à vous :

  • Paramètre d’application App Service : Utilisez un paramètre d’application dans App Service pour injecter le secret directement en tant que variable d’environnement.

  • Référence directe à un secret : Référencez directement le secret dans votre code d’application. Ajoutez une référence spécifique dans le fichier de propriétés de votre application pour qu'elle communique avec Key Vault. Par exemple, application.properties pour les applications Java.

Il est important de choisir une de ces méthodes et de s'y tenir par souci de simplicité et pour éviter toute complexité inutile. Pour intégrer Key Vault à une application Spring, le processus implique les étapes suivantes :

  1. Ajoutez la dépendance Azure Spring Boot Starter pour les secrets Azure Key Vault dans votre fichier pom.xml.
  2. Configurez un point de terminaison Key Vault dans votre application. Cette opération peut être effectuée dans le fichier application.properties ou sous la forme d'une variable d'environnement.

Exemple : L’implémentation de référence utilise un paramètre d’application dans App Service et injecte des secrets.

Utiliser des points de terminaison privés

Utilisez des points de terminaison privés dans tous les environnements de production et pour tous les services Azure pris en charge. Les points de terminaison privés fournissent des connexions privées entre les ressources d’un réseau virtuel Azure et les services Azure. Par défaut, la communication de service vers la plupart des services Azure traverse l’Internet public. Les points de terminaison privés n’ont pas besoin de modifications de code, de configurations d’application ou de chaînes de connexion. Pour plus d’informations, consultez Comment créer un point de terminaison privé et Meilleures pratiques pour la sécurité des points de terminaison.

Exemple : L’implémentation de référence utilise des points de terminaison privés pour Key Vault, Azure Cache pour Redis et Azure Database pour PostgreSQL.

Utiliser un pare-feu d’applications web

Tout le trafic Internet entrant vers l’application web doit être filtré par un pare-feu d’applications web afin de se prémunir contre les attaques web courantes. Acheminez l'intégralité du trafic Internet entrant via l’équilibreur de charge public (si vous en avez un) et le pare-feu d’applications web. Vous pouvez (1) utiliser le point de terminaison privé Azure Front Door ou (2) filtrer les requêtes en fonction de la X-Azure-FDIDvaleur d’en-tête.

La plateforme App Service et Java Spring peuvent filtrer par valeur d’en-tête. Vous devez utiliser App Service comme première option. Le filtrage au niveau de la plateforme empêche les requêtes indésirables d’atteindre votre code. Vous devez configurer le trafic que vous souhaitez filtrer avec votre pare-feu d'applications web. Vous pouvez filtrer en fonction du nom d’hôte, de l’adresse IP du client et d’autres valeurs. Pour plus d’informations, consultez la documentation relative à la conservation du nom d’hôte HTTP d’origine.

Exemple : L’implémentation de référence utilise un point de terminaison privé dans l’environnement de production et la valeur d’en-tête X-Azure-FDID dans l’environnement de développement.

Configurer la sécurité de la base de données

L’accès au niveau de l’administrateur à la base de données accorde des autorisations pour effectuer des opérations privilégiées. Les opérations privilégiées incluent la création et la suppression de bases de données, la modification de schémas de table ou la modification des autorisations utilisateur. Les développeurs ont souvent besoin d’un accès au niveau de l’administrateur pour gérer la base de données ou résoudre les problèmes.

  • Évitez les autorisations permanentes avec élévation de privilèges. Accordez aux développeurs un accès juste-à-temps pour effectuer des opérations privilégiées. Avec l’accès juste-à-temps, les utilisateurs reçoivent des autorisations temporaires pour effectuer des tâches privilégiées.

  • N’accordez pas d’autorisations élevées à l’application. N’accordez pas d’accès de niveau administrateur à l’identité de l’application. Configurez l’accès à la base de données avec le moindre privilège pour l’application. Cela limite le rayon d’explosion des bogues et des violations de sécurité. Vous disposez de deux méthodes principales pour accéder à la base de données Azure PostgreSQL. Vous pouvez utiliser l’authentification Microsoft Entra ou l’authentification PostgreSQL. Pour plus d’informations, consultez JDBC avec Azure PostgreSQL.

Optimisation des coûts

L’optimisation des coûts consiste à examiner les moyens de réduire les dépenses inutiles et les frais généraux de gestion. Pour plus d'informations, consultez la liste de contrôle de la révision de la conception pour l'optimisation des coûts. Le modèle d’application web fiable implémente des techniques de dimensionnement, de mise à l’échelle automatique et d'utilisation efficace des ressources pour optimiser les coûts de l'application web.

Dimensionnement des ressources pour chaque environnement

Il est important de comprendre les différents niveaux de performance des services Azure et de n'utiliser que la référence SKU appropriée aux besoins de chaque environnement. Les environnements de production ont besoin de références SKU qui répondent aux contrats de niveau de service (SLA), aux fonctionnalités et à la mise à l’échelle nécessaires pour la production. Les environnements hors production n’ont normalement généralement pas besoin des mêmes fonctionnalités. Pour réaliser des économies supplémentaires, envisagez les tarifs de développement/test Azure, les réservations Azure et les plans d’économies Azure pour le calcul.

Exemple : L’implémentation de référence n’utilise pas la tarification Azure Dev/Test, car elle ne couvrait aucun des composants. Azure Database pour PostgreSQL est un choix idéal en tant qu’instance réservée basée sur le plan de coller avec ce moteur de base de données pendant au moins un an après cette première convergence sur la phase cloud. L’implémentation de référence a un paramètre facultatif qui déploie différentes références SKU. Un paramètre d’environnement indique au modèle Terraform de sélectionner des références SKU de développement. Le code suivant montre ce paramètre d’environnement.

azd env set APP_ENVIRONMENT prod

Contoso Fiber utilise des modèles d’infrastructure en tant que code (IaC) pour les déploiements de développement et de production. L'environnement de développement est optimisé sur le plan financier grâce à l'utilisation des références SKU les moins coûteuses nécessaires au développement de l'application. L’environnement de production utilise des références SKU qui répondent aux exigences de niveau de service de production de l’application.

Utiliser la mise à l’échelle automatique

La mise à l'échelle automatique permet d'automatiser la mise à l'échelle horizontale des environnements de production. Mise à l’échelle automatique selon les métriques de performance. Les déclencheurs de performances d’utilisation du processeur sont un bon point de départ si vous ne comprenez pas les critères de mise à l’échelle de votre application. Vous devez configurer et adapter les déclencheurs de mise à l’échelle (processeur, RAM, réseau et disque) pour qu’ils correspondent au comportement de votre application web. Ne procédez pas à une mise à l'échelle verticale pour répondre à des changements fréquents de la demande. C’est moins rentable. Pour plus d’informations, consultez Mise à l’échelle dans Azure App Service et Mise à l’échelle automatique dans Microsoft Azure.

Utiliser les ressources de manière efficace

Une utilisation efficace des ressources implique la gestion stratégique et l’allocation de ressources cloud pour répondre aux besoins de l’organisation sans gaspillage. Elle permet de limiter les dépenses inutiles en ressources et les frais généraux de gestion. Pour améliorer l’efficacité des ressources, suivez ces recommandations :

  • Utilisez des services partagés. La centralisation et le partage de certaines ressources permettent d'optimiser les coûts et de réduire les frais généraux de gestion. Par exemple, placez des ressources réseau partagées dans le réseau virtuel hub.

  • Supprimez les environnements inutilisés. Supprimez les environnements hors production après les heures de travail ou pendant les jours fériés pour optimiser les coûts. Vous pouvez utiliser l'infrastructure en tant que code pour supprimer des ressources Azure et des environnements entiers. Supprimez la déclaration de la ressource que vous souhaitez supprimer de votre modèle d’infrastructure en tant que code. Sauvegardez les données dont vous avez besoin ultérieurement. Renseignez-vous sur les dépendances de la ressource que vous supprimez. S'il existe des dépendances, il se peut que vous deviez également mettre à jour ou supprimer ces ressources.

  • Colocalisez les fonctionnalités. En cas de capacité excédentaire, il est possible de colocaliser les ressources et les fonctionnalités de l'application sur une seule ressource Azure. Par exemple, plusieurs applications web peuvent utiliser un seul serveur (plan App Service) ou un cache unique peut prendre en charge plusieurs types de données.

Excellence opérationnelle

L’excellence opérationnelle couvre les processus d’exploitation qui déploient une application et maintiennent son fonctionnement en production. Pour plus d’informations, consultez la liste de contrôle de l'examen de la conception pour l'excellence opérationnelle. Le modèle d’application web fiable implémente l’infrastructure en tant que code pour les déploiements d’infrastructure et la surveillance pour l’observabilité.

Configuration de l’analyse

Vous devez activer la journalisation pour diagnostiquer l’échec d’une requête de suivi et de débogage. Les données de télémétrie que vous collectez à partir de votre application doivent répondre à ses besoins opérationnels. Au minimum, vous devez collecter des données de télémétrie sur les métriques de base. Collectez des informations sur le comportement des utilisateurs qui peuvent vous aider à appliquer des améliorations ciblées.

Surveiller les métriques de référence

La charge de travail doit surveiller les métriques de base. Les indicateurs de performance importants à mesurer incluent le débit des requêtes, la durée moyenne des requêtes, les erreurs et la surveillance des dépendances. Vous devez utiliser Application Insights pour collecter ces données de télémétrie.

Exemple : L’implémentation de référence utilise Application Insights. Application Insights est activé via Terraform dans le cadre de la configuration app_settings d’App Service.

app_settings = {
    APPLICATIONINSIGHTS_CONNECTION_STRING = var.app_insights_connection_string
    ApplicationInsightsAgent_EXTENSION_VERSION = "~3"
    ...
}

Spring Boot enregistre plusieurs indicateurs de performance de base dans Application Insights, telles que la machine virtuelle Java (JVM), le processeur, Tomcat et d’autres. Application Insights collecte automatiquement à partir d’infrastructures de journalisation tels que Log4j et Logback. Pour plus d'informations, consultez les pages suivantes :

Créer des données de télémétrie et des métriques personnalisées en fonction des besoins

En plus des indicateurs de performance de base dans Application Insights, vous devez créer des données de télémétrie personnalisées pour mieux comprendre vos utilisateurs et leurs interactions avec votre application. Application Insights vous permet de collecter des données de télémétrie personnalisées et vous pouvez également collecter des indicateurs de performance personnalisés via Micrometer. L’objectif est d’obtenir des aperçus plus approfondis sur les performances et le comportement des utilisateurs de votre application, afin que vous puissiez prendre des décisions plus éclairées et mettre en place des améliorations.

Collecter des métriques basées sur les journaux

Suivez les métriques basées sur les journaux pour obtenir une meilleure visibilité sur l’intégrité et les métriques essentielles de l’application. Vous pouvez utiliser des requêtes Langage de requête Kusto (KQL) dans Application Insights pour rechercher et organiser des données. Pour plus d’informations, consultez Indicateurs de performance basés sur un journal d’Azure Application Insights et Indicateurs de performance pré-agrégés et basés sur le journal dans Application Insights.

Activer les diagnostics de plateforme

Un paramètre de diagnostic dans Azure vous permet de spécifier les journaux et les indicateurs de performance de plateforme que vous souhaitez collecter et où les stocker. Les journaux de plateforme sont des journaux intégrés qui fournissent des informations de diagnostic et d’audit. Vous pouvez activer les diagnostics de plateforme pour la plupart des services Azure, mais chaque service définit ses propres catégories de journaux. Différents services Azure ont des catégories de journaux à choisir.

  • Activer les diagnostics pour tous les services pris en charge. Les services Azure créent automatiquement des journaux de plateforme, mais le service ne les stocke pas automatiquement. Vous devez activer le paramètre de diagnostic pour chaque service, et vous devez l’activer pour chaque service Azure qui prend en charge les diagnostics.

  • Envoyez les diagnostics à la même destination que les journaux d’application. Lorsque vous activez les diagnostics, vous choisissez les journaux que vous souhaitez collecter et où les envoyer. Vous devez envoyer les journaux de plateforme à la même destination que les journaux d’application afin de pouvoir mettre en corrélation les deux jeux de données.

Exemple : L’implémentation de référence utilise Terraform pour activer les diagnostics Azure sur tous les services pris en charge. Le code Terraform suivant permet de configurer les paramètres de diagnostic pour App Service.

# Configure Diagnostic Settings for App Service
resource "azurerm_monitor_diagnostic_setting" "app_service_diagnostic" {
  name                           = "app-service-diagnostic-settings"
  target_resource_id             = azurerm_linux_web_app.application.id
  log_analytics_workspace_id     = var.log_analytics_workspace_id
  #log_analytics_destination_type = "AzureDiagnostics"

  enabled_log {
    category_group = "allLogs"

  }

  metric {
    category = "AllMetrics"
    enabled  = true
  }
}

Utiliser un pipeline CI/CD

Pour automatiser vos déploiements, intégrez un pipeline d’intégration continue/de déploiement continu (CI/CD). Cette automatisation doit s’étendre directement du contrôle de code source à vos différents environnements App Service, notamment les tests, la préproduction et la production. Utilisez Azure Pipelines si vous utilisez Azure DevOps ou GitHub Actions pour les projets GitHub.

  • Intégrez des tests unitaires. Octroyez la priorité à l'exécution et à la réussite de tous les tests unitaires (à l'aide de JUnit) au sein de votre pipeline avant tout déploiement vers App Services. Intégrez des outils de qualité et de couverture du code tels que SonarQube et JaCoCo pour une couverture complète des tests.

  • Adoptez le framework de simulation Java. Pour les tests impliquant des points de terminaison externes, utilisez des frameworks de simulation Java (Mockito, EasyMock). Ces frameworks vous permettent de créer des points de terminaison simulés. Ils évitent d'avoir à configurer des points de terminaison externes réels et de garantir des conditions de test uniformes dans les environnements.

  • Effectuez des analyses de sécurité. Procédez à des tests statiques de sécurité des applications (SAST) pour détecter les failles de sécurité et les erreurs de codage dans votre code source. En outre, il convient de procéder à une analyse de composition logicielle (SCA) afin d'examiner les bibliothèques et composants tiers à la recherche de risques de sécurité. Les outils permettant ces analyses peuvent être facilement intégrés à GitHub et Azure DevOps.

Administrer les déploiements de production

Vous devez établir des instructions pour le déploiement du code en production et créer un processus d’approbation pour tous les déploiements de production.

Efficacité des performances

L’efficacité des performances est la capacité de votre charge de travail à s’adapter à la demande des utilisateurs de façon efficace. Pour en savoir plus, consultez la documentation relative à la liste de vérification de l'examen de la conception pour l'efficacité des performances. Le modèle d’application web fiable utilise le modèle Cache-Aside pour réduire la latence des données soumises à de nombreuses requêtes.

Utiliser le modèle Cache-Aside

Le modèle Cache-Aside est une stratégie de mise en cache qui améliore la gestion des données en mémoire. Ce modèle confie à l'application la responsabilité de traiter les requêtes de données et d'assurer la cohérence entre le cache et un stockage persistant, tel qu'une base de données. Lorsque l'application web reçoit une requête de données, elle effectue d'abord une recherche dans le cache. Si les données sont introuvables, elle les récupère dans la base de données, répond à la requête et met à jour le cache en conséquence. Cette approche permet de diminuer les temps de réponse, d'améliorer le débit et de réduire la nécessité d'une mise à l'échelle plus importante. Elle renforce également la disponibilité du service en réduisant la charge sur le magasin de données principal et en minimisant les risques de panne.

Activer la mise en cache

Pour activer la mise en cache, ajoutez le package spring-boot-starter-cache en tant que dépendance dans votre fichier pom.xml. Le package spring-boot-starter-cache configure le cache Redis avec les valeurs par défaut. Vous devez mettre à jour ces valeurs dans le fichier application.properties ou les variables d’environnement pour répondre aux besoins de votre application web. Par exemple, le spring.cache.redis.time-to-live (représenté en millisecondes) détermine la durée pendant laquelle les données restent dans le cache avant l’éviction. Vous devez fournir une valeur qui répond aux besoins de votre application web. Enfin, vous devez mettre en cache les données requises dans votre code à l’aide de l’annotation @Cacheable.

Mettre en cache les données les plus nécessaires

Donnez la priorité à la mise en cache des données les plus fréquemment consultées. Identifiez les points de données clés qui favorisent l'engagement utilisateur et les performances du système. Implémentez des stratégies de mise en cache pour ces zones spécifiques afin d'optimiser l'efficacité du modèle Cache-Aside, en réduisant de manière significative la latence et la charge de la base de données. Utilisez Azure Monitor pour effectuer le suivi du processeur, de la mémoire et du stockage de la base de données. Ces métriques vous aident à déterminer si vous pouvez utiliser une référence SKU de base de données plus petite.

Conserver les données du cache à jour

Planifiez des mises à jour régulières du cache pour le synchroniser avec les dernières modifications de la base de données. Déterminez la fréquence d’actualisation optimale en fonction de la volatilité des données et des besoins des utilisateurs. Cette pratique garantit que l'application utilise le modèle Cache-Aside pour fournir à la fois un accès rapide et des informations à jour.

Garantir la cohérence des données

Implémentez des mécanismes pour mettre immédiatement à jour le cache après une opération d'écriture dans la base de données. Pour garantir la cohérence du cache, utilisez des mises à jour basées sur les événements ou des classes de gestion de données dédiées. La synchronisation cohérente du cache avec les modifications de la base de données est au cœur du modèle Cache-Aside.

Exemple : Le code suivant ajoute le package spring-boot-starter-cache en tant que dépendance au fichier pom.xml pour activer la mise en cache.

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-cache</artifactid>
</dependency>

L’implémentation de référence active Redis dans le fichier application.properties.

# Redis
spring.data.redis.ssl.enabled=true
spring.session.redis.namespace=spring:session

Le code suivant définit une méthode appelée getAccountDetail. La méthode récupère les paramètres utilisateur associés à un nom d’utilisateur donné. Le @Cacheable(value="account-details", key="#id") annote la méthode getAccountDetailet indique à l’application web de mettre en cache les paramètres utilisateur.

    @Cacheable(value="account-details", key="#id")
    public AccountDetail getAccountDetail(Long id) {
        Optional<Account> optionalAccount = accountRepository.findById(id);
        if (optionalAccount.isEmpty()) {
            throw new IllegalArgumentException("Account ID " + id + " does not exist");
        }

        Account account = optionalAccount.get();
        AccountDetail accountDetail = mapToAccountDetail(account);

        return accountDetail;
    }

Performances de la base de données

Les performances de la base de données peuvent affecter les performances et la scalabilité d’une application. Il est important de tester les performances de votre base de données pour vous assurer qu’elle est optimisée. Les principales considérations à prendre en compte incluent le choix de la région cloud appropriée, le regroupement de connexions, le modèle de mise en cache de côté et l’optimisation des requêtes.

  • Tester les tronçons réseau. Le déplacement d’une application vers le cloud peut introduire des tronçons réseau et une latence supplémentaires dans votre base de données. Vous devez tester les tronçons supplémentaires introduits par le nouvel environnement cloud.

  • Établissez un niveau de référence en matière de performances. Vous devez utiliser des indicateurs locaux de performances comme base de référence initiale pour comparer les performances des applications dans le cloud.

  • Utiliser Application Insights. Application Insights fournit des mesures détaillées sur les requêtes de base de données et toutes les interfaces JDBC. Vous devez l’utiliser pour vous assurer qu’une base de données portée respecte ses SLA ou pour trouver les requêtes que vous devez régler. Vous ne devez jamais utiliser Dynamic SQL car cela crée des problèmes de sécurité et de performances.

  • Utiliser des pools de connexions. Vous devez utiliser des pools de connexions JDBC et les affiner en fonction des mesures de transactions par seconde (TPS) et des contrats SLA. Vous devez utiliser les outils d’analyse des performances de base de données pour tester et évaluer les performances de la base de données sous charge.

Étapes suivantes

Déployez l’implémentation de référence en suivant les instructions du référentiel GitHub. Utilisez les ressources suivantes pour en savoir plus sur les bonnes pratiques et la migration cloud.

Meilleures pratiques du cloud. Pour obtenir des conseils sur l’adoption et l’architecture d’Azure, consultez :

  • Cloud Adoption Framework. Une infrastructure peut aider votre organisation à préparer et à exécuter une stratégie pour générer des solutions sur Azure.
  • Well-Architected Framework. Un ensemble de principes directeurs permettant d’améliorer la qualité d’une charge de travail.

Pour les applications qui nécessitent un objectif de niveau de service (SLO) supérieur, consultez Charges de travail stratégiques.

Conseils relatifs à la migration. Les outils et ressources suivants peuvent vous aider à migrer des ressources locales vers Azure :

  • Azure Migrate fournit un service simplifié de migration, de modernisation et d’optimisation pour Azure qui gère l’évaluation et la migration des applications web, des SQL Server et des machines virtuelles.
  • Les guides de migration Azure Database fournissent des ressources pour différents types de bases de données et différents outils conçus pour votre scénario de migration.
  • Azure App Service accélérateur de zone d’atterrissage fournit des conseils pour le renforcement et la mise à l’échelle des déploiements App Service.