Muitas empresas tem adotado uma arquitetura de microserviços em seus projetos, devido a capacidade de fazermos o deploy de cada serviço de forma independente, escalar e manter cada microserviço, além de paralelizar o desenvolvimento entre múltiplos times. Nesse contexto, pretende-se mostrar desafios que temos encontrado na área de qualidade e quais técnicas de desenvolvimento e testes podem ser utilizados.
Obs.: Evolução da apresentação feita originalmente no TDC 2018 (Trilha Testes)
PROJETO DE EXTENSÃO I - AGRONOMIA.pdf AGRONOMIAAGRONOMIA
Desafios de qualidade em microserviços
1. Microserviços - Desafios para
lidar com a qualidade
André Abe Vicente
Especialista de Qualidade –
Encontro Regional de Engenharia de Software – ERES 2018
2. /Who is André?
• Eng. de Requisitos [Unioeste – Cascavel]
• Testes e Agile [Msc. ICMC – USP]
• QA @ PagSeguro UOL [2012 – Atual]
3. Sumário
1. Microserviços - Novos desafios
2. Testes em Microserviços
3. Delivery Contínuo e Testes em Produção
4. Monitorações, Logs e Troubleshoot
6. Migração e Novos Serviços
Benefícios Microserviços
• Heterogeneidade de Tecnologias
• Resiliência e Escalabilidade
• Facilidade de Deploy
• Alinhamento Organizacional (Times)
• Componibilidade / Reuso
• Facilidade para Substituir / Migrar
7. Nossa Jornada até agora...
2007 2012 2014-17 2018
http://bit.ly/ps-mesos
http://bit.ly/ps-constelacao
• Agile
• Melhoria Ambiente
• UX, Mobile, Cloud ...
Perfomance do time, confiança na
entrega, manutenção e evolução
8. Migração e Novos Serviços
• Convivência com o Monolito
• Evolução do Ambiente e Monitoramento
• Novas Tecnologias
• Banco de Dados
- Integrações com o Monolito (Legado)
- Kafka (tráfego e armazenamento de mensagens
de domínio)
• Excelência QA (Negócios + Técnico)
Desafios
https://www.instagram.com/augmentedrealityimages
10. Pirâmide de Teste?
• Testes de Contrato
• End-to-End
• Exploratórios
• Testes em Produção
Sam Newman - https://www.oreilly.com/learning/building-microservices-
testing
12. Infra
- Serviços, Filas,
Banco, Massa de
Dados...
- Infra as code
(Docker, Puppet,
Jenkins ...)
Testes End-to-End
End-to-End (Containers) Mock Services
Recursos Confiável Estabilidade
A B
Jornadas
Pequeno número de
testes (core),
restante coberto por
serviços testados de
forma isolada
Recursos Confiável Estabilidade
*
* http://bit.ly/microservice-testing-mf
13. Mocks / Stubs
• Desenvolvimento e Testes UI
• Wiremock - http://wiremock.org
• Versionamento dos stubs (GIT)
• Expressão regular
• Simular respostas incorretas
• Exemplos: DELAY, CONNECTION_RESET_BY_PEER
• Record/Play e Proxy para Serviço Real
• Outras: ...
14. Testes de Contrato
• Praticamente impossível saber todas as formas que o
consumidores irão utilizar os nossos serviços.
• "Quando fazemos o deploy de um novo serviço em produção,
nossas mudanças não podem quebrar os consumidores”
2006 - Consumer Driven Contract
https://martinfowler.com/articles/consumerDrivenContracts.html
2015 - Technology Radar ThoughtWorks
Deploys independentes (microserviços)
25. Pipeline de Entregas (e os testes exploratórios?)
• Feedback automático (do commit à produção)
• Pipeline as code e criação sob demanda de infra-estrutura
• Pre-Commit: Pull Request (código e migrations), Testes Manuais /
Automatizados, Segurança, Review (UI e PO)
26. Testes em Produção (Chaveamentos)
• Feature Toggles: Liga/Desliga
• Testes A/B: Experimentos UI e Backend
• Controle de Usuários: Beta Testing (%) e Dog Fooding (Internos)
• Delivery Contínuo
• Não estocar código / small batchs
• Código incompleto ou não testado em produção (Release Toggle)
• Encontrar erros em produção com menos risco
27. Feature Toggle - Motivações e Usos
• Liga/Desliga de uma funcionalidade
• Tipos: Release Toggles , Experiment Toggles, OPs Toogles,
Permission Toogles
• Testes com Toggles
• Ligados / Desligados
• Regra dinâmica: testar usuários dentro e fora desse grupo
• Experimental: consistência entre sessões do usuário (comportamento
igual)
• Operações ou Permissões: explorar combinações para ver como a
nova configuração interage com as opções já existentes.
28. Testes A/B
• Criar duas ou mais variações do seu software, para apresentar
para cada usuário uma das variações em um experimento
controlado
https://www.kameleoon.com/en/ab-testing
29. Testes A/B
• Cuidados: Subjetividade e decisões somente baseadas em dados
(data/metric oriented)
31. Controle de Usuários (Beta Testing)
• Nova versão para um conjunto restrito de usuários
• Foco geral: aspectos funcionais da aplicação
• Time: usabilidade, acessibilidade, performance, segurança
• Oportunidade: testes de alarmes, monitorações, logs, métricas...
• Staged rollout
32. Dogfooding
• Dogfooding: beta testing para quem desenvolve
• Nem sempre são representativos em relação aos usuários
• Percepções de qualidade diferentes e prioridades problemas
Testes de Usabilidade + PesquisaDoogfooding Avaliações APPs
34. Pirâmide de Testes - DevOps Bugfilter
• Bugs podem aparecer sem ter passado
previamente pelos filtros
• Testes unitários (código-fonte)
• Testes de integração (banco, serviços
externos)
• Testes End-To-End (irão cobrir a arquitetura
como um todo)
• Produção: Alertas, Monitorações, Logs
(Katrina Clokie, 2017) - A Practical Guide to Testing in DevOps
36. Ambiente Produção - Monitoração
Como escalar?
• Muitos Desenvolvedores
• Poucos Operações
• Muitos Serviços (+ 300)
37. Monitor
Descrição
Severidade
Documentação
Ambiente Produção - Monitoração
• Lib de Monitoração: Monitorações de Negócio e Dependências
Execução Métodos
• Tempo de Resposta
• Taxa de Sucesso
• Idle Period
Monitor de Negócio (Personalizado)
Exemplos:
• Recebimento de Arquivos
• Pagamentos sem sincronizar por x
minutos
@Annotations
OK
CRITICAL
38. Ambiente Produção - Monitoração
• Lib de Monitoração: Monitorações de Negócio e Dependências
IntegraçõesFilas (Limite Msgs e Cluster)
Documentação
• Diagnóstico
• Solução
39. Ambiente Produção - Logs
• Informação em baixo nível para análise de problemas
• Microserviços (Logs Distribuídos)
• Cloud Sleuth +
• Referências
• https://dzone.com/articles/centralized-logging
• https://dzone.com/articles/monitoring-microservices-with-spring-cloud-sleuth
41. Referências - Microserviços
• (Katrina Clokie, 2017) - A Practical Guide to Testing in DevOps
• (Sam Newman, 2015) - Building Microservices
• (Toby Clemson, 2014) - Testing Strategies in Microservice Architecture -
https://martinfowler.com/articles/microservice-testing/
42. Referências – Testes de Contrato
• Technology Radar – Deploys independentes (microserviços)
https://www.thoughtworks.com/radar/techniques/consumer-driven-contract-
testing
• Pact: Verifying Microservice Integrations with Contract Testing - Atlassian Summit
2016
• Spring Cloud Contract: Consumer Driven Contracts and Your Microservice
Architecture - Marcin Grzejszczak, Adib Saikali
Notas del editor
Agradecer Organização: Profs. da Comissão Organizadora e Comitê Local
Evolução da Apresentação do TDC 2018
Mestrado em Agile, Métricas e Testes
QA PagSeguro: equipe de infra (testes automatizados e negócios)Atualmente Emissão de Cartões
Fintech (inclusão de desbancarizados, spread bancário ...)
Tecnologia (Internet das Coisas, Assistentes de Voz, Apple)
1: Novos desafios e Benefícios de trabalhar em projetos com Microserviços
2: Algumas técnicas e ferramentas que ajudam nos testes de microserviços
3 e 4: Itens relacionados DevOPs que são consequência da alta quantidade de Microserviços, mas que temos que nos preocupar na qualidade do que está funcionando e o que acabou de ser entregue
Microserviços - Novos desafios (14 min)
Testes em Microserviços (13 min)
Delivery Contínuo e Testes em Produção (13 min)
Monitorações, Logs e Troubleshoot (10 min)
Microserviços são pequenos serviços autônomos que trabalham juntos.
Origem: DDD, Continuous Delivery, Automação de Infra, Escalabilidade e pequenos times autônomos
Focados em fazer uma coisa bem (DDD)
Não é sobre tamanho, mas fatalmente você vai pensar em um monstro bem gordo, difícil de entregar
Cada um com seu domínio específico com uma interface de comunicação entre eles
Alinhamento de vários times trabalhando separadamente e não precisam compartilhar uma mesma base de código
Deploy Contínuo, Escalabilidade
Reuso (aproveitar um componente de autenticação, cadastro ou de movimentações financeiras)
Consulta e Operações de Cartão que podem ser feitos pelo App ou URA
2007: PagSeguro adquire BR-Pay (foco em Pagamentos Web)
2012: NFC e primeiras experiências com deploy separado e um componente separado
2014 – 2017: Começamos a ver grandes dificuldades de manutenção e performance dos times
2018: Mobile First, Foco no usuário, melhoria contínua com o Ágil.
Precisamos consultar muita informação do Monolito
Monitoração e Gerenciamento de vários microserviços desafiador. Impacto se o sistema legado (monolito cair), ou se um serviço dependente cair continuamosfuncionando?
Novas tecnologias (podem ser problema)
Trazer dados do Monolito para relatórios de negócio ou simplesmente para utilizarem algum microserviço
Negócios: Entender o Domínio – existe/novo (fatiamento dos microserviços)
QA Técnico – Importante (filas,logs,disponibilidade...)
Vamos falar sobre Técnicas/Ferramentas que
ajudam a dar apoio quando falamos de microserviços (13 min)
Pirâmede de Testes (Sam Newman)
Q1: Testes de Contrato (Acordo entre Cliente e Fornecedores de uma API interna)
Q3: Testes End-to-End / Exploratórios e focamos em equipes DevOPS Beta, A/B, Feature Toggle...
Duas abordagens para testar além das fronteiras: End-to-End ou Mock
Sofrer com estabilidades (que logicamente podem ser tratadas,por exemplo com Mocks)
Apesar de facilidade para fazer o deploy de vários microserviços isso gera um alto custo
Confiável porque está utilizando o serviço real
End-to-End + Mocks pode não ser confiávelO que acontece se um fornecedor de uma API muda a assinatura e o mock de quem utilizanão é atualizado?
Infra-estrutura é mais fácil, mas depender de infra pode gerar muita instabilidade
Poucos testes e Testes com Mocks
Mock com Wiremock, Apiary, Mock API
Confiabilidade: remoção/alteração de um campo de resposta de uma APIAtualizar Mock
Apiary: para documentação e facilitar desenvolvimento Mobile (antes do BE)
Wiremock: utilizar stubs bem escritos para os testes
Pode simular problemas e pode gravar respostas
Produtor não quebrar os consumidores
Como saber como e quais são todos os clientes que utilizam o serviço
Antigo (desde 2006 pelo MartinFownler) e em 2015 foco em microserviços
Contrato: Mudança de Name para User (name + lastname)
Swagger: Documentação e Execução de End-Points
Consumidor faz os contratos em groovy e gera testes integrados para o provider
Gerado o Stub baseados nos contratos
Client executa testes contra o servidor de stubs
PACT: Suporte a diversas linguagens, UI para gerenciar os contratos e grafo de dependência
Consumidor faz os contratos em groovy e gera testes integrados para o provider
Gerado o Stub baseados nos contratos
Client executa testes contra o servidor de stubs
PACT: Suporte a diversas linguagens, UI para gerenciar os contratos e grafo de dependência
Consumidor faz os contratos em groovy e gera testes integrados para o provider
Gerado o Stub baseados nos contratos
Client executa testes contra o servidor de stubs
PACT: Suporte a diversas linguagens, UI para gerenciar os contratos e grafo de dependência
Consumidor faz os contratos em groovy e gera testes integrados para o provider
Gerado o Stub baseados nos contratos
Client executa testes contra o servidor de stubs
PACT: Suporte a diversas linguagens, UI para gerenciar os contratos e grafo de dependência
Consumidor faz os contratos em groovy e gera testes integrados para o provider
Gerado o Stub baseados nos contratos
Client executa testes contra o servidor de stubs
PACT: Suporte a diversas linguagens, UI para gerenciar os contratos e grafo de dependência
Agora iremos falar sobre delivery contínuo, pipelines e testes exploratóriosTambém temos testes em produção que podem abordar
Feature Toggle, Beta-Testing e Testes A/B16 min
Pipeline é um ponto importante para entrega contínua
E os Testes como ficam?
Temos que fazer testes exploratóriosmas como?
Processos pré-commit: PR, Sec, Review e Testes
Evoluções: Validar em máquinas isoladas e usar o mesmo artefato
Esconder funcionalidades incompletas ou com risco de todos ou de parte dos usuários, experimentar e controlar o sistema
Release toggles: permite que códigos incompletos e com caminhos não testados sejam entregues em produção
Experiment toggles: utilizados para fazer testes A/B ou multivariados.
Ops toggles: utilizados para controlar aspectos operacionais de comportamento do sistemaEx.: desabilitição intencional de features não críticas durante perído de uso pesado (black Friday)
Permissioning toggles: utilizado para modificar funcionalidades ou experência que certos usuários recebem.Ex.: ativar funcionalidades premium para programa de pontos (fidelidade)
Ajuda no delivery contínuo, mas não podemos estocar código e
Não devemos fazer delivery de código não testado
- Dividir o tráfego ou separar em grupos
Testes A/B não deve se tornar a única forma de se tomar uma decisão.
Não remover autonomia da equipe de desenvolvimento
Comportamento pode fornecer insight para melhoria, mas as pessoas podem reagir mal a inovações que desafiem ele.
Henry Ford (Se perguntasse o que as pessoas queriam, eles diriam cavalos mais rápidos)
Steve Jobs (Pessoas não sabem o que querem até você mostrar isso a elas)
Testes A/B no PagSeguro: Ordem dos meios de pagamento, deixar pagamentos oculto
Home: O que converte mais moderninhas?
Hypothesis driven development
Diferente dos Testes A/B eles são para detectar bugs!
Limitações nos testes de desenvolvimento (devices, ou conhecimento mais profundo da funcionalidade)
Time testar com ambiente de produção, várias oportunidades de teste
No PagSeguro para alguns produtos conseguimos fazer dogfooding
Não representa os usuários que utilizam efetivamente o produto
Percepção de qualidade diferente do usuário final
Ele pode ser complementado pelas avaliações dos APPs
Sugestões, Problemas e Elogios
E um trabalho feito entre o pessoal de UX+UI com POs
Por fim vamos falar de um aspecto muito importante em Microserviços
A monitoração, com uma grande quantidade de microserviços a gente precisa fazer com que as equipes assumam essa responsabilidade e ajudem a equipe de operações a monitorar os nossos sistemas em produção
13 min
- Bugs de diferentes tamanhos e que podem ser detectados em produção
Um dos desafios que enfrentamos depois de sofremos algumas vezes com problemas em produção
Monitoração: como conseguir escalar isso para que todo microserviço tenha monitoraçõesde infra-estrutura e negócio que facilitem a atuação da equipe de operações
A biblioteca java gera um arquivo JSON com o status das monitorações da aplicação
Script lê esse arquivo e toma as ações necessárias caso haja algum problema
Idle Period (Periodo sem executar)
Podemos também monitorar filas rabbit ou integações com outros sistemas
É importante documentarmos para em caso de alarme operações saiba o que fazer
Notificações via Slack e abertura de chamados
Para análise de problemas em produção é muito importate termos logs
Quando tratamos de microserviços para uma jornada do usuário é importante a gente conseguir ter uma rastreabilidade
Sleuth para gerar os logs e Zipkin para consolidar esses logs
- Vagas no PagSeguro (QA, Dev FE e BE, Banco, Infra...)