1

Spring HATEOAS를 사용하여 REST 서비스를 작성하고 액세스합니다. 이 서비스는 유레카 서버에 등록되며 리본을 사용하여 (@LoadBalanced RestTemplate 통해) 호출합니다.Spring HATEOAS and Ribbon with Eureka - 생성 된 링크에 호스트 이름이 있습니다.

기본적으로 해결 된 인스턴스의 호스트 이름 (Host 헤더)에 대한 요청이 이루어집니다. 이로 인해 Spring HATEOAS의 LinkBuilder가이 호스트에 대한 링크를 생성합니다. 리본이 링크를 따라갈 것을 요청하면, 링크 호스트 이름을 다시 유레카에서 찾는데 아무런 결과도 얻지 못합니다.

이 상황을 해결하기위한 최상의 수준은 무엇입니까? 첫 번째 결과와 링크를받은 후에는 동일한 서비스 인스턴스에 대한 즉각적인 다음 요청을 보내면 좋을 것 같아요. 여전히 상징적 서비스 이름에 대한 모든 요청이 더 좋을 것이라고 생각합니다.

호스트 헤더에 해당 서비스 이름으로 요청하도록 리본을 구성 할 수 있습니까 (타당한 가정 인 가상 서비스는 대상 서비스에 없다고 가정)?

그렇지 않으면 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

잘 모르겠습니다. 하나의 소모적 인 서비스가 있습니다. eureka 서비스 이름과 함께로드 균형 조정 된 RestTemplate을 사용하여 대상 서비스의 루트 리소스를 요청합니다. 내 해결 방법이 없으면 응답에 응답 인스턴스의 실제 주소에 대한 링크가 포함됩니다. 이 URL에 대한 요청은 동일한로드 균형 조정 RestTemplate에서 작동하지 않습니다. 하나의 접근법은 또 다른 일반 RestTemplate을 사용하여 이러한 URL에 대한 요청을하는 것입니다. 나는 유레카 서비스 이름에 대한 링크를 얻고, 더 Restilient 한 것처럼 동일한 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; 
}