Editar

Share via


Padrão de aplicativo Web confiável para Java – Aplicar o padrão

Serviço de aplicativo do Azure
Porta da frente do Azure
Cache do Azure para Redis
Biblioteca de Autenticação da Microsoft para Java

Este artigo mostra como aplicar o padrão de aplicativo Web confiável. O padrão de aplicativo Web confiável é 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 dessa diretriz, há uma implementação de referência do padrão de aplicativo Web confiável que você pode implantar.

O diagrama mostra a arquitetura da implementação de referênciaArquitetura da implementação de referência. Baixe um Arquivo Visio dessa arquitetura.

A orientação a seguir usa a implementação de referência como um exemplo em todo o processo. Para aplicar o padrão de aplicativo Web confiável, siga estas recomendações alinhadas aos pilares do Well-Architected Framework:

Confiabilidade

A confiabilidade garante que seu aplicativo possa cumprir os 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 de aplicativo Web confiável introduz dois padrões de design principais no nível do código para aumentar a confiabilidade: o padrão de repetição e o padrão de interruptor.

Use o padrão de repetição

O padrão de repetição aborda interrupções temporárias de serviço, denominadas falhas transitórias, que geralmente são resolvidas em segundos. Essas falhas geralmente resultam de limitações de serviço, distribuição dinâmica de carga e problemas de rede em ambientes de nuvem. A implementação do padrão de repetição 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 de repetição em Java. O Resilience4j é uma biblioteca leve e de tolerância 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 padrão de design de interruptor, limitador de taxa, repetição ou bulkhead.

Exemplo: a implementação de referência adiciona o padrão de repetição decorando o método listServicePlans do Controlador de Plano de Serviço com anotações de repetição. O código tentará 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 da espera e quais exceções devem ser repetidas. A política de repetição é configurada em application.properties.

Usar o padrão de disjuntor

Emparelhar os padrões de repetição e interruptor expande a capacidade de um aplicativo para lidar com interrupções de serviço que não estão relacionadas a falhas transitórias. O padrão de interruptor impede que um aplicativo tente acessar continuamente um serviço que não responde. O padrão de interruptor 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 a documentação do Spring Circuit Breaker e do Resilience4j.

Exemplo: a implementação de referência implementa o padrão de interruptor decorando métodos com o atributo de interruptor.

Segurança

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

Aplique privilégios mínimos

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

Atribua permissões a identidades de usuários

Avalie as necessidades do seu aplicativo para definir um conjunto de funções que abrangem todas as ações do usuário sem sobreposição. Mapeie cada usuário para a função mais apropriada. Conceda a eles somente o acesso necessário para desempenhar suas funções.

Atribua permissões a identidades de carga de trabalho

Conceda apenas as permissões 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 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 saber mais, veja:

Configure a autenticação e a autorização do usuário

A autenticação e a autorização são aspectos críticos da segurança de aplicativos Web. Autenticação é o processo de verificação da identidade do usuário de forma confiável. Autorização especifica as ações que um usuário tem permissão para executar no 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 aplicativos do Azure (Serviço de Aplicativo do Azure) e do provedor de identidade (Microsoft Entra ID).

Configurar autenticação do 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 a 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 Terraform a seguir codifica a criação de um registro de aplicativo no Entra ID junto 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 nossos dados de configuração de 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 seu aplicativo 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, junto com recursos de integração com componentes do Spring Cloud. Isso permite a integração direta do Microsoft Entra ID e do OAuth 2.0 a aplicativos Spring Boot sem biblioteca manual ou definição de configurações.

Exemplo: a implementação de referência usa a plataforma de identidade da Microsoft (Microsoft Entra ID) como o provedor de identidade para o aplicativo Web. Ele usa a concessão de código de autorização OAuth 2.0 para fazer logon em um usuário com uma conta do Microsoft Entra. O snippet XML a seguir define as duas dependências necessárias do fluxo de concessão de código de autorização do OAuth 2.0. A dependência com.azure.spring: spring-cloud-azure-starter-active-directory habilita 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 oferece suporte à autenticação e autorização do 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 Spring Security.

Implemente 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 do aplicativo. 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. A configuração e a habilitação da Microsoft Authentication Library (MSAL) dão 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 que refletem os tipos de funções de usuário no sistema de gerenciamento de contas da Contoso Fiber. As funções são convertidas 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 do Field Service. A função de Gerente de Contas tem permissões para adicionar novos usuários e clientes do aplicativo. Um representante do Field Service pode criar tíquetes de suporte. O atributo PreAuthorize 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 do OAuth 2.0. Esse fluxo permite que um usuário entre com uma conta da Microsoft. O snippet de código a seguir mostra como configurar o SecurityFilterChain para usar o 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 saber mais, veja:

Configure a autenticação e a autorização de serviço

Configure a autenticação e autorização de serviço para que os serviços em seu ambiente tenham as permissões para realizar 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 as 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, confira Monitorar identidades gerenciadas.

Exemplo: a implementação de referência mantém o mecanismo de autenticação local do 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 Key Vault. O aplicativo Web usa uma identidade gerenciada (sistema atribuído) para recuperar segredos do Key Vault.

Usar um repositório central de segredos para gerenciar segredos

Ao mover 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 oferecem suporte a identidades gerenciadas. Para configurações de aplicativo, a Configuração de Aplicativos do Azure é recomendada.

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

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

Carregue segredos do Key Vault na inicialização do aplicativo, e não durante cada solicitação HTTP. O Key Vault 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 Key Vault

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

  • Configuração 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 para evitar complexidade desnecessária. Para integrar o Key Vault a um aplicativo Spring, o processo envolve o seguinte:

  1. Adicione a dependência do Azure Spring Boot Starter para Segredos do Azure Key Vault em seu arquivo pom.xml.
  2. Configure um ponto de extremidade do Key Vault em seu aplicativo. Isso pode ser feito por meio 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.

Usar pontos de extremidade 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 passa pela Internet pública. Os pontos de extremidade privados não exigem alterações de código, configurações de aplicativos ou strings 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 Key Vault, o Cache do Azure para Redis e o Banco de Dados do Azure para PostgreSQL.

Use 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 na Web. Force todo o tráfego de entrada da Internet a passar pelo balanceador de carga público, se você tiver um, e pelo firewall de aplicativo Web. Você pode (1) usar o ponto de extremidade privado do Azure Front Door ou (2) filtrar solicitações pelo valor do cabeçalho X-Azure-FDID.

A plataforma do Serviço de Aplicativo e o Java Spring podem filtrar por valor do 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 de 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 de cabeçalho X-Azure-FDID no ambiente de desenvolvimento.

Configurar segurança de banco de dados

O acesso de nível de administrador ao banco de dados concede permissões para executar operações privilegiadas. As operações privilegiadas incluem criar e excluir bancos de dados, modificar esquemas de tabela ou alterar permissões de usuários. Os desenvolvedores frequentemente precisam de acesso no nível de administrador para manter o banco de dados ou solucionar problemas.

  • Evite permissões elevadas permanentes. 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 realizar 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 com privilégios mínimos do aplicativo ao banco de dados. Ele limita o raio de alcance de bugs e violações de segurança. Você tem dois métodos principais para acessar o banco de dados Azure para PostgreSQL. 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 custo

A otimização de custos é a análise de maneiras de reduzir as despesas desnecessárias e a sobrecarga de gerenciamento. Para obter mais informações, consulte a Lista de verificação de revisão de design para otimização de custos. O padrão de aplicativo Web confiável implementa técnicas de correção de tamanho, dimensionamento automático e uso eficiente de recursos para um aplicativo Web mais otimizado em termos de custo.

Recursos de correção de tamanho para cada ambiente

Compreenda as diferentes níveis 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 SLAs (Contratos de Nível de Serviço), aos recursos e à escala necessários para a produção. Ambientes de não produção normalmente não precisam dos mesmos recursos. Para obter 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 os preços de Desenvolvimento/Teste do Azure, pois esses preços não cobriam nenhum dos componentes. O Banco de Dados do Azure para PostgreSQL é um candidato principal para uma instância reservada com base no plano de manter 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 SKUs diferentes. 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 custo, usando os SKUs mais baratos necessários 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.

Usar escala automática

A escala automática automatiza o dimensionamento horizontal para ambientes de produção. Escala automática baseada 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 os gatilhos de dimensionamento (CPU, RAM, rede e disco) para corresponder ao comportamento do seu aplicativo Web. Não dimensione verticalmente para atender a mudanças frequentes na demanda. Isso gera menos economia. Para obter mais informações, consulte Dimensionamento no Serviço de Aplicativo do Azure e Escala automática no Microsoft Azure.

Use recursos com eficiência

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

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

  • Exclua ambientes não utilizados. Exclua ambientes de não 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 necessários 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.

  • Coloque a funcionalidade. Onde houver capacidade ociosa, coloque 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 oferecer suporte a vários tipos de dados.

Excelência operacional

A excelência operacional abrange os processos de operações 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 de aplicativo Web confiável implementa a infraestrutura como código para implantações de infraestrutura e monitoramento para observabilidade.

Configurar monitoramento

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

Monitore métricas de linha de base

A carga de trabalho deve monitorar as métricas da linha de base. As métricas importantes a serem medidas incluem taxa de transferência de solicitação, duração média da solicitação, erros e 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 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 como Log4j e Logback. Para saber mais, veja:

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 as interações deles com seu aplicativo. O Application Insights permite que você colete telemetria personalizada.Além disso, você também pode coletar métricas personalizadas por meio do Micrometer. 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.

Colete métricas baseadas em log

Rastreie métricas baseadas em log para obter mais visibilidade sobre a integridade e as métricas essenciais do aplicativo. Você pode usar consultas KQL (Linguagem de Consulta Kusto) 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.

Habilite diagnósticos de plataforma

Uma configuração de diagnóstico no Azure permite especificar os logs e as métricas de plataforma que você deseja coletar e onde armazená-los. Os logs de 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. Diversos serviços do Azure têm categorias de log para escolher.

  • Habilite o diagnóstico para todos os serviços compatíveis. 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 ofereça 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, preparação e produção. Utilize o Azure Pipelines se estiver trabalhando com o Azure DevOps ou as Ações do GitHub para projetos do GitHub.

  • Integre os 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 alcançar uma cobertura abrangente de testes.

  • Adote a estrutura Java mocking. Para testes envolvendo pontos de extremidade externos, utilize estruturas 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 varreduras de segurança. Utilize o teste de segurança de aplicativo estático (SAST) para encontrar falhas de segurança e erros de codificação em seu código-fonte. Além disso, realize 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.

Governe 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

A eficiência do desempenho é a capacidade de dimensionar a carga de trabalho para atender às demandas exigidas pelos usuários de maneira 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 de aplicativo Web confiável usa o padrão Cache-Aside para minimizar a latência de dados altamente solicitados.

Use o padrão Cache-Aside

O padrão Cache-Aside é uma estratégia de armazenamento em cache que melhora o gerenciamento de dados na memória. O padrão atribui ao aplicativo a responsabilidade de manipular 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. Essa abordagem reduz os tempos de resposta, aumenta a taxa de transferência e reduz a necessidade de mais dimensionamento. Ela também reforça a disponibilidade do serviço, reduzindo a carga no armazenamento de dados principal e minimizando os riscos de paralisação.

Habilitar o cache

Para habilitar o cache, adicione o spring-boot-starter-cache pacote como uma dependência no arquivo pom.xml. O pacote spring-boot-starter-cache configura o Cache Redis com valores padrão. Você deve atualizar esses valores no arquivo application.properties 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 anotação @Cacheable.

Armazene em cache dados de alta necessidade

Priorize o armazenamento em cache para os dados acessados com mais frequência. Identifique os principais pontos de dados que impulsionam a participação do usuário e o desempenho do sistema. Implemente estratégias de armazenamento em cache especificamente para essas áreas para otimizar a eficácia do padrão Cache-Aside 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 um SKU de banco de dados menor.

Mantenha os dados do 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.

Garanta a consistência dos dados

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

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

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

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

# 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 método getAccountDetaile diz ao aplicativo Web para armazenar em cache as configurações do usuário.

    @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 de banco de dados

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

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

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

  • Usar o 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 localizar 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ão. 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óximas etapas

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

Práticas recomendadas da nuvem. Para obter diretrizes de arquitetura e adoção do Azure, consulte:

  • Cloud Adoption Framework. Uma estrutura para ajudar sua organização a preparar e executar uma estratégia para criar soluções no Azure.
  • Well-Architected Framework. Um conjunto de princípios orientadores que você pode usar para aprimorar a qualidade de uma carga de trabalho.

Para aplicativos que exigem um SLO (Objetivo de Nível de Serviço) mais alto, confira cargas de trabalho de missão crítica.

Diretrizes de migração. As ferramentas e recursos a seguir podem ajudar você a migrar recursos locais para o Azure: