2015-11-14 85 views
5

我們已經在我們的Spring Boot應用程序中使用了Eureka幾個月了。我們啓用了使用@DiscoveryClient註釋的應用程序之間的服務查找。註冊,續租和註銷按預期工作。使用Eureka作爲使用REST API的註冊表

最近,我們遇到了一個場景,我們有非Java應用程序組件(用C++編寫),它公開了許多Spring Boot Java應用程序將使用的3個REST服務端點。我們試圖查看C++組件是否可以在Eureka服務器的REST API出現時使用它來註冊自己,以便Spring Boot Java應用程序可以通過Eureka執行通常的查找來聯繫C++組件。由於我不能在C++組件中使用Eureka客戶端(顯然),我開始使用Postman測試直接REST API(如here所述)。通過使用POST方法向http://eurekaserver:8761/eureka/apps/FOO-APP發送JSON有效負載(instanceId = 1111和hostName = foo-app),註冊工作沒有任何問題。我可以查詢http://eurekaserver:8761/eureka/apps,並可以按預期的方式查看那裏列出的FOO-APP。

但是,當我嘗試使用DELETE方法到http://eurekaserver:8761/eureka/apps/FOO-APP/1111http://eurekaserver:8761/eureka/apps/FOO-APP/foo-app的取消操作時,出現404錯誤。

隨着實例Id:

{ 
    "timestamp": 1447479397996, 
    "status": 404, 
    "error": "Not Found", 
    "message": "Not Found", 
    "path": "/eureka/apps/FOO-APP/1111" 
} 

OR(主機名相同的結果):

{ 
    "timestamp": 1447479397996, 
    "status": 404, 
    "error": "Not Found", 
    "message": "Not Found", 
    "path": "/eureka/apps/FOO-APP/foo-app" 
} 

我嘗試不同的組合,但我不能做這項工作。我有一種感覺,我失去了一些明顯的東西 - 可能是小事。任何幫助,將不勝感激。

PS: Eureka REST端點文檔在URL中提到了「v2」。但是,這在我的情況下不起作用。註冊(適用於我)不使用上述的「v2」。如果有人可以驗證這一點,那也是有幫助的。這似乎沒有足夠的材料。

+1

你有沒有考慮過使用邊車?它處理註冊,並且如果您的C++應用程序想要連接到其他已部署的服務,它也充當反向代理。您的應用程序只需要以預定義的格式顯示其健康狀態。 –

+0

這是一個選項。但我試圖通過調用直接REST端點來實現這一點。我認爲cURL調用應該起作用。但他們沒有發生。 – Bloodysock

+0

spring-cloud不包括v2。您可能使用了錯誤的instanceId。你使用的是什麼版本的春季雲?你是否在應用程序的某個地方設置了'instanceId'? – spencergibb

回答

5

最後,我想出瞭如何使用Eureka服務器的REST URL調用cancel操作。這適用於Spring Cloud Eureka服務器,但也適用於Netflix Eureka服務器。

cancel操作的URL模式是以下幾點:

DELETE http://eureka_host:eureka_port/eureka/apps/<appName>/<instanceId> 

這是它是如何在Eureka REST operations頁文檔,但很少清晰的,以什麼<instanceId>應該是。根據文檔,<instanceId>是運行Eureka客戶端的主機的主機名。那不是工作(IP地址或主機名)。我嘗試傳遞相同的值,即GET URL給我(例如,192.168.55.55)或localhost。那也行不通。我也嘗試傳遞GET輸出中的instanceId值(這與eureka.instance.metadataMap.instanceId屬性的值相同)。這也是行不通的。我從字面上不得不嘗試不同的組合來找出答案。 <instanceId>是主機名和實例ID的連接,由:分隔。例如,192.168.55.55:foo-app-some-random-str

這裏的GET操作的輸出示例清單與尤里卡註冊的活動實例:

<instance> 
    <hostName>192.168.55.55</hostName> 
    <app>FOO-APP</app> 
    ... 
    <metadata> 
    <instanceId>foo-app-f4ea7b06fc03a05a06900713f7526a5d</instanceId> 
    </metadata> 
    ... 
</instance> 

在這種情況下,cancel捲曲命令應該是這樣的:

$ curl -X "DELETE" http://eureka_host:eureka_port/eureka/apps/FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d 

這將取消按預期註冊實例。

也就是說,我必須承認,我沒有太注意尤里卡服務器日誌。當您註冊Eureka客戶端時,日誌會打印出實例的完全限定名稱(FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d),我可以將其用作我的猜測。

我希望有人在Eureka documentation中修復此問題。