我有两个Spring启动应用程序,其中一个充当API网关(如此处所讨论的Spring Example)。连接到第一个的另一个是使用spring-data-rest(spring-data-neo4j-rest)公开配置文件服务。
第一个应用程序从端口8080开始,并使用zuul将请求路由到第二个,如下所示:
zuul:
routes:
profiles:
path: /profiles/**
url: http://localhost:8083/profiles/
一切正常,第二个应用程序正在向http://localhost:8080/profiles提出请求。但问题是响应中的HATEOAS链接不正确。调用第二个服务的响应是正确的:
{
"_links": {
"self": {
"href": "http://localhost:8083/profiles{?page,size,sort}",
"templated": true
},
"search": {
"href": "http://localhost:8083/profiles/search"
}
},
"_embedded": {
"profiles": [
{
"name": "Andrew Rutter",
"_links": {
"self": {
"href": "http://localhost:8083/profiles/0"
}
}
},
{
"name": "Andrew Rutter",
"_links": {
"self": {
"href": "http://localhost:8083/profiles/1"
}
}
}
]
},
"page": {
"size": 20,
"totalElements": 2,
"totalPages": 1,
"number": 0
}
}
但是当这回到我的API网关时,链接正被重写为
{
"name": "Andrew Rutter",
"_links": {
"self": {
"href": "http://localhost:8080/profiles/profiles/0"
}
}
}
哪个是网关路径别名加上实际的服务基础Uri。我错过了一个zuul选项来禁用该行为,只是通过主机调整留下hateoas uri。或者有没有办法让我的服务在网关后连接到/而不是/ profiles的默认资源端点(在这种情况下),这将避免添加不需要的路径。
谢谢!
答案 0 :(得分:6)
Zuul或Spring-Cloud添加了" X-Forwarded-Host"标题为所有转发的请求,Spring-hateoas尊重并适当修改链接。引用Spring-Cloud文档:
X-Forwarded-Host标头添加到转发的请求中 默认。要将其关闭,请设置zuul.addProxyHeaders = false。前缀 默认情况下,路径被剥离,对后端的请求会获取 标题" X-Forwarded-Prefix" (" / myusers"在上面的例子中)。
您可以尝试推荐的修补程序,即设置zuul.addProxyHeaders=false
答案 1 :(得分:3)
我有完全相同的问题。按如下方式更改配置:
zuul:
routes:
profiles:
path: /profiles/**
url: http://localhost:8083
stripPrefix: false
这会将所有发送到网关的请求路由到" / profiles / **"到你的后端服务器" http://localhost:8083"并留下前缀(在你的情况下" / profiles"因为那是与路线相匹配的。)
答案 2 :(得分:0)
Zuul转发到/ profiles contextPath。
尝试将其设置为配置:
zuul:
routes:
profiles:
path: /profiles/**
url: http://localhost:8083/
答案 3 :(得分:0)
经过一段时间的努力解决同样的问题后,我终于尝试了zuul.addProxyHeaders = true
并且它有效!
链接不再被打破。
答案 4 :(得分:0)
在我讨论Spring Data REST时用于SpringOne的演示应用程序中,我有以下配置来处理URI重写以及正确调整前缀头设置。
zuul:
routes:
api:
path: /api/**
serviceId: spring-a-gram-backend
stripPrefix: false
files:
path: /files/**
serviceId: spring-a-gram-mongodb-fileservice
stripPrefix: false
完整查看