0

我目前正在开发一个 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 的配置?

提前致谢 !

4

2 回答 2

0

只需配置

  zuul.addProxyHeaders = false

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

于 2019-05-19T06:25:54.757 回答
0

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

于 2019-06-18T15:37:13.407 回答