Conteinerização de aplicações legadas

20 min de leitura
Patrocinado
Imagem de: Conteinerização de aplicações legadas
Avatar do autor

Equipe TecMundo

Por: Geert-Willem Haasjes

Publicado em: 16 de setembro de 2020

Executar aplicações como contêineres é o novo padrão para softwares e soluções com desenvolvimento nativo em cloud. Muitos livros, artigos e postagens em blogs descrevem como obter benefícios utilizando uma plataforma baseada em contêineres. Mas e quanto às suas aplicações legadas? O que você fará com elas? Será que elas podem se beneficiar de uma abordagem run-as-containers (execute como contêineres, em português)?

Para muitas empresas, uma grande parte do orçamento de TI é utilizada para manter e gerenciar a dívida técnica do portfólio de aplicações legadas. Tendo isso em vista, a conteinerização pode fazer parte do processo de manutenção de propriedades? Como apenas 20% das cargas de trabalho corporativas foram transferidas para a cloud, os 80% restantes não estão aproveitando totalmente o potencial de escala da solução. Será que a conteinerização pode ser um novo caminho econômico para a cloud no caso de aplicações legadas? Por causa de seu tamanho e complexidade, na prática, a modernização de aplicações e bancos de dados monolíticos é difícil. Poderá a adoção gradual de arquiteturas nativas em cloud ser uma abordagem para tornar nossos monólitos mais ágeis e prontos para o futuro?

Este artigo fala sobre como benefícios podem ser obtidos ao se mover aplicações legadas para contêineres e para a cloud. Elaborei o conceito de que a conteinerização não é uma coisa binária, como estar em contêineres ou não. É muito mais uma questão de escala no estilo de até que ponto os conceitos de contêineres podem ser adotados e em que granularidade.

Para cenários nativos em cloud, o uso de contêineres é padrão e não traz muitos custos indiretos porque eles fazem parte da arquitetura desde o início. Em contraste, a conteinerização de aplicações legadas sempre requer algum tipo de transformação e investimentos correspondentes. Por conta disso, uma discussão de custo versus benefício precisa ocorrer. Abro um modelo de caso de negócio que o ajudará a tomar essas decisões de investimentos, respondendo à pergunta de quando a conteinerização de aplicações legadas faz sentido e até que ponto.

Conteinerização no contexto da modernização de aplicações legadas

Os contêineres e as ferramentas de orquestração de contêineres – como o Kubernetes – são tendências emergentes que estão prestes a se tornarem revolucionárias na engenharia de software e no setor de TI. A maneira como o conceito de contêiner fornece uma camada de abstração para a infraestrutura não tem precedentes do ponto de vista dos desenvolvedores de softwares.

Entretanto, antes que uma aplicação possa ser implementada em contêineres, você precisa começar a pensar em quando uma aplicação é adequada para a conteinerização. Portanto, vamos primeiro pensar sobre o termo "conteinerização", porque pode envolver coisas diferentes para cenários distintos.

Para cenários nativos em cloud, a conteinerização é o processo de "empacotar" códigos de software compilados, bibliotecas, configurações e definições de computação, rede e armazenamento em um conjunto de contêineres e definições de gerenciamento de contêineres (Kubernetes). Esses contêineres são implementados em um mecanismo de tempo de execução, como Docker Engine ou CRI-O. A escalabilidade, a alta disponibilidade e o gerenciamento de cluster são organizados pela ferramenta de orquestração de contêiner.

Em um contexto de aplicações legadas, o significado da palavra "conteinerização" precisa ser aumentado para incluir tudo o que é necessário a fim de tornar uma aplicação existente pronta para adotar o conceito de execução como um contêiner. Ou seja, em uma medida bem equilibrada com a viabilidade técnica e os benefícios comerciais esperados.

Olhando para a conteinerização por esse prisma, a próxima etapa lógica é apresentar uma escala na qual uma aplicação legada possa adotar o conceito de execução como um contêiner. Essa escala varia de uma simples conteinerização, que não muda nada na aplicação legada, até uma mais complexa, onde as aplicações são refatoradas ou mesmo recodificadas. Por conta disso, a conteinerização de aplicações legadas é um espectro de técnicas simples, médias e complexas que podem ser aplicadas quando apropriadas a partir de perspectivas técnicas e de negócios.

Por exemplo, imagine um espectro da esquerda para a direita representando contêineres simples a complexos. No lado esquerdo desse espectro, você pode "empacotar" uma aplicação no estado em que ela se encontra para um ou alguns contêineres, armazenar imagens de contêiner em um registro de contêiner e executar a aplicação como um ou um conjunto de contêineres em uma plataforma, como Docker Motor ou CRI-O.

Mudando para a direita ao longo do espectro de conteinerização, você pode introduzir ferramentas de orquestração de contêineres para iniciar, parar e reiniciar contêineres com base em eventos externos.

Mais adiante no espectro, você pode implementar partes da aplicação legada que são adequadas para serem executadas independentemente do usuário ou do estado da lógica de negócios (sem estado), ou seja, como contêineres separados, a exemplo do front-end de uma aplicação da web. Esses contêineres podem ser controlados automaticamente pelo Kubernetes com o intuito de cumprir as restrições declaradas de disponibilidade ou escalabilidade.

Mudando um pouco mais para a direita do espectro, você pode refatorar parcialmente sua aplicação legada, identificando as partes que são adequadas para serem executadas como serviços macroindependentes, embora de granulação grossa, e as tornado parte do cluster de aplicação legada.

IBMEspectro da conteinerização

Ainda mais à direita ao longo do espectro, você pode encontrar técnicas para refatorar sua aplicação de forma que os módulos de nível de microsserviços possam ser implementados e executados de forma independente, e você pode utilizar contêineres e Kubernetes em sua totalidade como se sua aplicação tivesse sido projetada para eles desde o início. Isso é o mais à direita e o mais próximo do lado nativo da cloud do espectro, se você quiser fazer tal associação.

Movendo-se da esquerda para a direita ao longo desse espectro, quanto mais sua aplicação utiliza a plataforma em contêiner, maior é o número de benefícios que ela recebe. Como resultado, você tem mais economia e agilidade nos negócios. Ao mesmo tempo, os investimentos que deve fazer para transformar sua aplicação legada aumentam. Mais riscos são apresentados a esses tipos de projetos à medida que a complexidade técnica aumenta a fim de se refatorar ou recodificar a aplicação.

Como acontece com todas as abordagens de migração, escolher a técnica de conteinerização legada correta dentro desse espectro é uma questão de encontrar o equilíbrio certo entre investimento, resultado comercial, ganho de custo-benefício, viabilidade técnica e apetite por risco.

Tecnologias emergentes de contêineres abrem caminhos para a cloud

Se e até que ponto uma aplicação legada pode ser armazenada em contêineres depende do seu arsenal de tecnologia. No geral, tecnologias mais arcaicas, como estruturas de desenvolvimento de software mais antigas, intensificam a dificuldade de se mover uma aplicação a um contêiner. Estão se tornando disponíveis tecnologias de contêineres que abrem mais possibilidades de se mover uma aplicação para um contêiner e, em seguida, para a cloud.

Versões em contêineres específicas e leves de middleware

Um princípio fundamental de uma arquitetura baseada em contêiner são os componentes leves que podem ser reiniciados rapidamente. O objetivo é manter os recipientes o mais leve possível, por exemplo, utilizando o mínimo de volume de disco praticável para os arquivos de instalação dentro do contêiner. Na maioria dos casos, os arquivos do sistema operacional não precisam fazer parte do contêiner, pois os contêineres reutilizam os arquivos do sistema operacional da plataforma de hospedagem. Além disso, vejo uma tendência em que versões leves de middleware se tornam disponíveis. Por exemplo, uma versão leve de um servidor de aplicações da web que inclui apenas os componentes e arquivos necessários para facilitar as funções que a aplicação no contêiner requer. Isso resulta em software de middleware que contribui para um footprint menor e tempos de reinicialização mais curtos dos contêineres.

Suporte stateful do Kubernetes para partes que gerenciam um banco de dados

Uma arquitetura baseada em contêiner funciona bem para aplicações projetadas sem estado. Afinal, a resiliência e a escalabilidade são implementadas por reinicializações de contêineres com falha ou iniciam contêineres idênticos em paralelo a fim de executar as funções da aplicação em uma carga mais alta. Isso funciona melhor quando nenhum estado deve ser gerenciado na lógica da aplicação. No entanto, a maioria das aplicações legadas exige gerenciamento de estado e persistência de dados. O Kubernetes pode coordenar estados e persistência de dados, fornecendo um mecanismo para rastrear volumes de armazenamento e manter nomes de host após uma reinicialização do contêiner usando o recurso StatefulSet. Isso permite a conteinerização das partes da aplicação legada que gerencia estados, como bancos de dados.

Contêineres do Windows Server

A vantagem do Windows Server Containers é que ele permite a conteinerização de aplicações .NET, o que torna o escopo da conteinerização muito maior. Versões mais antigas de aplicações .NET são suportadas e você pode eliminar conflitos entre diferentes versões de aplicações do Internet Information Services (IIS) ou .NET, pois elas também podem coexistir. Outro caso interessante de conteinerização é isolar uma versão mais antiga do sistema operacional Windows em um contêiner do Windows Server 2016 como uma vitória rápida e permanente.

Uma breve discussão sobre como armazenar aplicações legadas

O objetivo deste artigo é explicar o que é e por que adotar conteinerização de aplicações legadas para ajudá-lo a avaliar se a conteinerização é uma abordagem benéfica para a sua situação. Em artigos futuros, descreverei como realizar a conteinerização de aplicações legadas, que é apenas uma parte limitada deste artigo, conforme descrito abaixo.

Abordagem de conteinerização

Na minha opinião, programas de conteinerização bem-sucedidos requerem cinco ações críticas:

1. Avaliar seu portfólio de aplicações para selecionar os candidatos corretos para a conteinerização

Uma avaliação de afinidade de cloud de suas aplicações é necessária para identificar os candidatos certos em seu portfólio de aplicações que são adequados para uma forma inicial de contêiner. Você receberá bons resultados quando os parâmetros relevantes de sua aplicação forem examinados durante esta análise de afinidade de primeira passagem. Os parâmetros devem incluir frequência de uso da aplicação, criticidade de negócios, linguagens de programação usadas, sistema operacional, requisitos de hardware, tecnologia de banco de dados e uso de infraestrutura, apenas para citar alguns importantes. A IBM Cloud Advisory Tool é um exemplo de ferramenta que pode dar apoio à sua avaliação inicial de afinidade com a cloud. Depois que uma filtragem de primeira passagem é feita, você precisa realizar uma análise mais detalhada por aplicação para entender as dependências da tecnologia. Esta análise utiliza o código ou arquivos de implementação, como arquivos da web (WARs) e de aplicações corporativas (EARs), como entrada para determinar quais linguagens de programação e estruturas são usadas. Essa análise também deve ter como objetivo identificar as partes que podem ser executadas independentemente como um contêiner, seja como macrosserviços ou mesmo microsserviços. O Red Hat Application Migration Toolkit é um exemplo de ferramenta que auxilia nesta fase detalhada.

2. Selecionar a abordagem de migração correta

A maioria das aplicações legadas pode ser movida para contêineres sem muita adaptação inicial. Seguindo um método de conteinerização no lado esquerdo e menos complexo do espectro de conteinerização, você pode construir manualmente uma imagem de contêiner definindo um Dockerfile que inclui todas as instalações e configurações que são necessárias para funcionar como um contêiner nativamente em um servidor. Uma maneira mais indicada é utilizar a ferramenta Image2Docker, que usa imagens de nível de máquina virtual (VM) como entrada para criar uma imagem de contêiner Docker. Outra ferramenta entra em ação quando a aplicação legada precisa ser refatorada ou recodificada. A parte mais complexa da conteinerização é a movimentação do contêiner para um novo ambiente de cloud, onde a integração com o sistema auxiliar precisa ocorrer, a exemplo dos sistemas de autenticação de segurança. Outra coisa à qual se deve prestar atenção é definir como a aplicação em contêiner se ajusta ao domínio do servidor de diretório. A reconexão da aplicação em contêiner aos bancos de dados necessários pode exigir design, dependendo de sua estratégia de migração para os bancos de dados, especialmente quando estes permanecem em servidores locais. Para tais cenários, o design de sua rede precisa ser executado para facilitar a troca entre a aplicação em contêiner na cloud e o ambiente de banco de dados local – sendo também importante para as aplicações conectadas que permanecem em servidores locais.

3. Definir e controlar uma arquitetura de destino adequada para hospedar suas aplicações em contêineres

Muitas empresas estão em vias de incorporar contêineres e Kubernetes em seus cenários de TI. Existem três considerações importantes aqui. Primeiro, construir contêineres e uma plataforma Kubernetes sozinho é complexo. Isso requer a tomada de muitas decisões arquitetônicas interligadas, especialmente em relação à rede e à segurança. Como a maioria das empresas adota duas ou mais plataformas de hyperscalers de cloud, a implementação de contêineres e camada Kubernetes aumenta a complexidade em relação aos diferentes tipos de serviços que os hyperscalers oferecem. Tendo isso em vista, eu recomendo uma abordagem de arquitetura aberta para criar um plano de controle geral entre as clouds. Essas arquiteturas abertas podem ser obtidas pelo Red Hat OpenShift, que está disponível em todos os principais hyperscalers. Em segundo lugar, os contêineres e os serviços Kubernetes em hyperscalers vêm com diferentes níveis de serviço. Você deve considerar qual nível de serviço (nenhum nível de serviço, objetivo de serviço ou acordos de nível de serviço) se encaixa melhor em sua estratégia empresarial de TI. Em muitos casos, as empresas adotam contêineres totalmente gerenciados e serviço Kubernetes para liberarem recursos e se concentrarem em aplicações e processos de negócios. Terceiro, construir contêineres e plataforma Kubernetes é uma jornada. Usar um modelo de crescimento à medida que avança para os serviços de que você precisa para executar suas cargas de trabalho iniciais como contêineres é a melhor abordagem para equilibrar seus investimentos com os resultados. Por exemplo, você pode começar com Windows Server Containers apenas para hospedar suas cargas de trabalho Windows e .NET.

4. Reutilizar e controlar receitas, modelos e padrões

Por meio do meu trabalho com clientes em todos os setores, aprendi que capturar padrões e receitas bem-sucedidas para o desenvolvimento de soluções e modernização de aplicações é a chave para o sucesso repetível e para crescer dentro do domínio de trabalho e além. Padrões e receitas reproduzíveis devem ser capturados para avaliar, migrar e executar aplicações como contêineres, fornecendo uma descrição detalhada do que funciona e do que não funciona no contexto do cenário específico de TI da empresa. Um manual de conteinerização bem administrado e mantido é uma boa maneira de capturar essas receitas e esses padrões.

5. Desenvolver um business case para progredir em seu programa de conteinerização

Uma abordagem consistente de desenvolvimento de business case é importante para alimentar seu programa de conteinerização. Eu me refiro aos elementos do business case mais adiante neste artigo. Seu desenvolvimento contínuo alinha o investimento com o resultado e muda com o tempo, quando mais tecnologia de contêiner se torna disponível e amadurece. Por exemplo, uma empresa pode se concentrar em ganhos rápidos primeiro para mover aplicações da web baseadas em Linux para contêineres, que se beneficiam de maior utilização de infraestrutura e menores custos de gerenciamento.

Benefícios técnicos de conteinerização de aplicações legadas

Há uma diferença fundamental entre os resultados após a conteinerização de uma aplicação legada e os resultados após a virtualização. A virtualização se concentra em como a infraestrutura pode ser definida e compartilhada para hospedar aplicações e gerencia as dependências com os recursos de infraestrutura que fornecem uma camada para executar aplicações. Em contraste, os contêineres se concentram nos requisitos da aplicação que precisam ser atendidos pela infraestrutura. Contêineres e Kubernetes oferecem suporte a uma abordagem declarativa para gerenciar esses requisitos não funcionais. Imagine um arsenal de tecnologia tradicional com hardware, um sistema operacional e um aplicação hospedada. A virtualização olha da aplicação para a infraestrutura, enquanto os contêineres e Kubernetes olham para a aplicação.

Nas seções a seguir, discuto algumas vantagens técnicas específicas que os contêineres e o Kubernetes criam para aplicações legadas. As vantagens se dividem em três grupos: operações de serviço aprimoradas, adoção de cloud híbrida e aceleração de modernização de aplicações.

Operações aprimoradas de serviço 

Manuseio mais rápido de contêineres por meio de footprint menor

Como mencionei anteriormente, o volume total de disco de que um contêiner precisa para executar uma aplicação é menor do que o de VMs. Como resultado, os contêineres são mais leves para operar. Por exemplo, o tempo de inicialização para contêineres pode ser de segundos, o que permite a recuperação de serviço em alta velocidade apenas reiniciando um novo contêiner.

Prontidão para orquestração de contêineres do Kubernetes

Depois que uma aplicação legada é colocada em contêiner, ela pode usar recursos de orquestração de contêiner, como aqueles do líder de fato, Kubernetes. Você pode obter melhor resiliência e escalabilidade para sua aplicação apenas definindo os requisitos e restrições que a aplicação deve cumprir. O Kubernetes cuida do gerenciamento do contêiner para garantir que sua aplicação seja executado de acordo com esses requisitos. Isso aumenta a programabilidade de como e sob quais restrições sua aplicação deve ser executada. Ele muda a maneira como as operações de serviço funcionam, desde a execução de tarefas e processos para executar a ação até uma abordagem em que você apenas define o resultado do serviço (declarativo).

Melhor automação de serviço

A orquestração de contêineres do Kubernetes é implementada por arquivos de configuração YAML que definem o resultado do serviço de aplicação em termos de onde deve ser implementado, onde deve ser replicado em casos de maior carga ou failover ou como gerenciar a persistência. Dessa forma, implementação, escalabilidade, resiliência e monitoramento são totalmente automatizados pela plataforma Kubernetes. A maior escala de automação contribui para a redução de custos do gerenciamento de serviços.

Fluxo mais fácil de mudanças para produção e entrega contínua

A abordagem declarativa para implementação que mencionei anteriormente reconhece um processo automático de código para implementação. Isso permite um fluxo mais fácil de alterações para a produção e contribui para a entrega contínua de recursos de aplicações para o seu negócio.

Aumento de resiliência leva a sistemas de autorreparação

O failover automático de reiniciar novas instâncias de contêiner quando há um problema pode aumentar a resiliência geral do cenário de sua aplicação. Também leva a uma abordagem de sistema de autocura com menos interações manuais. Isso resulta em um maior tempo de atividade de suas aplicações com menos esforço.

Detecção mais rápida de problemas por meio de coleta e rastreamento de registros

Embora o Kubernetes assuma muitas das responsabilidades de gerenciamento de serviço, ainda é importante analisar quaisquer falhas que ocorram em seu cenário de contêiner. Devido à abordagem de cluster do Kubernetes de um plano de controle que supervisiona os nós de trabalho, você pode identificar problemas com a coleta e a análise de registros em um nível refinado. Os recursos de código aberto, como a ELK stack, são agora o padrão de fato para construir um pipeline de processamento de dados de log para um mecanismo de análise que alimenta painéis gráficos.

Adoção de cloud híbrida

Implementação definida por software

Kubernetes e contêineres permitem uma implementação densa de sua aplicação com acoplamento relativamente fraco para sua infraestrutura. Você pode manter os domínios da aplicação e do usuário separados com namespaces enquanto controla sua alocação de recursos de computação, rede, armazenamento e controle de acesso. Esse conceito de definir uma vez/executar em qualquer lugar facilita a implementação de aplicações em escala global e de forma controlada e consistente.

Maior portabilidade de aplicações

A camada básica padronizada de mecanismos de contêiner e Kubernetes possibilita a implementação de aplicações em diferentes ambientes, mesmo em diferentes nuvens, no local e na edge. Isso acomoda o acoplamento fraco com provedores de tecnologia em cloud e aumenta seu poder de negociação para contratação de recursos.

Reduzir o footprint nos recursos de infraestrutura

O footprint baixo do contêiner e o mecanismo de implementação rápida permitem uma implementação mais inteligente na infraestrutura, o que leva a um menor uso de recursos. Além de reduzir o uso de armazenamento dos arquivos de instalação da aplicação, você pode compartilhar recursos de computação entre um conjunto de aplicações ou em ambientes de produção e não produção.

Aceleração de modernização de aplicações

Isolamento de tecnologia legada

A modernização de seu cenário de aplicações consolida o número de tecnologias que você deve gerenciar. No entanto, é difícil manter seu cenário perene devido às dependências entre o código da aplicação e as bibliotecas e estruturas de tecnologia. Os contêineres fornecem uma maneira de isolar tecnologias mais antigas que são pré-requisitos para o código de sua aplicação sem interferir com outros conjuntos de aplicações.

Sem recodificação

Você pode obter ganhos rápidos iniciais apenas aplicando a técnica de conteinerização mais simples possível, sem qualquer recodificação ou refatoração de sua aplicação legada. Essa abordagem de baixo investimento é um novo caminho para a cloud e abre a possibilidade de mover mais cargas de trabalho para o ambiente, especialmente nos casos em que a elevação e a mudança de uma VM são complexas devido às dependências da infraestrutura subjacente.

Desenvolvimento de business case para transformação de legado com conteinerização

Muitas organizações enfrentam o desafio de mover suas propriedades de aplicações legadas para a cloud. Com apenas 20% das cargas de trabalho corporativas movidas para a cloud, as empresas não estão aproveitando totalmente os recursos e a elasticidade em escala de cloud, a segurança em escala de cloud e o potencial de automação. As vantagens técnicas fornecidas pelas técnicas de conteinerização criam um novo caminho para a cloud para mais cargas de trabalho. Isso compensa em duas áreas: eficiência de custos e agilidade nos negócios.

Eficiência de custos

Retirada de custos de infraestrutura

Uma implementação definida por softwares de aplicações para infraestrutura e adoção de arquitetura aberta com maior portabilidade de cargas de trabalho torna mais fácil selecionar a infraestrutura mais econômica. Você pode implementar aplicações em vários provedores de tecnologia em cloud ou em servidores locais se precisar cumprir os requisitos e restrições de dados globais ou locais, por exemplo. Além disso, o compartilhamento de infraestrutura, ou fazer mais com a mesma capacidade, é um cenário viável com aplicações em contêineres.

Retirada de custos de gerenciamento de serviços

A implementação de aplicações como contêineres pode ser altamente automatizada e reduzir o custo do gerenciamento de serviços. Além disso, os mecanismos de autocorreção dos clusters do Kubernetes também contribuem para reduzir o risco de operações e aumentar a resiliência do cenário de aplicações.

Agilidade de negócios

Aceleração do valor do negócio

Muitas organizações ainda enfrentam um longo tempo de espera para colocar novas ideias em produção. A abordagem de contêineres e Kubernetes encurta esse caminho. Primeiro, o desenvolvimento de uma implementação altamente componentizada com contêineres permite que você altere um escopo limitado de sua aplicação e implante-o em um escopo limitado de seu ambiente de produção. Em outras palavras, o impacto de uma mudança é menor em termos de custo, esforço e risco. Em segundo lugar, a implementação automatizada e a entrega contínua permitem que você promova mudanças menores na produção de forma controlada e com uma frequência muito maior, às vezes semanalmente ou diariamente, se necessário.

Padronização e melhoria da segurança

Definições e imagens de contêiner são altamente reutilizáveis. Isso permite que você padronize seu conjunto e melhore a governança de quais tecnologias são permitidas e quais não são. Esse maior controle de tecnologias aplicadas e padrões de arquitetura e segurança contribuem para uma maior integridade do conjunto geral que você utiliza para hospedar aplicações.

Resumo e próximas etapas

A conteinerização é uma técnica de modernização emergente para mover aplicações legadas para a cloud. Um espectro de abordagens de conteinerização permite que você selecione a técnica certa que equilibra seus investimentos com os benefícios de negócios. Os programas bem-sucedidos de conteinerização de legado incluem a avaliação de candidatos a aplicações, uma abordagem de fábrica para migração, uma arquitetura de destino adequada, o gerenciamento de práticas recomendadas e o desenvolvimento contínuo de business case.

A próxima etapa lógica para você é executar um piloto de conteinerização para algumas de suas aplicações legadas para obter uma compreensão do potencial de redução de custos e benefícios de negócios. Ele também fornecerá insights sobre como sua arquitetura de destino deve se parecer para hospedar a primeira onda de aplicações em contêineres.

...

Quer ler mais conteúdo especializado de programação? Conheça o IBM Blue Profile e tenha acesso a matérias exclusivas, novas jornadas de conhecimento e testes personalizados. Confira agora mesmo, consiga as badges e dê um upgrade na sua carreira!

…..

Quer dar o próximo grande passo na sua jornada profissional? Participe do Cloud Training, um curso online e gratuito que vai te preparar para o exame da certificação IBM Cloud Foundations. Inscreva-se já!

Você sabia que o TecMundo está no Facebook, Instagram, Telegram, TikTok, Twitter e no Whatsapp? Siga-nos por lá.