Dimensione com segurança, monitoramento e automação de ponta a ponta

Ao projetar aplicativos, precisamos determinar como nos adaptar às alterações na carga de trabalho, nos recuperar de falhas inesperadas, minimizar riscos de segurança e assim por diante. Embora seja possível começar com uma abordagem de tentativa e erro, isso tira tempo de outros objetivos organizacionais e pode afetar adversamente nossa reputação. O Azure fornece as diretrizes de arquitetura necessárias para acertar as coisas desde o início. Você também tem tudo o que precisa para criar um aplicativo escalonável, desde segurança de última geração e dimensionamento automático até serviços de suporte para dados, mensagens, armazenamento em cache, monitoramento de desempenho e automação. Muitos desses serviços de suporte também são baseados em software de código aberto popular, como PostgreSQL, Redis, JMS e Kafka, para que você não fique preso a soluções proprietárias.

Diagrama com o título 'Serviços de plataforma' e os logotipos dos serviços descritos neste artigo.

É hora de aprender sobre alguns dos principais serviços e recursos do Azure, e como você pode usá-los para criar aplicativos Java escalonáveis.

Estender os recursos para aplicativos Java - bancos de dados e sistemas de mensagens

Além de fornecer várias opções para executar seu código Java, o Azure oferece uma ampla variedade de serviços totalmente gerenciados para manter suas necessidades de banco de dados, incluindo Banco de Dados do Azure para PostgreSQL, Banco de Dados do Azure para MySQL, MongoDB Atlas, Azure Cosmos DB, Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure. O mesmo vale para mensagens, com opções que incluem Barramento de Serviço do Azure, Hubs de Eventos do Azure e Apache Kafka for Confluent Cloud.

A camada Premium do Barramento de Serviço do Azure tem suporte para JMS, o modelo de programação do Serviço de Mensagens Java. Independentemente de seus aplicativos estarem em execução em VMs, no Kubernetes ou em serviços PaaS totalmente gerenciados, você pode provisionar e usar rapidamente esses serviços de dados e mensagens totalmente gerenciados usando clientes de código aberto, SDKs de Java do Azure, iniciadores do Spring e integrações de servidor de aplicativos. Todos eles fornecem as garantias de conformidade, disponibilidade e confiabilidade que você espera da Microsoft e do Azure. Muitos desenvolvedores Java e Spring desejam usar bibliotecas idiomáticas para simplificar as conexões com seus serviços de nuvem preferenciais. A Microsoft mantém uma lista completa de bibliotecas, drivers e módulos que permitem interagir facilmente com serviços do Azure em dados, mensagens, cache, armazenamento, eventos, diretório e gerenciamento de segredos. Para obter mais informações, confira o Guia do desenvolvedor Spring Cloud Azure.

Diagrama que lista os recursos do Spring Cloud Azure e os serviços do Azure associados.

Diagrama que mostra as categorias de recursos e os serviços de plataforma do Azure associados mantidos por várias bibliotecas Java, drivers e módulos do Spring.

Zero Trust - Rede segura

Você pode proteger seus aplicativos Java implantando-os em uma Rede Virtual do Azure, o bloco de construção fundamental para suas próprias redes privadas no Azure. As redes virtuais permitem vários tipos de recursos do Azure para se comunicar com segurança uns com os outros, com a Internet e com suas redes e sistemas locais. Você pode usar uma rede virtual para isolar seus aplicativos e serviços de back-end de suporte da Internet e colocá-los em suas redes privadas. Você pode assumir o controle total de entrada e saída para seus aplicativos e sistemas de back-end.

Diagrama do Acelerador de Zona de Destino dos Aplicativos de Contêiner do Azure.

Zero Trust - Comunicações seguras de ponta a ponta

A implementação de comunicações seguras como parte de uma arquitetura de solução pode ser desafiadora. Muitas empresas alternam manualmente seus certificados ou criam suas próprias soluções para automatizar o provisionamento e a configuração. Mesmo assim, ainda existem riscos de exfiltração de dados, como cópia ou transferência de dados não autorizada.

Com o Azure, você pode proteger as comunicações de ponta a ponta ou encerrar a segurança no nível do transporte em qualquer ponto de comunicação. Também é possível automatizar o provisionamento e a configuração de todos os recursos do Azure necessários para proteger as comunicações.

Com base no princípio de "nunca confie, sempre verifique e sem credenciais", o Zero Trust ajuda a proteger todas as comunicações, eliminando certificados desconhecidos e não gerenciados e confiando apenas em certificados compartilhados verificando a identidade antes de conceder acesso a esses certificados. Você pode usar qualquer tipo de certificado TLS/SSL, incluindo certificados emitidos por uma autoridade de certificação, certificados de validação estendida, certificados curinga com suporte para qualquer número de subdomínios ou certificados autoassinados para ambientes de desenvolvimento e teste.

Os aplicativos Java ou Spring Boot podem carregar certificados com segurança do Azure Key Vault (discutido a seguir). Com o Azure Key Vault, você controla o armazenamento e a distribuição de certificados para reduzir os vazamentos acidentais. Aplicativos e serviços podem acessar certificados com segurança usando identidades gerenciadas, controle de acesso baseado em função e o princípio de privilégios mínimos. Esse carregamento seguro é desenvolvido usando o provedor de JCA (Arquitetura de Criptografia Java) do Azure Key Vault.

Diagrama da arquitetura para comunicações seguras de ponta a ponta para aplicativos Spring Boot.

Zero Trust - Gerenciar segredos

Muitos aplicativos Java são conectados a serviços de suporte usando URLs e credenciais - informações que, se expostas, podem ser usadas para obter acesso não autorizado a dados confidenciais. A inserção dessas informações em um aplicativo em si apresenta um enorme risco de segurança por vários motivos, incluindo a descoberta por meio de um repositório de código. Muitos desenvolvedores externalizam tais credenciais usando variáveis de ambiente, para que vários aplicativos possam carregá-las, mas isso apenas transfere o risco do próprio código para o ambiente de execução.

Diagrama com o título 'Zero Trust – gerenciar segredos usando o Azure Key Vault' e incluindo um resumo dos recursos descritos nesta seção.

O Azure Key Vault oferece uma maneira melhor, mais segura e mais protegida de proteger segredos. Ele oferece controle total sobre o armazenamento e a distribuição de segredos do aplicativo, usando o RBAC (Controle de Acesso Baseado em Função) e o princípio de privilégio mínimo para limitar o acesso. Você mantém o controle sobre seus segredos do aplicativo: basta conceder permissão para que seus aplicativos usem esses segredos conforme necessário. Após a inicialização do aplicativo, antes de conceder acesso aos segredos, o aplicativo é autenticado com o Microsoft Entra ID e o Azure Key Vault autoriza o uso do RBAC do Azure. O Azure Key Vault inclui recursos completos de auditoria e tem duas camadas de serviço: Standard, que faz a criptografia com uma chave de software, e uma camada Premium, que inclui chaves protegidas por HSM (módulo de segurança de hardware).

Autenticação e autorização de usuários finais

A maioria dos aplicativos Java corporativos exige autenticação e autorização de usuário, que você pode implementar usando o Microsoft Entra ID, uma solução completa de gerenciamento de identidades e acesso com segurança integrada. As contas de usuário final podem ser identidades organizacionais ou sociais do Facebook, Twitter ou Gmail que usam o Microsoft Entra ID e o Azure Active Directory B2C. Você pode implementar soluções baseadas no Microsoft Entra ID que usam a Biblioteca de Autenticação da Microsoft para Java ou Spring Boot Starter para Microsoft Entra. Você também pode usar qualquer provedor de identidade de sua escolha, como ForgeRock, Auth0, Ping ou Okta.

Monitoramento completo

Com o Azure, você pode monitorar seus aplicativos Java de ponta a ponta, usando qualquer ferramenta e plataforma. Como alternativa, você pode implementar o monitoramento nativo totalmente gerenciado, incluindo o APM (monitoramento do desempenho de aplicativos), usando o Application Insights, um recurso do Azure Monitor. Ele fornece forte suporte para Java, Spring e estruturas, como Micrometer e Spring Boot, permitindo que você identifique e solucione problemas rapidamente. Os recursos incluem a transmissão de métricas ao vivo, a taxa de solicitação e o acompanhamento do tempo de resposta, além do rastreamento de eventos e as taxas de dependência externas, tudo que você precisa para monitorar a disponibilidade, o desempenho, a confiabilidade e o uso de aplicativos Java em execução no Azure ou no local.

Você pode monitorar de ponta a ponta agregando logs e métricas no Log Analytics, uma ferramenta no portal do Azure que pode ser usada para editar e executar consultas em dados de logs e métricas no Azure Monitor. Você pode escrever uma consulta que retorna um conjunto de registros e usar o Log Analytics para classificá-los, filtrá-los e analisá-los. Também é possível escrever uma consulta mais avançada para executar análises estatísticas e visualizar os resultados em um gráfico, pois pode ser necessário identificar uma tendência específica. Independentemente de você trabalhar com os resultados das suas consultas de maneira interativa ou usá-las com outros recursos do Azure Monitor, como alertas de consulta de log ou pastas de trabalho, o Log Analytics é a ferramenta ideal para usar para escrever e testar as consultas.

Sendo assim, percebemos que os clientes que estão trazendo seus aplicativos Java para o Azure podem querer continuar usando as mesmas ferramentas de APM que estão usando para monitorar seus aplicativos locais. Para dar suporte a esse uso, fizemos uma parceria com a New Relic, a AppDynamics, a Dynatrace e a Elastic para integrar suas soluções de monitoramento ao Serviço de Aplicativo do Azure e aos Aplicativos de Contêiner do Azure. Os agentes de monitoramento são executados lado a lado com seu código, e nós instalamos e mantemos os agentes atualizados para você. Ao implantar em Aplicativos de Contêiner do Azure, Serviço de Kubernetes do Azure ou Máquinas Virtuais, você pode executar qualquer um destes agentes (incluindo New Relic, AppDynamics, Dynatrace, Elastic e Datadog) junto com seus aplicativos, mas precisa instalá-los e gerenciá-los por conta própria. Da mesma forma, você pode monitorar de ponta a ponta, agregando logs e métricas no Elastic e no Splunk.

Diagrama com o título

Também sabemos que muitos clientes desejam continuar usando o Grafana para consultar, visualizar, alertar e entender suas métricas. Por esse motivo, fizemos uma parceria com o Grafana Labs para fornecer o Azure Managed Grafana, um serviço totalmente gerenciado que permite que os clientes executem o Grafana nativamente no Azure. O serviço facilita a implantação de instâncias seguras e escalonáveis do Grafana e as conecta a fontes de dados de código aberto, nuvem e de terceiros para visualização e análise. O serviço é otimizado para fontes de dados nativas do Azure, como Azure Monitor e Azure Data Explorer, e inclui integrações de APM (monitoramento do desempenho de aplicativos) com serviços de computação do Azure, como Serviço de Aplicativo do Azure, Aplicativos de Contêiner do Azure, Serviço de Kubernetes do Azure, Splunk, Datadog e Máquinas Virtuais do Azure.

Acelerar aplicativos Java usando armazenamento em cache

À medida que as cargas de trabalho para seus aplicativos Java aumentam, você pode aumentar o desempenho usando o Cache do Azure para Redis para implementar uma camada de cache na memória para resultados de consulta, estados de sessão e conteúdo estático. É uma ótima maneira de melhorar a taxa de transferência de aplicativo e reduzir a latência sem precisar rearquitetar seu banco de dados subjacente. As camadas do Cache do Azure para Redis Enterprise, desenvolvidas em parceria com o Redis e totalmente gerenciadas pela Microsoft, são a opção de implantação mais altamente disponível e escalonável para executar o Redis no Azure, incluindo recursos como replicação geográfica ativa, gerenciamento de sessão externalizado e pesquisa e indexação de alta velocidade.

Diagrama com o título

Dimensionamento automático

Todos os serviços de "computação" do Azure para executar aplicativos Java dão suporte ao dimensionamento automático, que pode ajudá-lo a maximizar a eficiência de custos e se adaptar às cargas de trabalho em constante mudança sem pagar por mais capacidade do que o necessário. Depois de habilitado, você pode ter certeza de que o dimensionamento automático cuida de sua infraestrutura subjacente e de suas cargas de trabalho de aplicativos.

Diagrama com o título

Você pode reduzir ou expandir automaticamente com base na carga ou no agendamento. No modo baseado em carga (ou baseado em métrica), os aplicativos são escalados horizontalmente para os recursos necessários para lidar com a carga, até os limites definidos. Da mesma forma, quando a carga diminui, os recursos são reduzidos horizontalmente, nunca ficando abaixo dos mínimos definidos.

No modo baseado em agendamento, os aplicativos são reduzidos e escalados horizontalmente com base em um agendamento e limites definidos. O modo baseado em agendamento é útil para cargas de trabalho que seguem um padrão previsível e pode ser usado para estabelecer uma linha de base para um dimensionamento mais baseado em carga.

Automação da ideia à produção

À medida que você migra os aplicativos para a nuvem, deseja automatizar tudo, conforme necessário para o desenvolvimento Java em escala empresarial. Você precisa considerar o dimensionamento automático para lidar com cargas de trabalho de aplicativos, conforme abordado anteriormente. Mas, você também precisa dimensionar e automatizar seu ambiente de nuvem como um todo, idealmente da ideia à produção, incluindo como provisionar rapidamente novos ambientes para teste, controle de qualidade, produção, implantações azuis/verdes, expansão geográfica e assim por diante.

Diagrama que mostra caixas para as categorias Provisionar, Compilar e Implantar com logotipos associados para as ferramentas descritas nesta seção.

O Azure permite automatizar desde a ideia até a produção usando uma ampla variedade de ferramentas e plataformas. Em um nível alto, esses pipelines de automação podem ser divididos em três categorias:

  • Pipelines de provisionamento – você pode provisionar recursos do Azure usando o Terraform, os modelos do ARM (Azure Resource Manager), modelos Bicep ou a CLI do Azure, conforme necessário para criar scripts repetíveis para ambientes de ativação e redução consistentes.

  • Pipelines de build – com base em ferramentas, como Maven ou Gradle, conforme discutido anteriormente nesta documentação.

  • Pipelines de implantação – você pode usar o GitHub Actions, Azure Pipelines, Jenkins Pipelines, GitLab Pipelines ou a CLI do Azure para automatizar implantações de código, incluindo implantações azuis/verdes que mantêm sistemas críticos em produção à medida que você implanta atualizações de código.

Continuar usando práticas e sistemas existentes

Ao migrar ou compilar e dimensionar seus aplicativos Java no Azure, você pode usar seus investimentos existentes em rede, monitoramento, automação, provedores de identidade, sistemas locais, ferramenta de desenvolvimento e build e bibliotecas de aplicativos. A tabela a seguir fornece alguns exemplos:

Categoria Produtos e serviços do ecossistema Java
Rede F5, Palo Alto, Cloudflare, Checkpoint, Infoblox
Monitoramento New Relic, Dynatrace, AppDynamics, Elastic, Splunk
Automação GitHub Actions, Azure Pipelines, Jenkins, GitLab
Provedores de identidade Microsoft Entra ID, ForgeRock, Auth0, Ping, Okta
Sistema local Bancos de dados (como Oracle DB ou IBM DB2), sistema de mensagens (como IBM MQ ou TIBCO EMS), eventos (como Kafka), diretórios (como Microsoft Entra ID, OpenLDAP ou IBM ID)
Ferramentas de desenvolvimento IntelliJ, Visual Studio Code, Eclipse, Spring Tool Suite, Maven, Gradle

Arquiteturas de referência

O Centro de Arquitetura do Azure fornece orientação para criar soluções no Azure usando padrões e práticas estabelecidos, incluindo como colocar esses recursos em uso. Essas arquiteturas de referência são baseadas no que aprendemos com os engajamentos de cliente, levando em consideração a otimização de custos, a excelência operacional, a eficiência de desempenho, a confiabilidade, a escalabilidade, a segurança, o monitoramento, o teste de fumaça e muito mais. Elas também abordam componentes de design de solução, como zonas de destino do Azure – ambientes para hospedar suas cargas de trabalho que são pré-provisionadas por meio de infraestrutura como código, conforme necessário para habilitar migrações de aplicativos Java e novos desenvolvimentos em escala empresarial.

Por exemplo, aqui está um acelerador de zona de destino para Aplicativos de Contêiner do Azure, mostrando como implementar um design hub-and-spoke no qual os Aplicativos de Contêiner do Azure são implantados em um único spoke que depende de serviços compartilhados hospedados no hub. Este projeto é criado com componentes para alcançar os princípios da Microsoft Azure Well-Architected Framework. Para explorar uma implementação dessa arquitetura, confira o o repositório do Acelerador de Zona de Destino dos Aplicativos de Contêiner do Azure no GitHub. Você pode aplicar a mesma abordagem a qualquer aplicativo Java implantado em qualquer destino de "computação" do Azure, como Serviço de Aplicativo do Azure ou Serviço de Kubernetes do Azure. Além disso, se você estiver procurando migrar aplicativos Java existentes para o Azure, temos um conjunto completo de guias de migração e estratégias recomendadas.

Diagrama com o título

Próxima etapa

Escolher os serviços ideais do Azure para seus aplicativos Java