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; 
} 
相關問題