spring-boot - Zuul 通过外部代理服务器路由请求

标签 spring-boot proxy netflix-zuul

我们目前的项目需求是将一些请求路由到第三方外部api服务器。为此,我们使用基于 spring zuul 的路由器服务。

zuul:
  routes
    test:
      path: /test/**
      serviceId: test
      url: http://my.api.server.com
    test2:
      path: /test2/**
      serviceId: test2
      url: http://my.api.server.com // but through an external proxy
现在的要求是,对于某些端点,对​​外部 api 服务器的请求已通过某些外部代理服务器路由,而不是我们拥有的,
如何通过 curl 做到这一点是:
curl <external_api_server>/api/v1/user -k \
  -x tntqyhnhjym.sandbox.verygoodproxy.com:8080 \
  -H "Content-type: application/json" \
  -d '{"card_number": "tok_sandbox_t8VSoovCuHA779eJGZhKvg", ... }'

-x <proxy>通过给定的代理重定向请求。
如何通过 spring-zuul 服务器做到这一点?
有一个线索,我得到了吗? https://github.com/spring-cloud/spring-cloud-netflix/issues/2320 .不干净,因为我需要扩展 SimpleHostRoutingFilterzuul

最佳答案

选项 1 - 反向代理服务器(使用代理)
您可以设置一个反向代理 - 配置为通过代理。您的反向代理将使用参数(例如 java 或 nodejs)启动以使用外部代理。此反向代理将是一个不同的过程,它将通过您想要的代理传递所有请求。
您可以通过设置第二个 zuul 代理应用程序或通过 nodejs 反向代理( expressnode-http-proxy )来实现。
第二个zuul应用程序(仅适用于外部)
因此,如果您使用 zuul,您将使用以下内容制作第二个应用程序:

   test2:
      path: /proxied-test2/**
      serviceId: test2
      url: http://my.api.server.com 
然后,您将使用代理的参数和特定端口(例如 9200 )在同一台服务器上启动此服务器,例如
-Dhttp.proxyHost=localhost -Dhttp.proxyPort=8888
原始申请
在您的原始应用程序中,您会将您的路线替换为以下内容。
zuul:
  routes
    test:
      path: /test/**
      serviceId: test
      url: http://my.api.server.com
    test2:
      path: /test2/**
      serviceId: test2
      url: http://localhost:9200/proxied-test2/

选项 2:使用可编写脚本的 http 代理服务器
您可以设置一个代理服务器,然后设置一些关于哪些请求应该通过代理路由以及哪些请求应该在没有代理的情况下工作的异常(exception)和规则。
第二步是将您的应用程序配置为使用在步骤 1 中指定的本地代理服务器。为此,您可以使用以下命令行参数:
-Dhttp.proxyHost=localhost -Dhttp.proxyPort=8888
我过去为代理服务器配置了排除列表,但我从未配置/编写过包含列表。在您的情况下,包含列表会更有意义,因此我将测试可编写脚本/可编程代理服务器,例如:
  • https://mitmproxy.org/ - 可通过 mitmdump 编写脚本
  • 关于spring-boot - Zuul 通过外部代理服务器路由请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64384901/

    相关文章:

    node.js - 使用sftp和socks5代理node.js

    http - 为什么浏览器请求不通过我的代理服务器?

    java - 用于缓存的 Netflix Zuul 前置过滤器不适用于少量压缩响应

    spring-mvc - Spring Cloud Gateway 与 Zuul 有何不同?

    java - 如何在 Java EE 应用程序中使用丰富的 header 将请求代理到另一个位置

    java - 将 JSON 发布到后端

    java - JPA 序列化/反序列化嵌套自动生成字段

    Apache 使用 http/1.0 响应,即使请求是 http/1.1

    java - 列出 JAR 资源文件夹中所有子目录的名称

    spring-boot - 如何在必须和必须 Elasticsearch bool 查询之间建立AND条件