Avevo anche bisogno di fare lo stesso, e dopo un po 'non ottimale con i controller Spring e RestTemplate, ho trovato una soluzione migliore: Smiley's HTTP Proxy Servlet. Il vantaggio è che fa AS-IS proxy, proprio come Apache mod_proxy
, e lo fa in modo streaming, senza memorizzare nella cache la richiesta/risposta completa nella memoria.
Semplicemente, si registra un nuovo servlet nel percorso che si desidera eseguire il proxy su un altro server e si fornisce a questo servlet l'host di destinazione come parametro di inizializzazione. Se si utilizza un'applicazione web tradizionale con un web.xml, è possibile configurarlo come segue:
<servlet>
<servlet-name>proxy</servlet-name>
<servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class>
<init-param>
<param-name>targetUri</param-name>
<param-value>http://target.uri/target.path</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>proxy</servlet-name>
<url-pattern>/mapping-path/*</url-pattern>
</servlet-mapping>
o, naturalmente, si può andare con la annotation config.
Se si utilizza Primavera di avvio, è ancora più facile: Hai solo bisogno di creare un chicco di tipo ServletRegistrationBean
, con la configurazione richiesta:
@Bean
public ServletRegistrationBean proxyServletRegistrationBean() {
ServletRegistrationBean bean = new ServletRegistrationBean(
new ProxyServlet(), "/mapping-path/*");
bean.addInitParameter("targetUri", "http://target.uri/target.path");
return bean;
}
In questo modo, è anche possibile utilizzare le proprietà di primavera che sono disponibili nell'ambiente.
È anche possibile estendere la classe ProxyServlet
e sovrascrivere i suoi metodi per personalizzare le intestazioni di richiesta/risposta ecc. Nel caso sia necessario.
Aggiornamento: Dopo aver utilizzato il servlet proxy di Smiley per un po ', abbiamo avuto alcuni problemi di timeout, non funzionava in modo affidabile. Passato a Zuul da Netflix, non ho avuto problemi dopo. Un tutorial sulla configurazione con Spring Boot può essere trovato su this link.
Ho un client, un server intermedio e un paio di server principali. Il client comunica solo con il server intermedio che invia la chiamata a un server. Il server restituisce una risposta al server intermedio, che quindi elabora, quindi restituisce la risposta al client. – user1144031
non dovrebbe copiare le intestazioni delle richieste (3) e il corpo (4) compensare anche i parametri della richiesta di copia (2) (poiché i parametri del post fanno parte del corpo della richiesta, per far sì che siano parte dell'URL)? Sarebbe ridondante (nella richiesta http) se eseguo entrambi i passaggi – mickeymoon