Editar

Padrão de aplicativo Web confiável para Java - Aplique o padrão

Azure App Service
Azure Front Door
Azure Cache for Redis
Microsoft Authentication Library for Java

Este artigo mostra como aplicar o padrão Reliable Web App. O padrão Reliable Web App é um conjunto de princípios e técnicas de implementação que definem como você deve modificar aplicativos Web (replataforma) ao migrar para a nuvem. Ele se concentra nas atualizações mínimas de código que você precisa fazer para ter sucesso na nuvem.

Para facilitar a aplicação dessas diretrizes, há uma implementação de referência do padrão Reliable Web App que você pode implantar.

Diagrama mostrando a arquitetura da implementação de referência.Arquitetura de arquitetura de implementação de referência. Baixe um arquivo Visio desta arquitetura.

As orientações a seguir usam a implementação de referência como um exemplo em todo o texto. Para aplicar o padrão Reliable Web App, siga estas recomendações alinhadas aos pilares do Well-Architected Framework:

Fiabilidade

A confiabilidade garante que seu aplicativo possa atender aos compromissos que você assume com seus clientes. Para obter mais informações, consulte a lista de verificação de revisão de design para confiabilidade. O padrão Reliable Web App introduz dois padrões de design principais no nível do código para aumentar a confiabilidade: o padrão Retry e o padrão Circuit Breaker.

Usar o padrão Repetir

O padrão Retry aborda interrupções temporárias do serviço, denominadas falhas transitórias, que geralmente são resolvidas em segundos. Essas falhas geralmente resultam de limitação de serviço, distribuição de carga dinâmica e problemas de rede em ambientes de nuvem. A implementação do padrão Retry envolve o reenvio de solicitações com falha, permitindo atrasos e tentativas configuráveis antes de lançar uma exceção.

Use Resilience4j para implementar o padrão Retry em Java. Resilience4j é uma biblioteca leve e tolerante a falhas. Ele fornece funções de ordem superior (decoradores) para aprimorar interfaces funcionais, expressões lambda e referências de método com um disjuntor, limitador de taxa, repetição ou padrão de design de antepara.

Exemplo: A implementação de referência adiciona o padrão Retry decorando o método listServicePlans do Service Plan Controller com anotações Retry. O código tenta novamente a chamada para uma lista de planos de serviço do banco de dados se a chamada inicial falhar.

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

A implementação de referência configura a política de repetição incluindo tentativas máximas, duração de espera e quais exceções devem ser repetidas. A política de repetição é configurada em application.properties. Para obter mais informações, consulte a documentação do Resilience4j. Você pode simular o padrão Retry na implementação de referência.

Utilizar o padrão de Disjuntor Automático

O emparelhamento dos padrões de repetição e disjuntor expande a capacidade de um aplicativo de lidar com interrupções de serviço que não estão relacionadas a falhas transitórias. O padrão de disjuntor impede que um aplicativo tente acessar continuamente um serviço que não responde. O padrão de disjuntor libera o aplicativo e evita o desperdício de ciclos de CPU para que o aplicativo mantenha sua integridade de desempenho para os usuários finais. Para obter mais informações, consulte Disjuntor de mola e documentação do Resilience4j.

Exemplo: A implementação de referência implementa o padrão Disjuntor decorando métodos com o atributo Disjuntor. Você pode simular o padrão do disjuntor na implementação de referência.

Segurança

A segurança oferece garantias contra ataques deliberados e o abuso de seus valiosos dados e sistemas. Para obter mais informações, consulte Lista de verificação de revisão de design para segurança. O padrão Reliable Web App usa identidades gerenciadas para implementar segurança centrada em identidade. Pontos de extremidade privados, firewall de aplicativo Web e acesso restrito ao aplicativo Web fornecem uma entrada segura.

Impor privilégios mínimos

Para garantir a segurança e a eficiência, conceda apenas aos usuários (identidades de usuário) e aos serviços do Azure (identidades de carga de trabalho) as permissões de que precisam.

Atribuir permissões a identidades de usuário

Avalie as necessidades do seu aplicativo para definir um conjunto de funções que abranjam todas as ações do usuário sem sobreposição. Mapeie cada usuário para a função mais apropriada. Garantir que eles tenham acesso apenas ao que é necessário para suas funções.

Atribuir permissões a identidades de carga de trabalho

Conceda apenas as permissões que são críticas para as operações, como ações CRUD em bancos de dados ou acesso a segredos. As permissões de identidade de carga de trabalho são persistentes, portanto, você não pode fornecer permissões just-in-time ou de curto prazo para identidades de carga de trabalho.

  • Prefira o controle de acesso baseado em função (RBAC). Sempre comece com o RBAC do Azure para atribuir permissões. Ele oferece controle preciso, garantindo que o acesso seja auditável e granular. Use o RBAC do Azure para conceder apenas as permissões necessárias para que o serviço execute suas funções pretendidas.

  • Complemente com os controles de acesso de nível de serviço do Azure. Se o RBAC do Azure não cobrir um cenário específico, complemente com políticas de acesso de nível de serviço do Azure.

Para obter mais informações, consulte:

Configurar autenticação e autorização de usuário

A autenticação e a autorização são aspetos críticos da segurança de aplicativos Web. A autenticação é o processo de verificação da identidade de um usuário. A autorização especifica as ações que um usuário tem permissão para executar dentro do aplicativo. O objetivo é implementar autenticação e autorização sem enfraquecer sua postura de segurança. Para atingir essa meta, você precisa usar os recursos da plataforma de aplicativo do Azure (Serviço de Aplicativo do Azure) e do provedor de identidade (ID do Microsoft Entra).

Configurar autenticação de usuário

Proteja seu aplicativo Web habilitando a autenticação do usuário por meio dos recursos da sua plataforma. O Serviço de Aplicativo do Azure dá suporte à autenticação com provedores de identidade, como o Microsoft Entra ID, descarregando a carga de trabalho de autenticação do seu código.

Exemplo: A implementação de referência usa o Microsoft Entra ID como a plataforma de identidade. O Microsoft Entra ID requer um registro de aplicativo no locatário principal. O registro do aplicativo garante que os usuários que obtêm acesso ao aplicativo Web tenham identidades no locatário principal. O seguinte código Terraform a criação de um registro de aplicativo Entra ID juntamente com uma função de Gerente de Conta específica do aplicativo.

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

O Key Vault armazena com segurança os dados de configuração do nosso cliente e a plataforma do Serviço de Aplicativo expõe as informações ao nosso aplicativo como variáveis de ambiente.

Integre com o provedor de identidade

Integre a sua aplicação Web com o Microsoft Entra ID para autenticação e autorização seguras. O Spring Boot Starter para Microsoft Entra ID simplifica esse processo, utilizando o Spring Security e o Spring Boot para facilitar a configuração. Ele oferece fluxos de autenticação variados, gerenciamento automático de tokens e políticas de autorização personalizáveis, juntamente com recursos de integração com componentes do Spring Cloud. Isso permite a integração direta do Microsoft Entra ID e OAuth 2.0 em aplicativos Spring Boot sem biblioteca manual ou configuração de configurações.

Exemplo: A implementação de referência usa a plataforma de identidade da Microsoft (ID do Microsoft Entra) como o provedor de identidade para o aplicativo Web. Ele usa a concessão de código de autorização OAuth 2.0 para entrar em um usuário com uma conta do Microsoft Entra. O trecho XML a seguir define as duas dependências necessárias do fluxo de concessão de código de autorização OAuth 2.0. A dependência com.azure.spring: spring-cloud-azure-starter-active-directory permite a autenticação e autorização do Microsoft Entra em um aplicativo Spring Boot. A dependência org.springframework.boot: spring-boot-starter-oauth2-client suporta autenticação e autorização OAuth 2.0 em um aplicativo 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 obter mais informações, consulte Suporte do Spring Cloud Azure para o Spring Security.

Implementar regras de negócios de autenticação e autorização

A implementação de regras de negócios de autenticação e autorização envolve a definição de políticas e permissões de controle de acesso para várias funcionalidades e recursos de aplicativos. Você precisa configurar o Spring Security para usar o Spring Boot Starter para Microsoft Entra ID. Essa biblioteca permite a integração com o Microsoft Entra ID e ajuda a garantir que os usuários sejam autenticados com segurança. Configurar e habilitar a Biblioteca de Autenticação da Microsoft (MSAL) fornece acesso a mais recursos de segurança. Esses recursos incluem cache de token e atualização automática de token.

Exemplo: A implementação de referência cria funções de aplicativo refletindo os tipos de funções de usuário no sistema de gerenciamento de contas da Contoso Fiber. As funções se traduzem em permissões durante a autorização. Exemplos de funções específicas do aplicativo no CAMS incluem o gerente de conta, o representante de suporte de nível um (L1) e o representante de serviço de campo. A função Gestor de Conta tem permissões para adicionar novos utilizadores e clientes da aplicação. Um representante do Field Service pode criar tíquetes de suporte. O PreAuthorize atributo restringe o acesso a funções específicas.

    @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 integrar com o Microsoft Entra ID, a implementação de referência usa o fluxo de concessão de código de autorização OAuth 2.0. Esse fluxo permite que um usuário entre com uma conta da Microsoft. O trecho de código a seguir mostra como configurar o para usar o SecurityFilterChain Microsoft Entra ID para autenticação e autorização.

@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 obter mais informações, consulte:

Configurar autenticação e autorização de serviço

Configure a autenticação e a autorização de serviço para que os serviços em seu ambiente tenham as permissões para executar as funções necessárias. Use identidades gerenciadas no Microsoft Entra ID para automatizar a criação e o gerenciamento de identidades de serviço, eliminando o gerenciamento manual de credenciais. Uma identidade gerenciada permite que seu aplicativo Web acesse com segurança os serviços do Azure, como o Azure Key Vault e bancos de dados. Ele também facilita integrações de pipeline de CI/CD para implantações no Serviço de Aplicativo do Azure. No entanto, em cenários como implantações híbridas ou com sistemas herdados, continue usando suas soluções de autenticação local para simplificar a migração. Faça a transição para identidades gerenciadas quando seu sistema estiver pronto para uma abordagem moderna de gerenciamento de identidades. Para obter mais informações, consulte Monitorando identidades gerenciadas.

Exemplo: A implementação de referência mantém o mecanismo de autenticação local para o banco de dados (nome de usuário e senha). Como resultado, a implementação de referência armazena o segredo do banco de dados no Cofre da Chave. O aplicativo Web usa uma identidade gerenciada (sistema atribuído) para recuperar segredos do Cofre da Chave.

Use um repositório central de segredos para gerenciar segredos

Quando você move seu aplicativo para a nuvem, use o Azure Key Vault para armazenar com segurança todos esses segredos. Esse repositório centralizado oferece armazenamento seguro, rotação de chaves, auditoria de acesso e monitoramento de serviços que não suportam identidades gerenciadas. Para configurações de aplicativos, a Configuração do Aplicativo do Azure é recomendada.

Exemplo: A implementação de referência armazena os seguintes segredos no Cofre de Chaves: (1) nome de usuário e senha do banco de dados PostgreSQL, (2) senha do Cache Redis e (3) o segredo do cliente para o ID do Microsoft Entra associado à implementação do MSAL.

Não coloque o Cofre de Chaves no fluxo de solicitações HTTP

Carregue segredos do Cofre da Chave na inicialização do aplicativo em vez de durante cada solicitação HTTP. O Cofre de Chaves destina-se a armazenar e recuperar dados confidenciais com segurança durante a implantação. O acesso de alta frequência em solicitações HTTP pode exceder os recursos de taxa de transferência do Key Vault, levando a limitações de solicitação e erros de código de status HTTP 429. Para obter mais informações, consulte Limites de transação do Key Vault.

Use um método para acessar segredos no Cofre da Chave

Ao configurar um aplicativo Web para acessar segredos no Cofre da Chave, você tem duas opções principais:

  • Configuração do Aplicativo do Serviço de Aplicativo: use uma configuração de aplicativo no Serviço de Aplicativo para injetar o segredo diretamente como uma variável de ambiente.

  • Referência de segredo direto: faça referência direta ao segredo dentro do código do aplicativo. Adicione uma referência específica no arquivo de propriedades do seu aplicativo, como application.properties para aplicativos Java, para que seu aplicativo se comunique com o Key Vault.

É importante escolher um desses métodos e mantê-lo para simplicidade e evitar complexidade desnecessária. Para integrar o Key Vault com um aplicativo Spring, o processo envolve:

  1. Adicione o Azure Spring Boot Starter para dependência do Azure Key Vault Secrets em seu arquivo pom.xml.
  2. Configure um ponto de extremidade do Cofre da Chave em seu aplicativo. Isso pode ser feito através do arquivo application.properties ou como uma variável de ambiente.

Exemplo: A implementação de referência usa uma configuração de aplicativo no Serviço de Aplicativo e injeta segredos.

Utilizar pontos finais privados

Use pontos de extremidade privados em todos os ambientes de produção para todos os serviços do Azure com suporte. Os pontos de extremidade privados fornecem conexões privadas entre recursos em uma rede virtual do Azure e os serviços do Azure. Por padrão, a comunicação com a maioria dos serviços do Azure atravessa a Internet pública. Os pontos de extremidade privados não exigem alterações de código, configurações de aplicativos ou cadeias de conexão. Para obter mais informações, consulte Como criar um ponto de extremidade privado e Práticas recomendadas para segurança de ponto de extremidade.

Exemplo: A implementação de referência usa pontos de extremidade privados para o Cofre da Chave, o Cache do Azure para Redis e o Banco de Dados do Azure para PostgreSQL.

Usar um firewall de aplicativo Web

Todo o tráfego de entrada da Internet para o aplicativo Web deve passar por um firewall de aplicativo Web para proteger contra explorações comuns da Web. Força todo o tráfego de entrada da Internet a passar pelo balanceador de carga público, se tiver um, e pelo firewall do aplicativo Web. Você pode (1) usar o ponto de extremidade privado do Azure Front Door ou (2) filtrar solicitações pelo valor do X-Azure-FDID cabeçalho.

A plataforma do Serviço de Aplicativo e o Java Spring podem filtrar por valor de cabeçalho. Você deve usar o Serviço de Aplicativo como a primeira opção. A filtragem no nível da plataforma impede que solicitações indesejadas cheguem ao seu código. Você precisa configurar o tráfego que deseja passar pelo firewall do aplicativo Web. Você pode filtrar com base no nome do host, IP do cliente e outros valores. Para obter mais informações, consulte Preservar o nome do host HTTP original.

Exemplo: A implementação de referência usa um ponto de extremidade privado no ambiente de produção e o valor do X-Azure-FDID cabeçalho no ambiente de desenvolvimento.

Configurar segurança de base de dados

O acesso em nível de administrador ao banco de dados concede permissões para executar operações privilegiadas. As operações privilegiadas incluem a criação e exclusão de bancos de dados, a modificação de esquemas de tabela ou a alteração de permissões de usuário. Os desenvolvedores geralmente precisam de acesso em nível de administrador para manter o banco de dados ou solucionar problemas.

  • Evite permissões permanentes elevadas. Conceda aos desenvolvedores acesso just-in-time para executar operações privilegiadas. Com o acesso just-in-time, os usuários recebem permissões temporárias para executar tarefas privilegiadas.

  • Não dê permissões elevadas ao aplicativo. Não conceda acesso de nível de administrador à identidade do aplicativo. Configure o acesso menos privilegiado do aplicativo ao banco de dados. Ele limita o raio de explosão de bugs e violações de segurança. Você tem dois métodos principais para acessar o banco de dados PostgreSQL do Azure. Você pode usar a autenticação Microsoft Entra ou a autenticação PostgreSQL. Para obter mais informações, consulte JDBC com Azure PostgreSQL.

Otimização de custos

A otimização de custos consiste em procurar formas de reduzir despesas desnecessárias e despesas gerais de gestão. Para obter mais informações, consulte a lista de verificação de revisão de design para otimização de custos. O padrão Reliable Web App implementa técnicas de direitos, dimensionamento automático e uso eficiente de recursos para um aplicativo Web com custo otimizado.

Recursos de tamanho certo para cada ambiente

Entenda as diferentes camadas de desempenho dos serviços do Azure e use apenas a SKU apropriada para as necessidades de cada ambiente. Os ambientes de produção precisam de SKUs que atendam aos contratos de nível de serviço (SLA), aos recursos e à escala necessários para a produção. Os ambientes que não são de produção normalmente não precisam dos mesmos recursos. Para economias extras, considere as opções de preços de Desenvolvimento/Teste do Azure, Reservas do Azure e planos de economia do Azure para computação.

Exemplo: A implementação de referência não usa a definição de preço de Desenvolvimento/Teste do Azure, uma vez que a definição de preço de Desenvolvimento/Teste do Azure não cobria nenhum dos componentes. O Banco de Dados do Azure para PostgreSQL é um candidato principal para uma instância reservada com base no plano de permanecer com esse mecanismo de banco de dados por pelo menos um ano após essa convergência inicial na fase de nuvem. A implementação de referência tem um parâmetro opcional que implanta diferentes SKUs. Um parâmetro de ambiente instrui o modelo Terraform a selecionar SKUs de desenvolvimento. O código a seguir mostra esse parâmetro de ambiente.

azd env set APP_ENVIRONMENT prod

A Contoso Fiber usa modelos de infraestrutura como código (IaC) para implantações de desenvolvimento e produção. O ambiente de desenvolvimento é otimizado em termos de custos, usando as SKUs mais baratas necessárias para o desenvolvimento de aplicativos. O ambiente de produção usa SKUs que atendem aos requisitos objetivos de nível de serviço de produção do aplicativo.

Utilizar dimensionamento automático

O dimensionamento automático automatiza o dimensionamento horizontal para ambientes de produção. Dimensionamento automático com base em métricas de desempenho. Os gatilhos de desempenho de utilização da CPU são um bom ponto de partida se você não entender os critérios de dimensionamento do seu aplicativo. Você precisa configurar e adaptar gatilhos de dimensionamento (CPU, RAM, rede e disco) para corresponder ao comportamento do seu aplicativo Web. Não dimensione verticalmente para atender às mudanças frequentes na demanda. É menos eficiente em termos de custos. Para obter mais informações, consulte Dimensionamento no Serviço de Aplicativo do Azure e Dimensionamento automático no Microsoft Azure.

Utilize os recursos de forma eficiente

O uso eficiente de recursos envolve o gerenciamento estratégico e a alocação de recursos em nuvem para atender às necessidades organizacionais sem desperdício. Minimiza as despesas desnecessárias com recursos e as despesas gerais de gestão. Para melhorar a eficiência na utilização dos recursos, siga estas recomendações:

  • Use serviços compartilhados. Centralizar e compartilhar certos recursos proporciona otimização de custos e menor sobrecarga de gerenciamento. Por exemplo, coloque recursos de rede compartilhados na rede virtual do hub.

  • Exclua ambientes não utilizados. Exclua ambientes que não sejam de produção após o expediente ou durante feriados para otimizar os custos. Você pode usar a infraestrutura como código para excluir recursos do Azure e ambientes inteiros. Remova a declaração do recurso que você deseja excluir do modelo de infraestrutura como código. Faça backup dos dados de que precisa mais tarde. Entenda as dependências do recurso que você está excluindo. Se houver dependências, talvez seja necessário atualizar ou remover esses recursos também.

  • Funcionalidade de colocalização. Onde houver capacidade ociosa, colocalize recursos e funcionalidades do aplicativo em um único recurso do Azure. Por exemplo, vários aplicativos Web podem usar um único servidor (Plano do Serviço de Aplicativo) ou um único cache pode suportar vários tipos de dados.

Excelência operacional

A excelência operacional abrange os processos operacionais que implantam um aplicativo e o mantêm em execução na produção. Para obter mais informações, consulte a lista de verificação de revisão de design para excelência operacional. O padrão Reliable Web App implementa a infraestrutura como código para implantações de infraestrutura e monitoramento para observabilidade.

Configurar a monitorização

Para rastreamento e depuração, você deve habilitar o registro em log para diagnosticar quando qualquer solicitação falhar. A telemetria que você coleta do seu aplicativo deve atender às suas necessidades operacionais. No mínimo, você deve coletar telemetria em métricas de linha de base. Você deve coletar informações sobre o comportamento do usuário que podem ajudá-lo a aplicar melhorias direcionadas.

Monitorar métricas da linha de base

A carga de trabalho deve monitorar as métricas da linha de base. As métricas importantes a serem medidas incluem a taxa de transferência da solicitação, a duração média da solicitação, os erros e as dependências de monitoramento. Recomendamos que você use o Application Insights para coletar essa telemetria.

Exemplo: A implementação de referência usa o Application Insights. O Application Insights é habilitado por meio do Terraform como parte da configuração de app_settings do Serviço de Aplicativo.

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

O Spring Boot registra várias métricas principais no Application Insights, como Java virtual machine (JVM), CPU, Tomcat e outros. O Application Insights coleta automaticamente de estruturas de registro em log, como Log4j e Logback. Para obter mais informações, consulte:

Crie telemetria e métricas personalizadas conforme necessário

Além das métricas de linha de base no Application Insights, você deve criar telemetria personalizada para entender melhor seus usuários e suas interações com seu aplicativo. O Application Insights permite coletar telemetria personalizada e também pode coletar métricas personalizadas por meio do micrômetro. O objetivo é obter insights mais profundos sobre o desempenho e o comportamento do usuário do seu aplicativo, para que você possa tomar decisões e melhorias mais informadas.

Reúna métricas baseadas em log

Acompanhe as métricas baseadas em log para obter mais visibilidade sobre a integridade e as métricas essenciais do aplicativo. Você pode usar consultas KQL (Kusto Query Language) no Application Insights para localizar e organizar dados. Para obter mais informações, consulte Métricas baseadas em log do Azure Application Insights e Métricas pré-agregadas e baseadas em log no Application Insights.

Habilitar o diagnóstico da plataforma

Uma configuração de diagnóstico no Azure permite especificar os logs e métricas da plataforma que você deseja coletar e onde armazená-los. Os logs da plataforma são logs internos que fornecem informações de diagnóstico e auditoria. Você pode habilitar o diagnóstico de plataforma para a maioria dos serviços do Azure, mas cada serviço define suas próprias categorias de log. Diferentes serviços do Azure têm categorias de log para escolher.

  • Habilite o diagnóstico para todos os serviços suportados. Os serviços do Azure criam logs de plataforma automaticamente, mas o serviço não os armazena automaticamente. Você deve habilitar a configuração de diagnóstico para cada serviço e habilitá-la para cada serviço do Azure que dá suporte a diagnósticos.

  • Envie diagnósticos para o mesmo destino que os logs do aplicativo. Ao habilitar o diagnóstico, você escolhe os logs que deseja coletar e para onde enviá-los. Você deve enviar os logs da plataforma para o mesmo destino que os logs do aplicativo para que possa correlacionar os dois conjuntos de dados.

Exemplo: A implementação de referência usa o Terraform para habilitar o diagnóstico do Azure em todos os serviços com suporte. O código Terraform a seguir define as configurações de diagnóstico para o Serviço de Aplicativo.

# 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
  }
}

Usar um pipeline de CI/CD

Para automatizar suas implantações, integre um pipeline de integração contínua/implantação contínua (CI/CD). Essa automação deve se estender do controle do código-fonte diretamente para seus vários ambientes do Serviço de Aplicativo, incluindo teste, preparo e produção. Utilize o Azure Pipelines se estiver trabalhando com o Azure DevOps ou GitHub Actions para projetos do GitHub.

  • Integre testes de unidade. Priorize a execução e a aprovação de todos os testes de unidade (usando JUnit) em seu pipeline antes de qualquer implantação nos Serviços de Aplicativo. Incorpore ferramentas de qualidade e cobertura de código como SonarQube e JaCoCo para obter uma cobertura de teste abrangente.

  • Adote a estrutura de simulação Java. Para testes envolvendo endpoints externos, utilize frameworks Java mocking (Mockito, EasyMock). Essas estruturas permitem que você crie pontos de extremidade simulados. Eles eliminam a necessidade de configurar pontos de extremidade externos reais e garantem condições de teste uniformes em todos os ambientes.

  • Execute verificações de segurança. Utilize testes estáticos de segurança de aplicativos (SAST) para encontrar falhas de segurança e erros de codificação em seu código-fonte. Além disso, conduza a análise de composição de software (SCA) para examinar bibliotecas e componentes de terceiros quanto a riscos de segurança. As ferramentas para essas análises são prontamente integradas ao GitHub e ao Azure DevOps.

Controlar implantações de produção

Você precisa estabelecer diretrizes para implantar código na produção e criar um processo de aprovação para todas as implantações de produção.

Eficiência de desempenho

Eficiência de desempenho é a capacidade da sua carga de trabalho para dimensionar para satisfazer as exigências que os utilizadores lhe colocam de forma eficiente. Para obter mais informações, consulte a Lista de verificação de revisão de design para Eficiência de desempenho. O padrão Reliable Web App usa o padrão Cache-Aside para minimizar a latência de dados altamente solicitados.

Usar o padrão Cache-Aside

O padrão Cache-Aside é uma estratégia de cache que melhora o gerenciamento de dados na memória. O padrão atribui ao aplicativo a responsabilidade de lidar com solicitações de dados e garantir a consistência entre o cache e um armazenamento persistente, como um banco de dados. Quando o aplicativo Web recebe uma solicitação de dados, ele primeiro pesquisa o cache. Se os dados estiverem ausentes, ele os recuperará do banco de dados, responderá à solicitação e atualizará o cache adequadamente. Essa abordagem reduz os tempos de resposta, melhora a taxa de transferência e reduz a necessidade de mais escala. Ele também reforça a disponibilidade do serviço, reduzindo a carga no armazenamento de dados principal e minimizando os riscos de paralisação.

Enable caching

Para habilitar o cache, adicione o spring-boot-starter-cache pacote como uma dependência em seu pom.xml arquivo. O spring-boot-starter-cache pacote configura o cache Redis com valores padrão. Você deve atualizar esses valores no application.properties arquivo ou nas variáveis de ambiente para atender às necessidades do seu aplicativo Web. Por exemplo, o spring.cache.redis.time-to-live (representado em milissegundos) determina a quantidade de tempo que os dados permanecem no cache antes da remoção. Você precisa fornecer um valor que atenda às necessidades do seu aplicativo Web. Finalmente, você precisa armazenar em cache os dados necessários em seu código usando a @Cacheable anotação.

Armazene em cache dados de alta necessidade

Priorize o cache para os dados acessados com mais frequência. Identifique os principais pontos de dados que impulsionam o envolvimento do usuário e o desempenho do sistema. Implemente estratégias de cache especificamente para essas áreas para otimizar a eficácia do padrão Cache-Side, reduzindo significativamente a latência e a carga do banco de dados. Use o Azure Monitor para controlar a CPU, a memória e o armazenamento do banco de dados. Essas métricas ajudam a determinar se você pode usar uma SKU de banco de dados menor.

Manter os dados de cache atualizados

Agende atualizações regulares de cache para sincronizar com as alterações mais recentes do banco de dados. Determine a taxa de atualização ideal com base na volatilidade dos dados e nas necessidades do usuário. Essa prática garante que o aplicativo use o padrão Cache-Aside para fornecer acesso rápido e informações atuais.

Garantir a consistência dos dados

Implemente mecanismos para atualizar o cache imediatamente após qualquer operação de gravação do banco de dados. Use atualizações controladas por eventos ou classes dedicadas de gerenciamento de dados para garantir a coerência do cache. A sincronização consistente do cache com as modificações do banco de dados é fundamental para o padrão Cache-Side.

Exemplo: O código a seguir adiciona o spring-boot-starter-cache pacote como uma dependência ao arquivo para habilitar o pom.xml cache.

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

A implementação de referência habilita o Redis no application.properties arquivo.

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

O código a seguir define um método chamado getAccountDetail. O método recupera as configurações de usuário associadas a um determinado nome de usuário. O @Cacheable(value="account-details", key="#id") anota o getAccountDetailmétodo e diz ao aplicativo Web para armazenar em cache as configurações do usuário em um cache.

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

Desempenho da Base de Dados

O desempenho do banco de dados pode afetar o desempenho e a escalabilidade de um aplicativo. É importante testar o desempenho do seu banco de dados para garantir que ele seja otimizado. Algumas considerações importantes incluem a escolha da região de nuvem certa, o pool de conexões, o padrão de cache-aside e a otimização de consultas.

  • Teste saltos de rede. Mover um aplicativo para a nuvem pode introduzir saltos de rede e latência extras ao seu banco de dados. Você deve testar os saltos extras que o novo ambiente de nuvem introduz.

  • Estabeleça uma linha de base de desempenho. Você deve usar métricas de desempenho locais como a linha de base inicial para comparar o desempenho do aplicativo na nuvem.

  • Use Application Insights. O Application Insights fornece métricas detalhadas sobre consultas de banco de dados e quaisquer interfaces JDBC. Você deve usá-lo para garantir que um banco de dados portado esteja cumprindo seus SLAs ou para encontrar consultas que você precisa ajustar. Você nunca deve usar o SQL dinâmico porque ele cria problemas de segurança e desempenho.

  • Use pools de conexões. Você deve usar pools de conexões JDBC e ajustá-los com base nas métricas e SLAs de transações por segundo (TPS). Você deve usar ferramentas de monitoramento de desempenho de banco de dados para testar e avaliar o desempenho do banco de dados sob carga.

Próximos passos

Implante a implementação de referência seguindo as instruções no repositório GitHub. Use os recursos a seguir para saber mais sobre as práticas recomendadas e a migração para a nuvem.

Práticas recomendadas na nuvem. Para obter orientações de arquitetura e adoção do Azure, consulte:

  • Estrutura de adoção de nuvem. Uma estrutura para ajudar sua organização a preparar e executar uma estratégia para criar soluções no Azure.
  • Estrutura bem arquitetada. Um conjunto de princípios orientadores que você pode usar para melhorar a qualidade de uma carga de trabalho.

Para aplicativos que exigem um SLO (Service Level Objetive, objetivo de nível de serviço) mais alto, consulte Cargas de trabalho de missão crítica.

Orientações em matéria de migração. As seguintes ferramentas e recursos podem ajudá-lo a migrar recursos locais para o Azure:

  • O Azure Migrate fornece um serviço simplificado de migração, modernização e otimização para o Azure que lida com a avaliação e migração de aplicativos Web, SQL Server e máquinas virtuais.
  • Os Guias de Migração de Banco de Dados do Azure fornecem recursos para vários tipos de banco de dados e ferramentas projetadas para seu cenário de migração.
  • O acelerador de zona de aterrissagem do Serviço de Aplicativo do Azure fornece orientação para proteger e dimensionar implantações do Serviço de Aplicativo.