É uma prática ruim chamar outra API de um filtro?

5

Estou usando o Java, o Spring e o Jersey.

Eu tenho uma API A REST que recebe um parâmetro de consulta chamado q e a envia para outra API B para obter uma resposta.

Eu preciso implementar uma alteração na qual preciso primeiro passar a consulta do cliente para outra API C e usar a resposta da API C para criar uma nova solicitação , ou seja, basicamente, envolva a solicitação em um HttpServletRequestWrapper que tenha o novo parâmetro q .

Espero que esta imagem esclareça isso um pouco:

Então, a ideia é usar um javax.servlet.Filter para esse cenário. Algumas perguntas que me incomodam:

  1. É uma boa prática chamar outra API de um Filter ?

  2. Estou usando o Spring. Seria um problema usar @Autowired para o cliente da API C dentro do meu Filter ?

por Diyarbakir 16.03.2017 / 15:53
fonte

1 resposta

3

Você está fazendo o que é comumente conhecido como Web Service Orchestration. Consulte esta postagem relacionada no StackOverflow sobre a orquestração de microsserviços.

O uso de um filtro de servlet para fazer uma chamada para um serviço externo não é recomendado. De acordo com a documentação do Oracle, os filtros devem ser usados para transformar a solicitação ou resposta HTTP ou ambos. Neste caso, não é puramente transformador, ele está chamando um serviço externo que não está sob seu controle, então você precisa tratá-lo como um potencial ponto de falha.

Os filtros devem ser usados para transformar formatos ou registros, etc. Colocar qualquer chamada externa deve ser feita como parte de sua lógica de orquestração de serviços.

Uma limitação da lógica de orquestração em Filtros é que a ordem na qual ela é chamada importará e você precisará ter cuidado para obter a ordem correta. De uma perspectiva de design de código, isso torna seu código mais frágil.

Além disso, se você quiser mais tarde fazer uma orquestração mais complexa dos serviços com tempos limite, etc., usar filtros pode ser problemático, pois você pode afetar outros filtros na cadeia.

As abordagens recomendadas seriam usar algo como o Apache Camel ou o Spring Integration ou implementar o padrão do gateway de API como sugerido no link acima do Stack Overflow.

    
por 20.03.2017 / 23:49
fonte