使用 Apache Camel 的 Netty4 HTTP 组件通过代理进行 "external" 调用

Making "external" calls through proxy using Apache Camel's Netty4 HTTP component

我们使用 Apache Camel 的 Netty4 HTTP Component 处理我现在遇到问题的工件上的几乎所有内容。

问题是,现在需要代理才能对 Internet 进行 external/outbound 调用...最终这不起作用。所有的调用都得到 blocked/rejected — 只是为了记录,我们在不同的工件中遇到了同样的问题,我们能够通过使用 JVM 代理设置来绕过它,但是这个使用的是 Async Http Client.

我试过使用 http.proxyHosthttp.proxyPort 等在 JVM 级别设置 proxy,但这次没有用。

问题:有没有办法在此组件中配置任何代理设置?我一直在深入研究 org.apache.camel.component.netty4.http.NettyHttpConfiguration 看看是否有任何我可以 change/use 的相关设置——我不完全确定它在幕后使用的是什么 HTTP 客户端,我猜它可能是 Netty O :)


如果相关,我们的(其中一条)路线如下所示:

@Component
public final class Route extends AbstractRouteBuilder {
  @Override
  public void configure() throws Exception {
    super.configure();

    from("{{route.inbound.reports}}") // netty4-http:https://hostname.tld/api/v1/reports
      .choice()
      .when(header(Exchange.HTTP_METHOD).isEqualToIgnoreCase(HttpMethod.GET))
        .toD("seda:get")
        .choice()
        .when(AbstractHelper::isOk)
          .setProperty("source", constant("user"))
          .to("seda:retrieve?timeout={{async.timeout:4500}}")
          .setBody(simple("${property.results}"))
          .marshal().json(JsonLibrary.Jackson)
          .end()
        .endChoice()
      .otherwise()
        .toD("{{route.artifact.reports}}");

    from("seda:get")
      .toD("{{route.artifact.reports}}")
      .unmarshal().json(JsonLibrary.Jackson)
      .to(exec("analyze"));

    from("seda:retrieve")
      .filter(PredicateBuilder.and(header(Key.ACCOUNT_ID).isNotNull()))
      .setHeader(Exchange.HTTP_METHOD, constant(HttpMethod.GET))
      .setHeader(Header.API_KEY, simple("{{vendor.api-key}}"))
      .toD("{{route.outbound.reports}}") // netty4-http:https://external-hostname.tld/api/client/reports
      .unmarshal().json(JsonLibrary.Jackson)
      .choice()
      .when(AbstractHelper::isOk)
        .to(exec("aggregate"))
      .otherwise()
        .to(exec("handleFailure"))
      .end();
  }

  // ...
}

我想没有办法绕过这个……或者至少,在允许的时间范围内我找不到。

我们 ended-up 对所有 external/outbound 调用使用不同的组件(遵守代理规则);具体来说: