È una cattiva pratica chiamare un'altra API da un filtro?

5

Sto usando Java, Spring e Jersey.

Ho un API A REST che riceve un parametro di query chiamato q e lo invia ad un'altra API B per ottenere una risposta.

Devo implementare una modifica in cui prima devo passare la query dal client a un'altra API C e utilizzare la risposta da API C per creare una nuova richiesta , cioè basicamente avvolgere la richiesta in un HttpServletRequestWrapper che ha il nuovo parametro q .

Speriamo che questa immagine chiarisca un po 'questo:

Quindi l'idea è di usare un javax.servlet.Filter per questo scenario. Poche domande che mi infastidiscono:

  1. È consigliabile chiamare un'altra API da Filter ?

  2. Sto usando Spring. Sarebbe un problema utilizzare @Autowired per il client di API C nel mio Filter ?

posta Diyarbakir 16.03.2017 - 15:53
fonte

1 risposta

3

Stai facendo ciò che è comunemente noto come orchestrazione dei servizi Web. Vedi questo post correlato su StackOverflow sull'orchestrazione dei micro servizi.

Non è consigliabile utilizzare un filtro servlet per effettuare una chiamata a un servizio esterno. Secondo la documentazione Oracle, i filtri dovrebbero essere usati per trasformare la richiesta o la risposta HTTP o entrambi. In questo caso non si sta semplicemente trasformando, chiama un servizio esterno che non è sotto il tuo controllo, quindi devi trattarlo come un potenziale punto di errore.

I filtri dovrebbero essere usati per trasformare formati o logging, ecc. Inserire eventuali chiamate esterne come parte della logica di orchestrazione del servizio.

Una limitazione della logica di orchestrazione nei filtri è che l'ordine in cui viene chiamato avrà importanza e sarà necessario fare attenzione a ottenere questo ordine corretto. Dal punto di vista del design del codice, questo rende il tuo codice più fragile.

Inoltre, se vuoi eseguire in seguito un'orchestrazione più complessa dei servizi con timeout, ecc., l'uso dei filtri potrebbe essere problematico in quanto potresti influenzare altri filtri nella catena.

Gli approcci raccomandati dovrebbero utilizzare qualcosa come Apache Camel o Spring Integration o implementare il modello gateway API come suggerito dal link Overflow dello stack sopra riportato.

    
risposta data 20.03.2017 - 23:49
fonte

Leggi altre domande sui tag