使用 Eureka 作为使用 REST API 的注册表
Using Eureka as a registry using REST APIs
几个月来,我们一直在 Spring 启动应用程序中使用 Eureka。我们使用 @DiscoveryClient
注释启用了应用程序之间的服务查找。注册、续租和注销按预期进行。
最近,我们遇到了一个场景,我们有非 Java 应用程序组件(用 C++ 编写),它公开了 3 个 REST 服务端点,我们的许多 Spring 引导 Java 应用程序将使用。我们正在尝试查看 C++ 组件是否可以在它出现时利用 Eureka 服务器的 REST API 来注册自己,以便 Spring Boot Java 应用程序可以通过 Eureka 执行通常的查找以获取接触 C++ 组件。
由于我不能在 C++ 组件中使用 Eureka 客户端(很明显),我开始测试直接 REST API(如所述 here) using Postman. The registration worked without any problems by sending a JSON payload using POST method to http://eurekaserver:8761/eureka/apps/FOO-APP (with instanceId = 1111 and hostName = foo-app). I can query http://eurekaserver:8761/eureka/apps 并且可以看到 FOO-APP 按预期列出。
但是,当我尝试使用 DELETE 方法对 http://eurekaserver:8761/eureka/apps/FOO-APP/1111 or http://eurekaserver:8761/eureka/apps/FOO-APP/foo-app 执行取消操作时,出现 404 错误。
实例编号:
{
"timestamp": 1447479397996,
"status": 404,
"error": "Not Found",
"message": "Not Found",
"path": "/eureka/apps/FOO-APP/1111"
}
或(主机名的相同结果):
{
"timestamp": 1447479397996,
"status": 404,
"error": "Not Found",
"message": "Not Found",
"path": "/eureka/apps/FOO-APP/foo-app"
}
我尝试了不同的组合,但无法完成这项工作。我有一种感觉,我错过了一些明显的东西——可能是一些小东西。如有任何帮助,我们将不胜感激。
PS: Eureka REST 端点文档在 URL 中提到了 "v2"。但是,这对我来说不起作用。如上所述,注册(对我有用)不使用 "v2"。如果有人可以验证这一点,那也会有所帮助。这方面似乎还不够material。
最后,我弄清楚了如何使用 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 客户端的主机的 hostname。那确实 不 工作(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
操作的示例输出,列出了在 Eureka 注册的活动实例:
<instance>
<hostName>192.168.55.55</hostName>
<app>FOO-APP</app>
...
<metadata>
<instanceId>foo-app-f4ea7b06fc03a05a06900713f7526a5d</instanceId>
</metadata>
...
</instance>
在这种情况下,cancel
cURL 命令将如下所示:
$ curl -X "DELETE" http://eureka_host:eureka_port/eureka/apps/FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d
这将按预期取消注册实例。
就是说, 我必须承认我没有太注意 Eureka 服务器日志。当您注册 Eureka 客户端时,日志会打印出实例的完全限定名称 (FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d
),我可以将其用作我的猜测。
我希望有人在 Eureka documentation 中解决这个问题。
几个月来,我们一直在 Spring 启动应用程序中使用 Eureka。我们使用 @DiscoveryClient
注释启用了应用程序之间的服务查找。注册、续租和注销按预期进行。
最近,我们遇到了一个场景,我们有非 Java 应用程序组件(用 C++ 编写),它公开了 3 个 REST 服务端点,我们的许多 Spring 引导 Java 应用程序将使用。我们正在尝试查看 C++ 组件是否可以在它出现时利用 Eureka 服务器的 REST API 来注册自己,以便 Spring Boot Java 应用程序可以通过 Eureka 执行通常的查找以获取接触 C++ 组件。
由于我不能在 C++ 组件中使用 Eureka 客户端(很明显),我开始测试直接 REST API(如所述 here) using Postman. The registration worked without any problems by sending a JSON payload using POST method to http://eurekaserver:8761/eureka/apps/FOO-APP (with instanceId = 1111 and hostName = foo-app). I can query http://eurekaserver:8761/eureka/apps 并且可以看到 FOO-APP 按预期列出。
但是,当我尝试使用 DELETE 方法对 http://eurekaserver:8761/eureka/apps/FOO-APP/1111 or http://eurekaserver:8761/eureka/apps/FOO-APP/foo-app 执行取消操作时,出现 404 错误。
实例编号:
{
"timestamp": 1447479397996,
"status": 404,
"error": "Not Found",
"message": "Not Found",
"path": "/eureka/apps/FOO-APP/1111"
}
或(主机名的相同结果):
{
"timestamp": 1447479397996,
"status": 404,
"error": "Not Found",
"message": "Not Found",
"path": "/eureka/apps/FOO-APP/foo-app"
}
我尝试了不同的组合,但无法完成这项工作。我有一种感觉,我错过了一些明显的东西——可能是一些小东西。如有任何帮助,我们将不胜感激。
PS: Eureka REST 端点文档在 URL 中提到了 "v2"。但是,这对我来说不起作用。如上所述,注册(对我有用)不使用 "v2"。如果有人可以验证这一点,那也会有所帮助。这方面似乎还不够material。
最后,我弄清楚了如何使用 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 客户端的主机的 hostname。那确实 不 工作(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
操作的示例输出,列出了在 Eureka 注册的活动实例:
<instance>
<hostName>192.168.55.55</hostName>
<app>FOO-APP</app>
...
<metadata>
<instanceId>foo-app-f4ea7b06fc03a05a06900713f7526a5d</instanceId>
</metadata>
...
</instance>
在这种情况下,cancel
cURL 命令将如下所示:
$ curl -X "DELETE" http://eureka_host:eureka_port/eureka/apps/FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d
这将按预期取消注册实例。
就是说, 我必须承认我没有太注意 Eureka 服务器日志。当您注册 Eureka 客户端时,日志会打印出实例的完全限定名称 (FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d
),我可以将其用作我的猜测。
我希望有人在 Eureka documentation 中解决这个问题。