Microservices
101
alexrios.github.io
alex.rios@pm.me
@alextrending
tradução livre
Não é nada mais que um SOA feito de maneira dogmática
Que tipo de dogma?
Dogma é uma crença ou doutrina estabelecida de uma religião, ideologia ou qualquer tipo de organização, considerada um ponto fundamental e indiscutível de uma crença
https://12factor.net
Time DevOps quando pega uma App no padrão
12 factor
Os 8 pilares em uma arquitetura de microserviços
Modeled around business domain
Culture of automation
Hide implementation
details
Decentralize all
the things
Deploy independently
Consumer first
Isolate failure
Highly
observable
Modeled around
business domain
N tier ou Onion arch
Modelo anemico == BOLOVO
Time especialista naquele negocio
O grande desafio é achar os bounded contexts do sistema atual para alcançar a independência das Squads
Job rotation é legal, mas tem que ser desejo do DEV
Bounded context?
É o foco da seção de design estratégico do DDD, que trata de grandes modelos e equipes
O DDD lida com grandes modelos dividindo-os em diferentes contextos limitados e sendo explícito sobre suas inter-relações
Culture
of
automation
Infra automatizada
Testes (unitário, integração, aceitação, performance, carga) automatizados
CI/CD
Automatize tudo que for possível e, em médio prazo, se preocupe apenas com resolver os problemas do negocio
Hide implementation details
1 servico por db = OK
2 servicos por db = meh... ok
Uma alteração de schema provoca uma coordenação maior entre os serviços, mas ainda assim é uma operação segura
Uma vez que você deixa um novo serviço acessar a mesma base, isso provoca uma exposição desnecessária de seus detalhes internos de implementação.
Precisa da informacao? API CALL!
O controle do que deve ser visto ou não, é do provedor da informação.
Costumer e Products são conceitos diferentes em sistemas diferentes
Expor informação é caro, pois uma vez exposto não tem uma volta simples.
Dar às pessoas quanta liberdade for possível para que o trabalho delas seja feito
Quer uma maquina na GCP para subir seu projeto? um novo tópico, dataset e etc?
Não demande a ninguém, faca você mesmo.
https://martinfowler.com/articles/microservices.html#SmartEndpointsAndDumbPipes
(2018)
Services per host?
Host = isolated system (container, virtual machine)
Application servers = custo de provisionamento
Mais services por host = um "atrapalha" o outro compartilhando performance
Como monitorar um recurso compartilhado? quem eh o ofensor naquele host?
Quando eu faço uma mudança, quem eu afeto?
Sempre deployar tudo junto funciona para ganhar segurança, mas isso causa dependência e diminui a velocidade das releases
Como eu garanto que o serviço que depende de mim (que eu não sei como foi implementado) vai continuar funcionando apos a minha mudança?
Consumer driven contracts
(pact.io)
Durante a integração continua meu projeto vai rodar baseado no contrato que meus clientes esperam do meu serviço
Uma falha garante que não vamos colocar nada errado em produção e nos vai apontar com que consumidor temos que procurar para alinhar as mudanças
Deploy independentes!
Precisamos quebrar eventualmente os consumidores, pois simplesmente não podemos forca-los a se atualizar
Manter a versão antiga coexistindo e ter um deadline para remover a API
Deploy independentes!
Manter 2 APIs vai ser necessário em algumas vezes, então prepare-se para manter 2 base de códigos para o mesmo serviço
Monitore as versões legadas e se um dia a essa versão não for mais chamada, simplesmente remova a branch
Documentação de qualidade
Muitas APIs hoje em dia suportam exportar para Swagger
SwaggerUI pode testar e brincar com sua API diretamente da documentação
Service discovery
Consul - etcd - zookeeper
Humane Registries
(README - Wiki page)
Explodir o seu monolito em vários serviços não vai fazer você ter um conjunto de serviços mais eficiente/resiliente. na verdade vai ser ao contrario
Distributed single point of failure
A failure is the inability of a software system or component to perform its required functions within specified performance requirements.
Strangler App
https://paulhammant.com/2013/07/14/legacy-application-strangulation-case-studies/
Bulkhead (downstream connections)
Bulkhead (downstream connections)
Gerenciar e monitorar servidores, apps, logs, heatmaps UX/UI e etc
Agregar logs: stack driver, kibana, paper trail
Agregar status: new relic, app dynamics, data dog, prometheus
Serviços interconectados?
Correlation id!
Conway's law
Conway's law
As fronteiras da sua API devem ser estaveis
O time precisa de um especialista do negocio com eles para terem independência e ownership
Automatize tudo que for possível para não ter peças soltas ou com longos processos manuais
Esconder os detalhes da implementação vai te dar independência de mudar seus processos e tecnologias sem quebrar nenhum outro serviço
Serviços existem para serem chamados, pense com a visão do chamador/cliente sempre
Entenda seus pontos de falha, se planeje para aplicar técnicas mitiga-los
Crie monitoramentos e alertas para ter um sistemas altamente observável