1

我使用Spring HATEOAS构建和访问REST服务。该服务向尤里卡服务器注册,并使用功能区(通过@LoadBalanced RestTemplate)进行调用。春天HATEOAS和功能区与尤里卡 - 创建链接中的主机名

默认情况下,请求是针对已解析实例的主机名(在Host标头中)进行的。这会导致Spring HATEOAS中的LinkBuilder为该主机生成链接。当Ribbon请求链接时,它会尝试再次在eureka中查找链接主机名,当然不会得到结果。

解决这种情况的最佳水平是什么?在接收到第一个结果的链接后,我想将直接的后续请求指向同一个服务实例是可以接受的,但我仍然认为对符号服务名称的所有请求会更好。

是否可以配置功能区在Host头中使用该服务名称发出请求(假设目标服务中没有虚拟主机,这似乎是一个有效的假设)?

否则是否可以在HATEOAS中为链接构建器设置规范的基本URL? (将所有链接定义为完整字符串对我来说是不可接受的)

我现在的解决方案/解决方法是在请求根资源时明确设置X-Forwarded-Host标头。这工作,但有点冗长和繁琐。

Traverson traverson = new Traverson(URI.create("http://photo-store/"), MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8, MediaTypes.HAL_JSON).setRestOperations(imageService); 
HttpHeaders httpHeaders = new HttpHeaders(); 
httpHeaders.set("X-Forwarded-Host", "photo-store"); 
String original = this.traverson.follow("image:original").withHeaders(httpHeaders).asTemplatedLink().expand(photoId).getHref(); 

(方的问题:我可以覆盖Host头那样的,或者是在丝带或RestTemplate特殊处理?)

我觉得应该有一个更声明或约定或基于配置的方式来处理这个问题。在那儿?

+0

根服务是否知道要调用的正确URL,为什么还要尝试使用Eureka和RIbbon?为什么不使用普通的'RestTemplate'来提出请求? –

+0

不知道我明白。有一个消费服务。它使用负载平衡RestTemplate和eureka服务名称请求目标服务的根资源。没有我的解决方法,响应包含指向响应实例的物理地址的链接。对这些URL的请求不支持使用相同的负载平衡RestTemplate。一种方法是使用另一个正常的RestTemplate向这些URL发出请求。我更喜欢链接到尤里卡服务名称,并使用相同的RestTemplate进行请求,因为它似乎更具弹性。随意说服我,否则:) – rainerfrey

+0

这似乎是公平的指出,上下文是一个游乐项目,我探索春云,没有任何针对生产。 – rainerfrey

回答

0

我也遇到同样的问题。我通过添加拦截器来解决它,该拦截器将X-Forwarded-Host头添加到每个请求。

@Bean 
@LoadBalanced 
RestTemplate restTemplate() { 
    RestTemplate restTemplate = new RestTemplate(); 
    restTemplate.setInterceptors(singletonList((ClientHttpRequestInterceptor) (request, body, execution) -> { 
     request.getHeaders().add("X-Forwarded-Host", request.getURI().getHost()); 
     return execution.execute(request, body); 

    })); 
    return restTemplate; 
} 
相关问题