[DÚVIDA] Como micro services se comunicão

Estou querendo desenvolver uma arquitetura de microservices e até hoje trabalhei em monólitos onde as apis compartilhavam uma seção, mas em um novo projeto queremos implementar arquitetura de microservices.

O que quero saber é como elas se comunicam, e como elas garantem que a requisição vem do serviço que a requisitou e não um hacker tentando imputar dados via api. como que eu sei que os dados do usuário que uma api está enviando ou solicitando da outra são dados válidos.

Se alguém poder me dar uma ajuda (que pelo menos passe de falar: usa JWT ou Oauth 2.0) ficarei grato.

Primeiro, a arquitetura de microsserviços é uma das principais modinhas que apareceram em TI. Fique longe o quanto puder. Se precisar dele, você estará em uma equipe cheia de gente com bastante conhecimento. Em hipótese alguma uma pessoa consegue lidar com tudo isso sozinho, e até mesmo não tem porque alguém sozinho tentar mexer com isso, em qualquer análise que se faça.

Reforço que quase ninguém precisa. Alguns dos maiores sites não usam e se dão muito bem, por exemplo Wikepedia, Instagram e os maiores ERPs do mercado. Se uma empresa precisa por organização de equipes, e raramente precisa mesmo, e algumas empresas estão voltando atrás até por isso, espere estar em uma equipe com centenas ou milhares de programadores.

Microsserviços é computação distribuída, que é considerado o problema mais difícil de resolver da computação, só pessoas com extraordinário conhecimento farão corretamente. É tão complicado que a maioria faz outra coisa, chama de microsserviços e acha que sabe fazer.

A comunicação entre eles costuma ser toda em rede interna, então o hacker não tem acesso e não precisa de maiores preocupações no software, só na infra. Se não for assim, já é um pouco preocupante, mas se ainda fizer sentido, a proteção é a mesma de qualquer outro site, pode ser com Oauth. Os detalhes dependem de como a pessoa deseja e o que ela está fazendo, não é uma forma universal.

Algumas informações que podem ajudar:

Faz sentido para você?

Espero ter ajudado.

Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

Por favor, não venha com o dogma que você prega no SOpt há anos, citando todos os seus links como se fossem lei e a maioria de 3, 5 anos atrás, ainda bem que aqui o downvote é bem diferente, não né? >Primeiro, a arquitetura de microsserviços é uma das maiores modinhas que apareceram em TI. Fique longe o quanto puder. Errado, suponhamos que eu tenha um serviço distrbuído e uma das suas funções é escrever o output de algo processado em um bucket/banco/arquivo por exemplo. Por qual motivo eu teria o serviço X deployado em todas as minhas instancias quando eu poderia ter um serviço Y bem leve isolado lendo output de uma fila alimentada pelo serviço X fazendo isso? Utilizando assim muito menos recurso, tempo de resposta, não consumindo e alocando recurso do serviço X inteiramente. Existem muitos e muitos casos, principalmente se você precisa lidar com API de terceiros, você vai confiar o seu serviço inteiro, que pode causar lentidão, bug dentre outras mil e uma coisas quando poderia ter essa feature de ir na API e alimentar um banco ou chamar outra API isoladamente e ter esse output pra ser processado no seu outro microserviço? Ou que tal um serviço que lê seu banco de dados e coloca os dados em um redis para fácil acesso? Faria sentido eu fazer os dois no mesmo serviço? Eu posso ter um só pra escrever e outro só pra ler. >Microsserviços é computação distribuída, que é considerado o problema mais difícil de resolver da computação, só pessoas com extraordinário conhecimento farão corretamente. Sim, você tem razão, isso era verdade há uns 6 ou mais anos atrás, como em seus posts. Veja bem, dei exemplos básicos de uso, é óbvio que isso depende de caso para caso. Dizer que é certo ou errado, dificil ou fácil vale somente para você e exclusivamente você. Sobre a dúvida do OP. >O que quero saber é como elas se comunicam, e como elas garantem que a requisição vem do serviço que a requisitou e não um hacker tentando imputar dados via api. como que eu sei que os dados do usuário que uma api está enviando ou solicitando da outra são dados válidos. Existem diversas formas de previnir isso. Caso você só receba requisições do IP X, já é um bom começo, outro é criar um template de validação da requisição e você somente aceitará dados que deem match naquele template, você talvez possa limitar a quantidade de req/s se for o caso. Nada nem nenhum serviço está passível a ser perfeito, vale você limitar ao máximo. Mas vamos imaginar que seguindo a ideia do amigo acima, você tenha tudo junto e seja hackeado, o estrago seria maior, né? Enfim, não se prenda a dogmas, nem ao que eu disse, veja o que é melhor pra você, o que melhor te atende. Se você acha certo por um servidor web/api/aplicação tudo junto, vai lá, vai só disperdiçar recursos. Se você conseguir distrinchar sua aplicação em microserviços aonde cada uma é acionada por outra por algum evento, você fará algo muito melhor, mais dinamico, e caso haja falha em um processo, seu serviço inteiro não seria afetado, somente tal feature.
Um problema difícil de resolver fica magicamente fácil depois de 5 anos? Ou as pessoas só distorceram o conceito origonal para parecer que são boas nisso? Os maiores especialistas no assunto não estão escrevendo que o que eles disseram há anos não vale mais, só por preguiça? É só retórica. É uma maneira de pensar, cada um faz o que acha melhor, cada um ouve quem achar melhor, o lucro ou prejuízo é da pessoa. Não vou discutir suas afirmações, eu simplesmente não tenho mais paciência, essas coisas vão longe e não chegam a lugar algum, quem ler acredite em quem quiser. Eu tenho minha experiência que me diz o contrário do que você diz. Só em resumo, reafirmo a parte que eu digo "É tão complicado que a maioria faz outra coisa, chama de microsserviços e acha que sabe fazer". Por isso eu não responderei mais, já disse o que eu tinha que dizer, hoje me dou o direito de escolher quando o debate vale a pena. Ainda mais depois de ver como foi sua participação no SOpt e entender porque está falando de lá. Talvez esse entendimento seja parecido com o que tem sobre dogma e o que acha que é e o que não é.

Ola @MestriRodrigo, separei sua pergunta em topicos para facilitar.

Como se comunicam?

Em uma arquitetura distribuida (micro-servicos) as aplicacoes podem se comunicar internamente de duas maneiras, sincrona ou assincrona. Sincrona: Comunicacao sincrona exige que as duas aplicacoes estejam rodando ao mesmo tempo e capaz de responder uma solicitacao quase instantaneamente. Normalmente utiliza protocolos como o HTTP. A parte ruim desse metodo e que se por algum motivo uma das aplicacoes estiver indisponivel no momento, o sistema como um todo para de funcionar. Assincrona: Nesse metodo, a estrutura do sistema fica mais complexa e normalmente exige um intermediario entre os dois sistemas para se comunicar. Existe varias ferramentas para suportar esse tipo de estrutura, normalmente chamadas de message brokers, pelo meu conhecimento, uma das mais conhecidas e o kafka. A parte ruim de comunicacoes assincronas e que a complexidade do sistema aumenta, dificultando rastreamento de errors e aumentando tempo de desenvolvimento. [Opiniao] Projetos para utilizacao de micro-servicos:

  • Intuito de aprendizado. (Sistemas/Empresas que lidam com grande trafico de dados em sua maioria adotam micro-servicos pela sua resiliencia e maior controle de escalonamento. Aprender essa arquitetura pode te dar vantagens em caso de uma entrevista.)
  • Projeto que ja tem ou preve ter em curto-prazo grande trafego de informacoes. Como disse anteriormente, as vantagens de resiliencia a escalonamento sao fundamentais para manter as coisas funcionando.

Caso nao seja uma das opcoes acima, aconselho manter em monolitos pela praticidade e velocidade de desenvolvimento.

Como garantem que a requisicao vem do servico que a requisitou?

Normalmente os micro servicos estao rodando na mesma rede/cluster e como a comunicacao ocorre internamente, voce nao precisa autenticar de quem veio a requisicao. O servico recebe a requisicao e responde sem checar a origem. Lembrando que essas portas de entradas nao podem ser acessiveis publicamente.

Como validar os dados?

Cada servico e responsavel de validar os dados de entrada e caso a requisicao esteja em um formato invalido, deve responder com um error (por exemplo erro status 400) como se fosse um usuario normal.

As respostas sao validas para comunicacoes internas apenas, no caso de comunicacao com clientes (por exemplo navegador de usuario), as regras de seguranca e validacao de dados sao outras. Seria melhor discutir sobre isso em outra thread.

Espero ter ajudado e tambem espero que alguem tenha algo para debater ou complementar.

Resposta curta: DEPENDE*

Resposta para pesquisar: Autenticação Meios protocolos: protobuf json SOAP

Maior parte da comunicação é por endpoints com protocolo http, então o remetente e o destinatário envia e recebe JSON por essas comunicação.

O mias comum atualmente, mas pode mudar.