有没有办法使用 Zuul 来代理内部 http 调用?
Is there a way to use Zuul to proxy inner http calls?
我有一个 spring-boot
应用程序,我可以向其发出 HTTP
请求,然后它会向互联网上的其他资源发送另一个 HTTP
请求。
@RestController
@SpringBootApplication
public class BookApplication {
@RequestMapping(value = "/available")
public String available() throws Exception {
String url = "https://www.google.com";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", "Mozilla/5.0");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuffer response = new StringBuffer();
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return "Spring in Action";
}
public static void main(String[] args) {
SpringApplication.run(BookApplication.class, args);
}
}
我还有另一个 spring-boot
应用程序,它是 Zuul
代理。
@EnableZuulProxy
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@Bean
public SimpleFilter simpleFilter() {
return new SimpleFilter();
}
}
简单过滤器 class 是:
public class SimpleFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(SimpleFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
return null;
}
}
application.properties Zuul
代理应用程序:
zuul.routes.books.url=http://localhost:8090
ribbon.eureka.enabled=false
server.port=8080
基本上,一切都来自这个教程tutorial
所以我想知道是否有机会将请求代理到 BookApplication
中由 /available
资源完成的“https://www.google.com”?
没有办法。 Zuul 不适合做那种事。
您可以通过创建自定义的 CloseableHttpClient bean 来覆盖 Zuul 的标准 HttpClient。在那里你可以设置你的代理配置。
@Bean
@Primary
public CloseableHttpClient customHttpClient() {
return HttpClientBuilder.create()
.setSSLHostnameVerifier(new NoopHostnameVerifier())
.setProxy(new HttpHost("your.proxy.com", 80))
.build();
}
如果你想为你的路由使用不同的代理,请查看我在这个 post 中的回答:
另请注意,spring 云不再支持 zuul。所以推荐的方法是切换到 spring 网关。
希望能帮到你
我有一个 spring-boot
应用程序,我可以向其发出 HTTP
请求,然后它会向互联网上的其他资源发送另一个 HTTP
请求。
@RestController
@SpringBootApplication
public class BookApplication {
@RequestMapping(value = "/available")
public String available() throws Exception {
String url = "https://www.google.com";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", "Mozilla/5.0");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuffer response = new StringBuffer();
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return "Spring in Action";
}
public static void main(String[] args) {
SpringApplication.run(BookApplication.class, args);
}
}
我还有另一个 spring-boot
应用程序,它是 Zuul
代理。
@EnableZuulProxy
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@Bean
public SimpleFilter simpleFilter() {
return new SimpleFilter();
}
}
简单过滤器 class 是:
public class SimpleFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(SimpleFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
return null;
}
}
application.properties Zuul
代理应用程序:
zuul.routes.books.url=http://localhost:8090
ribbon.eureka.enabled=false
server.port=8080
基本上,一切都来自这个教程tutorial
所以我想知道是否有机会将请求代理到 BookApplication
中由 /available
资源完成的“https://www.google.com”?
没有办法。 Zuul 不适合做那种事。
您可以通过创建自定义的 CloseableHttpClient bean 来覆盖 Zuul 的标准 HttpClient。在那里你可以设置你的代理配置。
@Bean
@Primary
public CloseableHttpClient customHttpClient() {
return HttpClientBuilder.create()
.setSSLHostnameVerifier(new NoopHostnameVerifier())
.setProxy(new HttpHost("your.proxy.com", 80))
.build();
}
如果你想为你的路由使用不同的代理,请查看我在这个 post 中的回答:
另请注意,spring 云不再支持 zuul。所以推荐的方法是切换到 spring 网关。
希望能帮到你