Primeiras aulas do curso Microservices com Spring Cloud: Circuit Breaker, Hystrix e API Gateway

Microservices com Spring Cloud: Circuit Breaker, Hystrix e API Gateway

Fallback e Circuit Breaker - Introdução

Diferente do treinamento anterior em que nos preocupamos com a Integração dos Microsserviços e nas configurações deles, mas em termos de requisição, e de configuração e de disponibilização deles, aqui nós vamos nos preocupar com a integração de microsserviços, mas com relação à performance.

Como é que eles vão se recuperar de problemas, como é que nós vamos evitar problemas, e para manter a nossa aplicação sempre funcionando com uma performance mínima, digamos assim.

Além disso nós vamos falar sobre recuperação de uma transação defeituosa, já que a gente não tem uma transação ACID. Como é que nós desfazemos uma requisição que começou do usuário e deu um problema no meio? Qual é a ideia? Como podemos fazer pra resolver isso?

Depois disso, vamos ver como expor a nossa aplicação na internet sem a necessidade de colocar todos os microsserviços e aquelas instâncias na internet, o Eureka para o cliente descobrir quais as instâncias têm disponíveis. Isso seria ruim.

Então nós vamos expor a nossa aplicação como se ela fosse uma única aplicação com um único ponto central em que as requisições do usuário vão bater.

Depois vamos implementar a autenticação e autorização em todos os nossos microsserviços, usando uma tecnologia ALF-2, que gera um token de autenticação em que os microsserviços conseguem as informações do usuário logado. Vamos lá! Até a próxima.

Fallback e Circuit Breaker - Ambiente e versões

Pessoal, primeiramente vamos montar o ambiente com base na última aula que tivemos no curso anterior.

A primeira coisa que precisamos é do Spring Tool suíte que é uma versão do Eclipse, boa para nós trabalharmos com o Spring. Dentro do site Spring.io/tools temos uma versão disponível do Spring Tool suíte, você vai selecionar de acordo com seu sistema operacional.

Além da IDE que é o Eclipse nós vamos trabalhar com o banco de dados MariaDB.

Eu vou entrar dentro do site mariadb.org/download/, selecionar “downloads.mariadb.org”, que tem o link aqui embaixo e ver outras versões, outras releases do MariaDB, porque nesse treinamento, pra não dar nenhum problema, nós estamos utilizando a versão 10.3.15.

Então quando você clicar nesse link você vai selecionar também específico para o seu sistema operacional.

Vou abrir o Spring Tool Suite. Eu já baixei na área de trabalho. Isso está disponível para download no material desse treinamento. Os projetos que nós utilizamos no curso anterior na última versão.

Eu vou abrir o Spring Tool Suite apontando para essa pasta download e nós vamos importar aqueles projetos para o ´Spring´.

Então click em “Import Projects”> “General”, pega essa última opção, clica em “directory” e é só selecionar a pasta que ele vai aparecer. Eu vou desselecionar esse primeiro, porque eu só preciso importar o “config”, “server”, “eureka”, “fornecedor” e “loja”.

Dá ofinish vai importando um por um, baixando e já vai aparecendo aqui no boot dashboards, que nós já vimos no curso anterior, que simplifica para nós subirmos cada Instância de microsserviços.

Já podemos subir os quatro projetos. Vou só fazer um overview com relação ao “config-server”. O “config-server” tem um arquivo de configuração “application.yml”, os outros também têm, mas especificamente dele tem o endereço do Github, em que ele vai pegar as configurações.

As configurações de banco de dados estão salvos no Github. Você provavelmente vai baixar com a minha versão. Ou seja com o meu endereço, Arthur-alura. Vou mostrar para vocês como é que está para quem não viu ainda.

Como é que é esse repositório. Dentro dessa conta “Arthur-alura” eu criei o “microservice-repo”, e dentro tem três repositórios: fornecedor, loja e transportador.

Então só para relembrar, o do fornecedor ou da loja, vou mostrar o do fornecedor, que foi o que nós fizemos. Tem o “fornecedor.yml” que tem a configuração de banco de dados.

Então tem password, usuário de banco, tem localhost na porta 3307/fornecedor, que é o nome do banco de dados, e você deve estar se perguntando, não é MariaDB? Por que tem MySQL aqui? Porque o MariaDB é uma ramificação do MySQL.

Eu selecionei para esse ensinamento porque ele é simples de instalar, ele vem com uma interface gráfica leve também para nós usarmos. Então acho que para você também vai ser mais fácil.

Além disso nós temos o “Eureka server”, que está configurado também. Nós não temos nenhuma observação a fazer, mas só para mostrar dentro do fornecedor, ele tem dois arquivos o application.yml, que aponta para o Eureka.

Então nós temos o endereço do “Eureka”, que é esse servidor e no bootstrap.yml temos o endereço para o “Spring config-server”, Na opção superior da lista à esquerda. Ele vai buscar no “Spring config-server” todas as configurações do fornecedor.

Esse projeto sobe na porta 8888. É assim que esse projeto consegue as suas configurações. Quando esse projeto está subindo, ele pede as configurações dele para “config-server” e o “config-server” vai no Github buscar essas configurações.

É importante que você faça, em vez de utilizar esse meu repositório, você faça o seu repositório e monte, crie os seus arquivos. Então veja como é que estão os endereços. O microservice-repo é o repositório, fornecedor é uma pasta, e o fornecedor.yml exatamente que é a configuração, esse arquivo que está sendo apresentado.

Então se você não tem, faça esse arquivo de configuração. É isso que nós temos. É isso que nós precisamos para subir nosso projeto.

Só para relembrar, ele está no modo update. Então você não tem que se preocupar. Você só precisa se preocupar em criar o banco de dados no MariaDB.

Só para mostrar também, eu estou com client do MariaDB, que se chama HeidiSQL. Quando você instalar, ele vai criar esse ícone pra você. Você clica duas vezes, você vai criar uma nova seção, colocar o usuário e senha porta default 3307, abre, na verdade a porta default é 3306.

Eu criei o fornecedor, tem loja, tem transportador e tudo mais, que esse banco de dados é uma versão mais nova, que eu já usei para fazer esse treinamento. Então essas tabelas vão ser criadas automaticamente quando a aplicação do fornecedor subir, porque ele vai subir. Vamos só olhar que a configuração do GitHub, ele vai subir no modo update.

Então ele já cria aquelas tabelas para você, você não tem que se preocupar com isso. Isso tem a ver com o jpa o hibernate.

Além disso nós utilizamos bastante o Postman, vamos continuar utilizando. Postman é uma interface gráfica para nós criarmos requisições e ele tem essas coleções de “request” que dá para nós organizarmos, apesar de que a daqui não estava organizada não.

Por exemplo, eu tenho uma versão de compra, para localhost:8080/compra, passando no body essas informações.

Então nós vamos continuar trabalhando com essa ferramenta para fazer requisições. Essa é nossa interface gráfica, digamos assim, para testar a nossa aplicação em microsserviço. Então até o próximo vídeo.

Fallback e Circuit Breaker - Circuit Breaker e Fallback

Agora nós vamos começar a falar sobre falhas e soluções que nós podemos aplicar na comunicação entre microsserviços.

Pense o seguinte: nós estamos fazendo uma requisição post pra loja, mas essa requisição não é toda resolvida pelo microsserviço da loja, porque ele passa essa requisição para um outro microsserviço que é o fornecedor. Por enquanto é assim que está acontecendo.

A requisição de compra, a primeira coisa que a loja vai fazer é uma requisição para o fornecedor para pegar as informações do fornecedor, mas ele também faz uma outra requisição. Então são duas requisições que estavam acontecendo.

Imagina esse cenário em que nós temos duas instâncias de fornecedores recebendo requisições que são repassadas pela loja. Então a loja, em um determinado momento, pode fazer requisições para este fornecedor e essas requisições estão girando em torno de 50 milissegundos para ser respondidas.

Só que a outra instância pode estar com algum defeito e demorar na média 2 segundos para responder. Isso gera um problema, porque nós estamos trabalhando com threads. Então a loja não tem “threads” infinitas disponíveis para responder às requisições dos usuários.

Então imaginando que ela tem 10 threads, e imaginando que ela vai duas vezes nesta instância de fornecedor, cada “thread” dessa, está demorando em média de 100 milissegundos para resolver essa requisição de compra.

Quando essas 10 threads, imagina um cenário em que essas 10 threads vão nessas duas instâncias, elas passam a demorar pouco mais de 4 segundos para responder às requisições de compra do usuário, porque ela vai duas vezes.

Nessa instância demora 100 milissegundos, porque vai duas vezes, mas pode cair nesse cenário, em que ela está acessando esse microsserviço com algum problema de performance, em que ela está demorando uma média de 2 segundos, cada requisição.

Então são 4 segundos que estão sendo demorados. Estas 10 threads que poderiam estar livres em 100 milissegundos a cada requisição que ela recebe, ela está demorando 4 segundos. E isso pode estar fazendo um enfileiramento de threads e deixar o microsserviço lento.

Então esse microsserviço da loja pode ficar muito lento por causa de um defeito em uma instância de um outro microsserviço que ele acessa.

Uma forma de a gente resolver isso é não só monitorar essas requisições que são feitas, mas também definir um tempo limite para a solução de uma requisição.

Nós podemos definir o seguinte: se nós esperamos que mais ou menos 100, 200 milissegundos, isso é o normal aceitável, mais do que isso, por exemplo 2 segundos já é um exagero. Então nós podemos definir que no máximo uma requisição de compra pode demorar 1 segundo.

Se essa requisição bate na loja, a loja faz uma requisição para a instância com defeito, e esse tempo de requisição demora mais de 1 segundo, você pode cortar essa requisição e responder o erro para o usuário, ou seja, mais de 1 segundo e você já pode considerar um erro, já pode devolver para o usuário um erro 500, porque você não vai mais aceitar isso.

Isso nós chamamos de errar rápido, e isso é uma técnica que nós chamamos de Circuit Breaker. Então a requisição vem e não pode passar de 1 segundo. Passou de 1 segundo ele retorna erro.

Junto dessa técnica você pode tentar dar uma resposta diferente para o usuário. Em vez de retornar 500 você pode tentar retornar alguma coisa. Por exemplo: nós recebemos a requisição de compra, vai até o fornecedor para pegar as informações do fornecedor e isso a gente vem fazendo.

Você pode, por exemplo, cachear essas informações. Você coloca num banco de dados local, de rápido acesso, um banco em memória ou algo do tipo. E caso você vá ao fornecedor e não consiga pegar as informações dele, você pode ir neste banco local.

Então você está executando aquela compra, passou de 1 segundo, porque você está com problema de ir ao fornecedor, você pode chamar um outro método para tentar executar um comportamento, pelo menos, executar parte do que foi pedido. Deixar em status pendente e devolver uma mensagem para o usuário.

Essa técnica nós chamamos de Fallback, em que você pode definir um método que vai ser chamado depois que esse limite de 1 segundo é executado.

Então imagina esse cenário: nós recebemos a requisição de compra, bate nesse microsserviço com defeito, ele passou de 1 segundo, ou seja, esse processamento todo de compra passou de 1 segundo, essa requisição é cortada, só que em vez de devolver um erro, você chama um método de Fallback, que vai tentar responder, vai tentar fazer alguma coisa melhor.

Para devolver algo mais interessante para o usuário, de repente tentar fazer uma parte da requisição, ou salvar essa requisição no banco, colocar com status pendente e informar para o usuário, por exemplo, que você vai resolver isso posteriormente.

Então quem vai nos ajudar a fazer essa implementação, que Isso envolve gestão de threads e tudo o mais, não é simples fazer tudo isso. É uma biblioteca do Netflix chamada Hystrix.

Hystrix vai nos permitir trabalhar com Circuit Breaker e Fallback. O mais legal é que o Hystrix tem uma memória, então as requisições que vão chegando na loja e dando problema, indo para Fallback, ele vai guardando isso.

Ele vai aprendendo com o que está acontecendo. Na verdade, ele não aprende, ele vai armazenando essa informação para poder tomar decisões posteriormente.

Por exemplo: caso a gente esteja o tempo inteiro recebendo requisições de compra que estão caindo nesse microsserviço defeituoso, ou seja, cai no microsserviço defeituoso, e vai para o Fallback. Se isso acontecer muitas vezes, o Hystrix vai fazer com que essa requisição nem vá para outro microsserviço. Ele já caia direto no Fallback.

Então a requisição fica até mais rápida. Em 90%, 70% dos casos que estavam caindo lá, eu posso ir direto para o Fallback, e de vez em quando eu repasso uma requisição para ver se o microsserviço voltou ao normal. Para ver se ele está responder no tempo aceitável.

E isso é o que nós vamos ver no próximo vídeo, como fazer essa implementação de Circuit Breaker e Fallback com Hystrix e ver esse comportamento que ele tem para tentar otimizar isso e ficar verificando se o microsserviço voltou. Isso nós vamos ver no próximo vídeo.

Sobre o curso Microservices com Spring Cloud: Circuit Breaker, Hystrix e API Gateway

O curso Microservices com Spring Cloud: Circuit Breaker, Hystrix e API Gateway possui 144 minutos de vídeos, em um total de 42 atividades. Gostou? Conheça nossos outros cursos de Java em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Java acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas