Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/robsantossilva/fullcycle-fundamentos-arquitetura-software
Fundamentos de Arquitetura de Software - Desenvolvimento de Aplicações Modernas e Escaláveis com Microsserviços
https://github.com/robsantossilva/fullcycle-fundamentos-arquitetura-software
Last synced: about 2 months ago
JSON representation
Fundamentos de Arquitetura de Software - Desenvolvimento de Aplicações Modernas e Escaláveis com Microsserviços
- Host: GitHub
- URL: https://github.com/robsantossilva/fullcycle-fundamentos-arquitetura-software
- Owner: robsantossilva
- Created: 2021-08-16T22:46:51.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2022-04-13T15:36:50.000Z (over 2 years ago)
- Last Synced: 2023-03-04T10:19:09.645Z (almost 2 years ago)
- Size: 443 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README_v2.md
Awesome Lists containing this project
README
# Fundamentos de Arquiteura de Software
### O que é Arquitetura?
"Organização de um sistema, contemplando seus componentes, os relacionamentos entre estes, com o ambiente e os que governam seu projeto e evolução."### Pilares
- Organização de um sistema
- Componentização
- Relacionamento entre sistemas
- Governança: Infraestrutura, Time e Arquitetura
- Ambiente
- Projeto: Tem inicio, meio e fim
- Projeção: Possibilidades futuras
- Cultura: Conflito entre a personalidade dos envolvidos### Frameworks
São ferramentas e métodos que nos ajudam a focar essencialmente no objetivo final. Frameworks nos ajudam a definir um padrão de trabalho- The TOGAF Standard
- Framework conceitual
- Definição dos processos de arquitetura
- +900 Páginas
- Conceitos e nomenclaturas
- Visão geral de tipos de arquiteturas:
- Negócio
- Sistemas de informação
- Tecnologia
- Planos de migração
- ISO 42010:2011
- Lançado em 2011 pelo ISO
- Mais simplificado em relação as 900 páginas do TOGAF
- Formaliza os fundamentos da área de arquitetura de software.### Momentos da Arquitetura de Software na História
- Tradicional
- Atual
- Emergente
- Futuro-------------------------
- Metodologias
- Tipos de aplicação
- Infraestrutura##### Momento: Tradicional
Metodologia de desenvolvimento: WaterfallCiclo de vida do desenvolvimento de software:
1. Requirements Analysis
1. Design
1. Development
1. Testing
1. MaintenanceTipos de aplicações: Monolíticas
Infraestrutura: on-premise
##### Momento: Atual
- Metodologia de desenvolvimento: Agile
- Tipo de aplicações: Multi-tier architecture (Softwares Distribuidos)
- Infraestrutura: Virtualização##### Momento: Emergente
- Metodologia de desenvolvimento: DevOps/FullCycle (Cultura)
- Tipos de aplicações: Microserviços
- Infraestrutura: Containers##### Momento: Futuro
- NoOps
- Tipo de aplicações: Serverless Applications
- Infraestrutura Public Cloud### Sistemas Monolíticos
- Tudo em um unico lugar; Tudo em um só sistema.
- Alto acoplamento
- Processo de deploy "completo" a cada mudança
- Normalmente usa uma tecnologia
- Um problrma afeta todo o sistema
- Maior complexidade para times
- Não é crime usar sistema monolítico
- Na maioria dos casos vai atender
- Menos complexidade na maioria dos casos
- Sistema monolítico é Vida!### Escalando software
- Escala Vertical: Aumento de Recursos Computacionais
- Escala Horizontal: Adição pequenas maquinas acessadas através de um LoadBalancer### Detalhes sobre a arquitetura da aplicação
- Disco efêmero
- Servidor de aplicação vs Servidor de assets
- Cache centralizado
- Sessões centralizadas
- Upload / Gravação de ArquivosTudo pode ter que ser destruído e criado facilmente.
### Distribuição de responsabilidades
Pensando de forma distribuida com o objetivo de manter uma aplicação com as responsabilidades bem definidas:
- **Aplicação** com responsabilidades bem definidas
- **Proxy** Reverso para gerenciar toda a parte de webserver
- **DB:** Banco de dados separado da aplicação (RDS da AWS)
- **Elastic** com a responsabilidade de gerenciar consuçtas/pesquisas
- **Static:** Gerenciamento de assets, arquivos estaticos, imagens...
- **Cache:** Gerenciamento de cache independente da AplicaçãoPensar de forma distribuida facilita a **escala Horizontal**, tendo a possibilidade de se ter a aplicação duplicada em diferentes regioes, consumindo a mesma fonte de dados (DB, Elastc, Assets, Cache...)
App Região 1, App Região 2, App Região 3, App Região N...**...mas, ainda assim trata-se de uma aplicação monolítica.**
### Escala horizontal: Aplicação monolítica
- Ter imagens/Containers
- Ser facilmente reconstruído
- Ter suas responsabilidades, incluindo assets, etc..
- Sim, aplicações monolíticas podem ser totalmente escaláveis### Quando aplicações monolíticas podem parar de valer a pena?
- Times grandes
- Necessidade de escalar todo o sistema pelo fato de uma área em especifico estar com pico de utilização.
- Risco de um deploy completo começa a se elevar
- Necessidade de utilizar tecnologias diferentes### O que é um serviço
- Disponibiliza informação
- Realiza transações
- Resolve problemas de negócio
- Independente de tecnologia ou produto
- Pode estabelecer comunicação com diversos "clientes"### SOA: Arquitetura Orientada a Serviço
- Serviços normalmente maiores baseadas em funcionalidades
- Necessidade de ESB
- Single point of failure
- Compartilhamento de banco de dados é comum
- Muitas vezes também podem ter sistemas monolíticos sendo utilizados como serviços### Arquiteura baseada em microserviços
- Serviços pequenos com poucas responsabilidades
- Maior tolerância a falhas
- Totalmente independente
- Cada serviço possui seu próprio banco de dados
- Comunicação síncrona ou assíncrona### Microserviços não são para todas as situações
- Arquitetura complexa
- Custo mais elevado
- Necessidade de mais equipes para manter
- Sistema precisa ser grande o suficiente para justificar
- Gera problemas que normalmente você não tinha antes
- Monitoramente complexo**Microserviços não são moda, mas sim necessidade.**
### Microservices: Principais características (Martin Fowler)
- Componentização via serviços
- Organização em torno do negócio
- Estrutura baseada em Produtos. Não em projetos
- Smart endpoints & Dumb pipes
- Governança descentralizada
- Descentralização no gerenciamento de dados
- Automação de Infraestrutura
- Desenhado para falhar
- Design evolutivo#### Componentização via serviços
- Services dos microserviços != Services da OO
- "Componente é uma unidade de software independente que pode ser substituida ou atualizada"**Desvantagens**
- Chamadas externas são mais custosas do que chamadas locais
- Cruzamento entre componentes pode se tornar complexo
- Transações entre serviços são "grandes desafios"
- Mudanças bruscas em regras de negócio podem afetar diversos serviços tornando o processo difícil de ser refeito#### Organização em torno do negócio
**Conceito importante**
Um projeto é baseado em um ou mais produtos que trabalham em diferentes contextos.
- Time de desenvolvedores por produto
- Muitas empresas tratam os times como "squads"
- Cada squad é multidisciplinar
- Cada squad é responsavel por um ou mais produtos
- Cada produto pode ter um ou mais serviços envolvidos### Microservices: Smart endpoints & dumb pipes
- Exposição de APIs (ex: Rest)
- Comunicação entre serviços
- Comunicação síncrona e assíncrona
- Utilização de sistemas de mensageria (ex: RabbitMQ)
- Garantia de que um serviço foi executado baseado na execução das filas### Microservices: Governança descentralizada
- Ferramenta certa para o trabalho certo. Tecnologias podem ser definidas baseadas na necessidade do produto
- Diferentes padrões entre squads
- Contratos de interface de forma independente### Microservices: Automação de infraestrutura
- Cloud computing
- Testes automatizados
- Continuous delivery
- Continuous Integration
- Load balancer/Autoscaling### Microservices: Desenhado para falhar
- Tolerância a falha
- Serviços que se comunicam precisam de fallback
- Logging
- Monitoramento em tempo real
- Alarmes
### Microservices: Design evolutivo
- Produtos bem definidos podem evoluir ou serem extintos por razões de negócio
- Gerenciamento de versões
- Replacement and upgradeability### API Gateways
"Uma API gateway recebe todas as chamadas de APIs dos clientes e então as roteia para os microserviços correspondentes..."
(nginx.com)Em alguns casos ela também é responsável por realizar processos de verificação de segurança, como autenticação e autorização.
![](./.github/api-gateway-1.png)
![](./.github/api-gateway-2.png)**API Gateway na AWS**
![](./.github/api-gateway-3.png)### Service Discovery
Processo de service Discovery é responsável por prover mecanismos de identificação dos serviços disponíveis e suas instâncias![](./.github/service-discovery-1.png)
**Service Discovery - Client Side**
![](./.github/service-discovery-client-side.png)**Service Discovery - Server Side**
![](./.github/service-discovery-server-side.png)#### Ferramentas populares:
- Netflix Eureka
- Consul
- Etcd
- ZooKeeper### Comunicação entre microserviços
Comunicação Assíncrona: Mensageria### Mecanismos de filas - RabbitMQ
- Message Broker
- Implementa AMQP (Advanced Message Queuing Protocol)
- Producer <==> Brokers <==> Consumers
- Desacoplamento entre serviços
- Rápido e Poderoso
- Padrão de mercado### Dupla latência
![](./.github/dupla-latencia.png)### BFF - Backend for Frontend
Uma camada baseada no dispositivo/client que esta acessando a aplicação