Patrón de aplicaciones web fiables para Java: aplicar el modelo

Azure App Service
Azure Front Door
Azure Cache for Redis
Biblioteca de autenticación de Microsoft para Java

En este artículo se muestra cómo aplicar el patrón Reliable Web App. El patrón Reliable Web App es un conjunto de principios y técnicas de implementación que definen cómo se deben modificar las aplicaciones web (plataforma) al migrar a la nube. Se centra en las actualizaciones mínimas de código que hay que hacer para tener éxito en la nube.

Para facilitar la aplicación de esta guía, hay una implementación de referencia del patrón Reliable Web App que puede implementar.

Diagrama en el que se muestra la arquitectura de la implementación de referencia.Arquitectura de la implementación de referencia. Descargue un archivo de Visio de esta arquitectura.

En las siguientes instrucciones se usa la implementación de referencia como ejemplo. Para aplicar el patrón Reliable Web App, siga estas recomendaciones alineadas con los pilares del marco de trabajo bien diseñado:

Confiabilidad

La confiabilidad garantiza que la aplicación pueda cumplir los compromisos contraídos con los clientes. Para obtener más información, consulte Lista de comprobación de la revisión del diseño para la confiabilidad. El patrón Reliable Web App presenta dos patrones de diseño clave en el nivel de código para mejorar la confiabilidad: el patrón Retry y el patrón Circuit Breaker.

Usar el patrón Retry

El patrón Retry se ocupa de las interrupciones temporales del servicio, denominados fallos transitorios, que suelen resolverse en cuestión de segundos. Estos errores suelen deberse a la limitación del servicio, la distribución dinámica de la carga y los problemas de red en entornos de nube. La implementación del patrón Retry implica reenviar solicitudes con errores, lo que permite retrasos e intentos configurables antes de lanzar una excepción.

Use Resilience4j para implementar el patrón Retry en Java. Resilience4j es una biblioteca ligera de tolerancia a errores. Proporciona funciones de orden superior (decoradores) para mejorar las interfaces funcionales, las expresiones lambda y las referencias a métodos con un patrón de diseño Circuit Breaker, Rate Limiter, Retry o Bulkhead.

Ejemplo: La implementación de referencia agrega el patrón Retry mediante la decoración del método listServicePlans del controlador de plan de servicio con las anotaciones de Retry. El código reintenta la llamada a una lista de planes de servicio de la base de datos si se produce un error en la llamada inicial.

    @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";
    }

La implementación de referencia configura la directiva de reintentos, incluidos los intentos máximos, la duración de la espera y las excepciones que se deben reintentar. La directiva de reintentos está configurada en application.properties. Para obtener más información, consulte la documentación de Resilience4j. Puede simular el patrón Retry en la implementación de referencia.

Uso del patrón Circuit Breaker

El emparejamiento de los patrones Retry y Circuit Breaker expande la capacidad de una aplicación para controlar las interrupciones del servicio que no están relacionadas con errores transitorios. El patrón Circuit Breaker impide que una aplicación intente acceder continuamente a un servicio que no responde. El patrón Circuit Breaker libera la aplicación y evita desperdiciar ciclos de CPU para que la aplicación conserve su integridad de rendimiento para los usuarios finales. Para obtener más información, consulte la documentación de Spring Circuit Breaker y Resilience4j.

Ejemplo: la implementación de referencia implementa el patrón Circuit Breaker mediante la decoración de métodos con el atributo Circuit Breaker. Puede simular el patrón Circuit Breaker en la implementación de referencia.

Seguridad

La seguridad proporciona garantías contra ataques deliberados y el abuso de datos y sistemas valiosos. Para obtener más información, consulte Lista de comprobación de la revisión del diseño para la seguridad. El patrón Reliable Web App usa identidades administradas para implementar la seguridad centrada en la identidad. Los puntos de conexión privados, el firewall de aplicaciones web y el acceso restringido a la aplicación web proporcionan una entrada segura.

Conceda los privilegios mínimos

Para garantizar la seguridad y la eficiencia, conceda solo a los usuarios (identidades de usuario) y a los servicios de Azure (identidades de carga de trabajo) los permisos que necesitan.

Asigne permisos a las identidades de usuario

Evalúe las necesidades de la aplicación para definir un conjunto de roles que cubran todas las acciones del usuario sin superposición. Asigne cada usuario al rol más adecuado. Asegúrese de que solo tienen acceso a lo necesario para sus tareas.

Asigne permisos a las identidades de carga de trabajo

Conceda solo los permisos críticos para las operaciones, como acciones CRUD en bases de datos o acceso a secretos. Los permisos de identidad de carga de trabajo son persistentes, por lo que no puede proporcionar permisos Just-In-Time o a corto plazo a las identidades de carga de trabajo.

  • Control de acceso basado en rol (RBAC) preferido. Comience siempre con Azure RBAC para asignar permisos. Ofrece un control preciso, lo que garantiza que el acceso sea auditable y granular. Use Azure RBAC para conceder solo los permisos necesarios para que el servicio realice sus funciones deseadas.

  • Complemente con controles de acceso de nivel de servicio de Azure. Si Azure RBAC no cubre un escenario específico, complemente con las directivas de acceso de nivel de servicio de Azure.

Para más información, vea:

Configure la autenticación y la autorización

La autenticación y autorización son aspectos críticos de la seguridad de la aplicación web. La Autenticación es el proceso de verificación de un usuario. La Autorización especifica las acciones que un usuario puede realizar en la aplicación. El objetivo es implementar la autenticación y autorización sin debilitar la posición de seguridad. Para cumplir este objetivo, debe usar las características de la plataforma de aplicaciones de Azure (Azure App Service) y el proveedor de identidades (Microsoft Entra ID).

Configurar autenticación de usuario

Proteja la aplicación web habilitando la autenticación de usuarios a través de las características de la plataforma. App de Azure Service admite la autenticación con proveedores de identidades como Microsoft Entra ID, descargando la carga de trabajo de autenticación desde el código.

Ejemplo: la implementación de referencia usa Microsoft Entra ID como plataforma de identidad. Microsoft Entra ID requiere un registro de aplicación en el inquilino principal. El registro de la aplicación garantiza que los usuarios que obtienen acceso a la aplicación web tienen identidades en el inquilino principal. El siguiente código de Terraform crea un registro de aplicación en Entra ID junto con un rol específico de Administrador de cuentas de la aplicación.

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 almacena de forma segura los datos de configuración de nuestro cliente y la plataforma de App Service expone la información a nuestra aplicación como variables de entorno.

Integre con los proveedores de identidades

Integre su aplicación web con Microsoft Entra ID para disponer de una autenticación y autorización seguras. Spring Boot Starter for Microsoft Entra ID simplifica este proceso utilizando Spring Security y Spring Boot para facilitar la configuración. Ofrece diversos flujos de autenticación, administración automática de tokens y directivas de autorización personalizables, junto con funcionalidades de integración con componentes de Spring Cloud. Esto permite una integración sencilla de Microsoft Entra ID y OAuth 2.0 en aplicaciones de Spring Boot sin la configuración manual de la biblioteca o la configuración.

Ejemplo: la implementación de referencia usa la plataforma de identidad de Microsoft (Microsoft Entra ID) como proveedor de identidades para la aplicación web. Usa la concesión de código de autorización de OAuth 2.0 para iniciar una sesión de usuario con una cuenta de Microsoft Entra. El siguiente fragmento XML define las dos dependencias necesarias del flujo de concesión de código de autorización de OAuth 2.0. La dependencia com.azure.spring: spring-cloud-azure-starter-active-directory habilita la autenticación y autorización de Microsoft Entra en una aplicación de Spring Boot. La dependencia org.springframework.boot: spring-boot-starter-oauth2-client admite la autenticacióny autorizació OAuth 2.0 en una aplicación de 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>

Para más información, consulte Compatibilidad de Spring Cloud en Azure para Spring Security.

Implemente reglas de negocio de autenticación y autorización

La implementación de reglas de negocio de autenticación y autorización implica definir las directivas de control de acceso y los permisos para diversas funcionalidades y recursos de la aplicación. Debe configurar Spring Security para usar Spring Boot Starter para Microsoft Entra ID. Esta biblioteca permite la integración con Microsoft Entra ID y le ayuda a garantizar que los usuarios se autentiquen de forma segura. La configuración y habilitación de la biblioteca de autenticación de Microsoft (MSAL) proporciona acceso a más características de seguridad. Estas características incluyen el almacenamiento en caché de tokens y la actualización automática de tokens.

Ejemplo: la implementación de referencia crea roles de aplicación que reflejan los tipos de roles de usuario en el sistema de administración de cuentas de Contoso Fiber. Los roles se traducen a permisos durante la autorización. Entre los ejemplos de roles específicos de la aplicación en CAMS se incluyen el administrador de cuentas, el representante de soporte técnico de nivel uno (L1) y el representante de Field Service. El rol Administrador de cuentas tiene permisos para agregar nuevos usuarios y clientes de la aplicación. Un representante de Field Service puede crear incidencias de soporte técnico. El atributo PreAuthorize restringe el acceso a roles específicos.

    @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";
    }
    ...

Para integrarse con Microsoft Entra ID, la implementación de referencia usa el flujo de concesión de código de autorización de OAuth 2.0. Este flujo permite a un usuario iniciar sesión con una cuenta Microsoft. En el fragmento de código siguiente se muestra cómo configurar SecurityFilterChain para usar Microsoft Entra ID para la autenticación y la autorización.

@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();
    }
}
...

Para más información, vea:

Configure la autenticación y autorización del servicio

Configure la autenticación y autorización de servicios para que los servicios de su entorno tengan los permisos para realizar las funciones necesarias. Use Identidades administradas en Microsoft Entra ID para automatizar la creación y administración de identidades de servicio, lo que elimina la administración manual de credenciales. Una identidad administrada permite que la aplicación web acceda de forma segura a los servicios de Azure, como Azure Key Vault y las bases de datos. También facilita las integraciones de canalización de CI/CD para las implementaciones en Azure Service App. Sin embargo, en escenarios como implementaciones híbridas o con sistemas heredados, siga usando las soluciones de autenticación locales para simplificar la migración. Transición a identidades administradas cuando el sistema está listo para un enfoque moderno de administración de identidades. Para más información, consulte Supervisión de identidades administradas.

Ejemplo: la implementación de referencia mantiene el mecanismo de autenticación local para la base de datos (nombre de usuario y contraseña). Como resultado, la implementación de referencia almacena el secreto de base de datos en Key Vault. La aplicación web usa una identidad administrada (asignada por el sistema) para recuperar secretos de Key Vault.

Uso de un almacén de secretos central para administrar secretos

Al mover la aplicación a la nube, use Azure Key Vault para almacenar de forma segura todos estos secretos. Este repositorio centralizado ofrece almacenamiento seguro, rotación de claves, auditoría de acceso y supervisión para servicios que no admiten identidades administradas. En el caso de las configuraciones de la aplicación, se recomienda Azure App Configuration.

Ejemplo: la implementación de referencia almacena los siguientes secretos en Key Vault: (1) el nombre de usuario y la contraseña de la base de datos PostgreSQL, (2) la contraseña de Redis Cache y (3) el secreto de cliente para Microsoft Entra ID asociado a la implementación de MSAL.

No coloque Key Vault en el flujo de solicitud HTTP

desde Key Vault al inicio de la aplicación en lugar de durante cada solicitud HTTP. Key Vault está diseñado para almacenar y recuperar datos confidenciales de forma segura durante la implementación. El acceso de alta frecuencia dentro de las solicitudes HTTP puede superar las funcionalidades de rendimiento de Key Vault, lo que provoca limitaciones en las solicitudes y errores de código de estado HTTP 429. Para obtener más información, consulte Límites de transacciones de Key Vault.

Use un método para acceder a secretos en Key Vault

Al configurar una aplicación web para acceder a los secretos en Key Vault, tiene dos opciones principales:

  • Configuración de la aplicación de App Service: use una configuración de aplicación en App Service para inyectar el secreto directamente como una variable de entorno.

  • Referencia directa del secreto: haga referencia directamente al secreto dentro del código de la aplicación. Agregue una referencia específica en el archivo de propiedades de la aplicación, como application.properties para aplicaciones Java, para que la aplicación se comunique con Key Vault.

Es importante elegir uno de estos métodos y ceñirse a él para simplificar y evitar complejidades innecesarias. Para integrar Key Vault con una aplicación Spring, el proceso implica:

  1. Agregar la dependencia Azure Spring Boot Starter para Azure Key Vault Secrets en su archivo pom.xml.
  2. Configurar un punto de conexión de Key Vault en la aplicación. Esto se puede hacer a través del archivo application.properties o como una variable de entorno.

Ejemplo: la implementación de referencia usa una configuración de aplicación en App Service e inyecta secretos.

Usar puntos de conexión privados

Use puntos de conexión privados en todos los entornos de producción para todos los servicios de Azure compatibles. Los puntos de conexión privados proporcionan conexiones privadas entre los recursos de una red virtual de Azure y los servicios de Azure. De forma predeterminada, la comunicación a la mayoría de los servicios de Azure cruza la red pública de Internet. Los puntos de conexión privados no requieren ningún cambio de código, configuraciones de aplicaciones ni cadenas de conexión. Para más información, consulte Creación de un punto de conexión privado y Procedimientos recomendados para la seguridad de los puntos de conexión.

Ejemplo: la implementación de referencia usa puntos de conexión privados para Key Vault, Azure Cache for Redis y Azure Database for PostgreSQL.

Uso de una firewall de aplicaciones web

Todo el tráfico entrante de Internet a la aplicación web debe pasar a través de un firewall de aplicaciones web para protegerse contra vulnerabilidades de seguridad web comunes. Obligue a todo el tráfico entrante de Internet a pasar a través del equilibrador de carga público, si tiene uno, y el firewall de aplicaciones web. Puede (1) usar el punto de conexión privado de Azure Front Door o (2) puede filtrar las solicitudes por el X-Azure-FDID valor de encabezado.

La plataforma App Service y Java Spring pueden filtrar por valor de encabezado. Debe usar App Service como primera opción. El filtrado en el nivel de plataforma impide que las solicitudes no deseadas lleguen al código. Debe configurar qué tráfico desea que pase a través del firewall de aplicaciones web. Puede filtrar según el nombre de host, la dirección IP del cliente y otros valores. Para más información, consulte Conservar el nombre de host HTTP original

Ejemplo: la implementación de referencia usa un punto de conexión privado en el entorno de producción y el valor del encabezado X-Azure-FDID en el entorno de desarrollo.

Configurar seguridad de base de datos

El acceso de nivel de administrador a la base de datos concede permisos para realizar operaciones con privilegios. Las operaciones con privilegios incluyen la creación y eliminación de bases de datos, la modificación de esquemas de tabla o el cambio de permisos de usuario. A menudo, los desarrolladores necesitan acceso de nivel de administrador para mantener la base de datos o solucionar problemas.

  • Evite los permisos elevados permanentes. Conceda a los desarrolladores acceso Just-in-Time para realizar operaciones con privilegios. Con el acceso Just-In-Time, los usuarios reciben permisos temporales para realizar tareas con privilegios.

  • No asigne permisos elevados a la aplicación. No conceda acceso de nivel de administrador a la identidad de la aplicación. Configure el acceso con privilegios mínimos de la aplicación a la base de datos. Esto limita el radio de explosión de errores y las infracciones de seguridad. Tiene dos métodos principales para acceder a la base de datos de Azure PostgreSQL. Puede usar la autenticación de Microsoft Entra o la autenticación de PostgreSQL. Para más información, consulte JDBC con Azure PostgreSQL.

Optimización de costos

La optimización de costos trata de buscar formas de reducir los gastos innecesarios y los gastos generales de gestión. Para obtener más información, consulte Lista de comprobación de la revisión del diseño para la optimización de costes. El patrón Reliable Web App implementa técnicas de redimensionamiento, escalado automático y uso eficiente de recursos para una aplicación web de coste más optimizado.

Dimensión correcta de los recursos para cada entorno

Comprenda los diferentes niveles de rendimiento de los servicios de Azure y use solo la SKU adecuada para las necesidades de cada entorno. Los entornos de producción necesitan SKU que cumplan los acuerdos de nivel de servicio (SLA), las características y la escala necesarias para producción. Los entornos que no son de producción normalmente no necesitan las mismas funcionalidades. Para ahorrar más, considere las Opciones de precios de desarrollo/pruebas de Azure, las Reservas de Azure y los Planes de ahorro de Azure para proceso.

Ejemplo: la implementación de referencia no usa los precios de desarrollo/pruebas de Azure, ya que no cubren ninguno de los componentes. Azure Database for PostgreSQL es un candidato ideal para una instancia reservada si tenemos en cuenta el plan para seguir con este motor de base de datos durante al menos un año tras esta fase inicial de convergencia en la nube. La implementación de referencia tiene un parámetro opcional que implementa diferentes SKU. Un parámetro de entorno indica a la plantilla de Terraform que seleccione las SKU de desarrollo. En el código siguiente se muestra este parámetro de entorno.

azd env set APP_ENVIRONMENT prod

Contoso Fiber usa plantillas de infraestructura como código (IaC) para las implementaciones de desarrollo y producción. El entorno de desarrollo está optimizado en costes, ya que usa las SKU menos costosas necesarias para el desarrollo de aplicaciones. El entorno de producción usa las SKU que cumplen los requisitos del objetivos de nivel de servicio de producción de la aplicación.

Uso de escalabilidad automática

El escalado automático automatiza el escalado horizontal para entornos de producción. Escalabilidad automática basada en métricas de rendimiento. Los desencadenadores de rendimiento de uso de CPU son un buen punto de partida si no entiende los criterios de escalado de la aplicación. Debe configurar y adaptar los desencadenadores de escalado (CPU, RAM, red y disco) para que se correspondan con el comportamiento de la aplicación web. No escale verticalmente para hacer frente a los cambios frecuentes de la demanda. Es menos rentable. Para obtener más información, consulte Escalado en Azure App Service y Escalabilidad automática en Microsoft Azure.

Usar los recursos de manera eficiente

El uso eficiente de los recursos implica la administración estratégica y la asignación de recursos en la nube para satisfacer las necesidades de la organización sin derroches. Minimiza el gasto innecesario de recursos y los gastos generales de gestión. Para mejorar la eficiencia de los recursos, siga estas recomendaciones:

  • Use servicios compartidos. Centralizar y compartir determinados recursos permite optimizar los costes y reducir los gastos generales de gestión. Por ejemplo, coloque recursos de red compartidos en la red virtual del concentrador.

  • Elimine los entornos que no utilice. Elimine los entornos que no son de producción después de unas horas o durante los días festivos para optimizar el coste. Puede utilizar la infraestructura como código para eliminar recursos de Azure y entornos completos. Elimine la declaración del recurso que desea eliminar de su plantilla de infraestructura como código. Realice una copia de seguridad de los datos que necesita más adelante. Comprenda las dependencias del recurso que va a eliminar. Si hay dependencias, es posible que también tenga que actualizar o quitar esos recursos.

  • Coloque la funcionalidad. Cuando haya capacidad de sobra, coloque los recursos y la funcionalidad de la aplicación en un único recurso de Azure. Por ejemplo, varias aplicaciones web pueden usar un único servidor (plan de App Service) o una sola caché puede admitir varios tipos de datos.

Excelencia operativa

La excelencia operativa abarca los procesos de las operaciones que implementan una aplicación y la mantienen en ejecución en producción. Para obtener más información, consulte la Lista de comprobación de revisión de diseño para la excelencia operativa. El patrón Reliable Web App implementa la infraestructura como código para las implementaciones de infraestructura y la supervisión de la observabilidad.

Configuración de la supervisión

Para trazas y depuración, debe habilitar el registro para diagnosticar cuando una solicitud falle. La telemetría que recopile de la aplicación debe satisfacer sus necesidades operativas. Como mínimo, debe recopilar datos de telemetría en las métricas de línea base. Recopile información sobre el comportamiento del usuario que puede ayudarle a aplicar mejoras dirigidas.

Supervisión de as métricas de línea base

La carga de trabajo debe supervisar las métricas de línea base. Entre las métricas importantes para medir se incluyen el rendimiento de las solicitudes, la duración media de la solicitud, los errores y la supervisión de dependencias. Le recomendamos que use Application Insights para recopilar esta telemetría.

Ejemplo: la implementación de referencia usa Application Insights. Application Insights se habilita a través de Terraform como parte de la configuración app_settings de App Service.

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

Spring Boot registra numerosas métricas principales en Application Insights, como la máquina virtual Java (JVM), la CPU, Tomcat y otros. Application Insights recopila automáticamente de plataformas de registro como Log4j y Logback. Para más información, consulte:

Crear telemetría y métricas personalizadas según sea necesario

Además de las métricas de línea de base en Application Insights, debe crear telemetría personalizada para comprender mejor a los usuarios y sus interacciones con la aplicación. Application Insights le permite recopilar telemetría personalizada y también puede recopilar métricas personalizadas a través de Micrometer. El objetivo es obtener información más detallada sobre el rendimiento de la aplicación y el comportamiento del usuario para poder tomar decisiones más informadas y realizar mejoras.

Recopilar métricas basadas en registros

Realice un seguimiento de las métricas basadas en registros para obtener más visibilidad sobre el estado y las métricas esenciales de la aplicación. Puede usar consultas de Lenguaje de consulta Kusto (KQL) en Application Insights para buscar y organizar los datos. Para más información, consulte Métricas basadas en registros de Azure Application Insights y Métricas basadas en registros y preagregadas en Application Insights.

Habilite los diagnósticos de plataforma

Una configuración de diagnóstico en Azure le permite especificar los registros y las métricas de la plataforma que desea recopilar y dónde almacenarlos. Los registros de plataforma son registros integrados que proporcionan información de diagnóstico y auditoría. Puede habilitar los diagnósticos de plataforma para la mayoría de los servicios de Azure, pero cada servicio define sus propias categorías de registro. Los distintos servicios de Azure tienen categorías de registro para elegir.

  • Habilite los diagnósticos para todos los servicios admitidos. Los servicios de Azure crean registros de plataforma automáticamente, pero el servicio no los almacena automáticamente. Necesita habilitar la configuración de diagnóstico para cada servicio y debe habilitarla para cada servicio de Azure que admita diagnósticos.

  • Envíe diagnósticos al mismo destino que los registros de la aplicación. Al habilitar los diagnósticos, elige los registros que desea recopilar y dónde enviarlos. Debe enviar los registros de la plataforma al mismo destino que los registros de aplicación para poder correlacionar los dos conjuntos de datos.

Ejemplo: la implementación de referencia usa Terraform para habilitar los diagnósticos de Azure en todos los servicios compatibles. El siguiente código de Terraform configura las opciones de diagnóstico de 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
  }
}

Use una canalización CI/CD

Para automatizar las implementaciones, integre una canalización de integración continua e implementación continua (CI/CD). Esta automatización debe extenderse desde el control de código fuente directamente a los distintos entornos de App Service, incluidos los entornos de prueba, ensayo y producción. Use Azure Pipelines si está trabajando con Azure DevOps o GitHub Actions para proyectos de GitHub.

  • Integre las pruebas de unidades. Priorice la ejecución y el paso de todas las pruebas unitarias (mediante JUnit) dentro de la canalización antes de cualquier implementación en App Services. Incorpore herramientas de cobertura y calidad del código como SonarQube y JaCoCo para lograr una cobertura de pruebas exhaustiva.

  • Adopte el marco de trabajo ficticio de Java. Para las pruebas que implican puntos de conexión externos, use marcos ficticios de Java (Mockito, EasyMock). Estos marcos permiten crear puntos de conexión simulados. Eliminan la necesidad de configurar puntos de conexión externos reales y garantizar condiciones de prueba uniformes en entornos.

  • Realice exámenes de seguridad. Use pruebas estáticas de seguridad de aplicaciones (SAST) para buscar errores de seguridad y errores de codificación en el código fuente. Además, realice análisis de composición de software (SCA) para examinar bibliotecas y componentes de terceros para detectar riesgos de seguridad. Las herramientas para estos análisis se integran fácilmente en GitHub y Azure DevOps.

Controlar las implementaciones de producción

Necesita establecer directrices para implementar código en producción y crear un proceso de aprobación para todas las implementaciones de producción.

Eficiencia del rendimiento

La eficiencia del rendimiento es la capacidad que tiene la carga de trabajo para escalar con el fin de satisfacer de manera eficiente las demandas que los usuarios hayan realizado sobre ella. Para obtener más información, consulte la Lista de comprobación de la revisión del diseño para la eficiencia. El patrón Reliable Web App usa el patrón Cache-Aside para minimizar la latencia de los datos altamente solicitados.

Uso del patrón Cache-Aside

El patrón Cache-Aside es una estrategia de almacenamiento en caché que mejora la administración de datos en memoria. El patrón asigna a la aplicación la responsabilidad de gestionar las solicitudes de datos y garantizar la coherencia entre la caché y un almacenamiento persistente, como una base de datos. Cuando la aplicación web recibe una solicitud de datos, primero busca en la caché. Si faltan los datos, los recupera de la base de datos, responde a la solicitud y actualiza la caché en consecuencia. Este planteamiento acorta los tiempos de respuesta y mejora el rendimiento, además de reducir la necesidad de aumentar la escala. También refuerza la disponibilidad del servicio al reducir la carga del almacén de datos primario y minimizar los riesgos de interrupción.

Habilitar el almacenamiento en caché

Para habilitar el almacenamiento en caché, agregue el paquete spring-boot-starter-cache como una dependencia en el archivo pom.xml. El paquete spring-boot-starter-cache configura la caché de Redis con valores predeterminados. Debe actualizar esos valores en el archivo application.properties o las variables de entorno para satisfacer las necesidades de su aplicación web. Por ejemplo, spring.cache.redis.time-to-live (representado en milisegundos) determina la cantidad de tiempo que los datos permanecen en la memoria caché antes de la expulsión. Debe proporcionar un valor que satisfaga las necesidades de la aplicación web. Por último, debe almacenar en caché los datos necesarios en el código mediante la anotación @Cacheable.

Almacenamiento en caché de datos de alta necesidad

Priorice el almacenamiento en caché de los datos a los que se accede con más frecuencia. Identifique los puntos de datos clave que impulsan la involucración del usuario y el rendimiento del sistema. Implemente estrategias de almacenamiento en caché específicamente para estas áreas para optimizar la eficacia del patrón Cache-Aside, lo que reduce significativamente la latencia y la carga de la base de datos. Use Azure Monitor para realizar un seguimiento de la CPU, la memoria y el almacenamiento de la base de datos. Estas métricas le ayudan a determinar si puede usar una SKU de base de datos más pequeña.

Mantener actualizados los datos de la memoria caché

Programe actualizaciones de caché periódicas para sincronizarse con los cambios más recientes en la base de datos. Determine la velocidad de actualización óptima en función de la volatilidad de los datos y las necesidades del usuario. Esta práctica garantiza que la aplicación use el patrón Cache-Aside para proporcionar acceso rápido y información actual.

Garantizar coherencia de los datos

Implemente mecanismos para actualizar la memoria caché inmediatamente después de cualquier operación de escritura en la base de datos. Use actualizaciones controladas por eventos o clases de administración de datos dedicadas para garantizar la coherencia de la memoria caché. La sincronización coherente de la memoria caché con modificaciones de la base de datos es fundamental para el patrón Cache-Aside.

Ejemplo: El código siguiente agrega el paquete spring-boot-starter-cache como una dependencia al pom.xml archivo para habilitar el almacenamiento en caché.

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

La implementación de referencia habilita Redis en el archivo application.properties.

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

El código siguiente define un método denominado getAccountDetail. El método recupera la configuración del usuario asociada a un nombre de usuario determinado. @Cacheable(value="account-details", key="#id") anota el método getAccountDetaile indica a la aplicación web que almacene en caché la configuración del usuario en una memoria caché.

    @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;
    }

Rendimiento de la base de datos

El rendimiento de la base de datos puede afectar al rendimiento y la escalabilidad de una aplicación. Es importante probar el rendimiento de la base de datos para asegurarse de que está optimizada. Algunas consideraciones clave son elegir la región de nube adecuada, la agrupación de conexiones, el patrón cache-aside y la optimización de consultas.

  • Pruebe los saltos de red. Mover una aplicación a la nube puede introducir saltos de red adicionales y latencia en la base de datos. Debe probar los saltos adicionales introducidos por el nuevo entorno en la nube.

  • Establezca una línea base de rendimiento. Debe usar métricas de rendimiento locales como línea base inicial para comparar el rendimiento de la aplicación en la nube.

  • Usar Application Insights. Application Insights proporciona métricas detalladas sobre las consultas de base de datos y las interfaces JDBC. Debería utilizarlo para asegurarse de que una base de datos portada está cumpliendo sus SLA o para encontrar consultas que necesita ajustar. Nunca debe usar SQL dinámico porque crea problemas de seguridad y rendimiento.

  • Use grupos de conexiones. Debe usar grupos de conexiones JDBC y ajustarlos en función de las métricas de transacciones por segundo (TPS) y los Acuerdos de Nivel de Servicio. Puede usar herramientas de supervisión del rendimiento de la base de datos para probar y evaluar el rendimiento de la base de datos bajo carga.

Pasos siguientes

Implemente la implementación de referencia siguiendo las instrucciones del repositorio de GitHub. Utilice los siguientes recursos para obtener más información sobre las mejores prácticas y la migración a la nube.

Procedimientos recomendados en la nube. Para obtener instrucciones sobre la adopción y la arquitectura de Azure, consulte:

  • Cloud Adoption Framework. Un marco para ayudar a su organización a preparar y ejecutar una estrategia para crear soluciones en Azure.
  • Marco de buena arquitectura. Un conjunto de principios guía que se pueden usar para mejorar la calidad de una carga de trabajo.

Para las aplicaciones que requieren un objetivo de nivel de servicio (SLO) superior, consulte Cargas de trabajo críticas.

Guía de migración. Las siguientes herramientas y recursos pueden ayudarle a migrar recursos locales a Azure: