Hardware
Processador
Sistema Operacional
Rede
Nuvem
Arquitetura de Software
Arquitetura de software é uma estrutura intencional para gerenciar complexidade e mudança em software.
Não importa o tamanho do projeto, uma arquitetura de software tem como objetivo responder as seguintes perguntas:
Arquitetura do software garante:
Entendimento
Evolução
Operação
Uma arquitetura pode ser dividida entre dois aspectos conceituais:
Como o sistema é estruturado?
A arquitetura lógica é a parte mais concreta da arquitetura.
Ela define como vamos organizar o sistema em classes, pacotes, módulos, etc.
Arquiteturas como Domain-Driven Design, Screaming Architecture e Event Sourcing, Hexagonal Architecture, Onion Architecture, Clean Architecture, Model-View-Controller são exemplos de decisões que definem a estrutura do sistema.
Domain-Driven Design
Screaming Architecture
Event Sourcing
Hexagonal Architecture
Onion Architecture
Clean Architecture
Model-View-Controller
Modelar o software de acordo com o domínio do problema real, usando linguagem comum entre técnicos e especialistas do negócio.
Pastas e módulos refletem a intenção comercial (por exemplo, /faturamento/ ao invés de /serviços)
/faturamento/
/serviços
A arquitetura de eventos é uma abordagem que permite que o estado do sistema seja reconstruído a partir de uma sequência de eventos.
Desacoplar o núcleo da aplicação dos elementos externos (UI, BD, APIs) usando portas (interfaces) e adaptadores (implementações).
Modelar o sistema em anéis concêntricos (como uma cebola) com o modelo de domínio no centro, enfatizando a separação de responsabilidades.
Organiza o software em camadas concêntricas com clara separação entre regras de negócio e detalhes técnicos. As camadas internas representam a lógica central e são independentes de frameworks externos.
Separar a lógica de apresentação da lógica de negócios e da manipulação de entrada do usuário.
A parte física da arquitetura define como o sistema será executado em ambiente de execução.
Arquiteturas como Microservices, Monolitos, Serverless são exemplos de decisões que definem a forma de implantação do sistema.
Microservices
Monolitos
Serverless
Monolito é uma arquitetura de software que consiste em um único serviço que contém toda a lógica de negócio.
Microservices é uma arquitetura de software que consiste em um conjunto de serviços independentes, cada um com sua própria lógica de negócio e tecnologia.
O monolito modular é uma arquitetura que procura reduzir a complexidade dos microserviços, porém garantindo escalabilidade e flexibilidade.
Em uma arquitetura Serverless, a infrastrutura é gerenciada pelo provedor de serviços e o desenvolvedor se concentra apenas na lógica de negócio.
Monolith First é uma abordagem descrita por Martin Fowler que consiste em iniciar o desenvolvimento de um sistema monolítico e, à medida que o sistema cresce, identificar pontos de acoplamento e refatorar para uma arquitetura mais flexível, como microserviços.
Softwares variam muito em escopo, complexidade, tempo de vida, restrições técnicas e equipe envolvida.
Cada padrão de arquitetura surgiu como resposta a problemas específicos nesses contextos.
A engenharia de software é uma disciplina jovem. À medida que aprendemos com erros do passado (excesso de acoplamento, baixa testabilidade, dificuldade de manutenção), surgem novas propostas para tratar melhor esses problemas.
Cada arquitetura costuma enfatizar uma ou mais dimensões:
Sim - e frequentemente fazemos isso, mas de forma seletiva e contextualizada. Nenhuma arquitetura é uma bala de prata.
Exemplo:
Domínios e subdomínios são conceitos espaços de problemas específicos que se concentram em áreas específicas dentro de uma organização. Eles são definidos pela empresa ou organização e se baseiam em suas necessidades e requisitos específicos.