我使用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特殊處理?)
我覺得應該有一個更聲明或約定或基於配置的方式來處理這個問題。在那兒?
根服務是否知道要調用的正確URL,爲什麼還要嘗試使用Eureka和RIbbon?爲什麼不使用普通的'RestTemplate'來提出請求? –
不知道我明白。有一個消費服務。它使用負載平衡RestTemplate和eureka服務名稱請求目標服務的根資源。沒有我的解決方法,響應包含指向響應實例的物理地址的鏈接。對這些URL的請求不支持使用相同的負載平衡RestTemplate。一種方法是使用另一個正常的RestTemplate向這些URL發出請求。我更喜歡鏈接到尤里卡服務名稱,並使用相同的RestTemplate進行請求,因爲它似乎更具彈性。隨意說服我,否則:) – rainerfrey
這似乎是公平的指出,上下文是一個遊樂項目,我探索春雲,沒有任何針對生產。 – rainerfrey