【问题标题】:API Gateway using Spring Cloud + Zuul + Consul : dynamic routing not working when using HTTPS使用 Spring Cloud + Zuul + Consul 的 API 网关:使用 HTTPS 时动态路由不起作用
【发布时间】:2019-07-14 10:57:23
【问题描述】:

我目前正在开发一个 API 网关,以集中对 REST API 的调用。我们使用 Spring Cloud (Edgware.SR3 版本),使用 Zuul (1.3.0) 来处理服务发现和 Consul 作为服务注册。

在第一个版本中,每个服务的路由都使用 zuul.routes.myApiName.url 在网关配置中注册,并且运行良好。

然后,我们想使用动态路由来允许每个 API 有多个实例。

为此,我删除了 zuul.routes.myApiName.url。 问题是我通过网关对 API 的调用正在返回并出现错误:

错误请求 这种主机和端口的组合需要 TLS。

这里是在 Consul 中注册 API 的配置:

spring.cloud.discovery.enabled=true
spring.cloud.consul.host=@consul_host_ip@
spring.cloud.consul.port=@consul_host_port@
spring.cloud.consul.discovery.scheme=https

这里是Zuul路由在网关的配置:

zuul.host.socket-timeout-millis=60000
zuul.add-proxy-headers=false
zuul.ignored-services=*
zuul.routes.myApiName.path=/myApiName/**
zuul.routes.myApiName.serviceId=myApiName

API 已在 Consul 中正确注册,健康检查使用 HTTPS 成功:

HTTP GET https://hostname:port/health: 200  Output: {"description":"Composite Discovery Client","status":"UP"}

证书也配置得很好,因为我可以使用 HTTPS 直接调用我的 API。 但似乎 Zuul 重定向使用的是 HTTP 而不是 HTTPS(如果我使用 HTTP 以直接模式(无网关)调用我的 API,我会遇到同样的错误)。

我已经为此苦苦挣扎了一段时间,所以我想知道是否缺少强制 Zuul 在路由调用 API 中使用 HTTPS 的配置?

提前致谢!

【问题讨论】:

    标签: netflix-zuul consul spring-cloud-consul


    【解决方案1】:

    只需配置

      zuul.addProxyHeaders = false
    

    由于 Zuul 在将任何请求转发到后端时添加了代理标头。

    【讨论】:

    • 感谢您的回答,我尝试添加此属性,但现在我遇到此错误:原因:java.lang.RuntimeException: java.net.UnknownHostException: https: unknown error I'也试过用Edgware.SR5代替SR3,配置一样,但是抛出了原来的错误(Bad Request This combination of host and port requires TLS.)。
    【解决方案2】:

    我终于找到了解决方案:我必须添加这个属性: ribbon.IsSecure=true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-31
      • 2017-07-27
      • 2021-03-27
      • 2017-11-25
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2017-08-14
      相关资源
      最近更新 更多