首页 文章

使用REST API将Eureka用作注册表

提问于
浏览
6

几个月以来,我们一直在使用Eureka和我们的Spring Boot应用程序 . 我们已使用 @DiscoveryClient 注释在应用程序之间启用了服务查找 . 注册,续租和注销按预期进行 .

最近,我们遇到了一个场景,我们有非Java应用程序组件(用C编写),它暴露了我们的许多Spring Boot Java应用程序将使用的3个REST服务 endpoints . 我们正在尝试查看C组件是否可以利用Eureka服务器的REST API在它出现时进行自我注册,以便Spring Boot Java应用程序可以通过Eureka执行常规查找以与C组件保持联系 .

由于我不能在C组件中使用Eureka Client(显然),我开始使用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错误 .

使用instanceId:

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

OR(hostName的结果相同):

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

我尝试了不同的组合,但我无法完成这项工作 . 我有一种感觉,我错过了一些明显的东西 - 可能是一些小事 . 任何有关这方面的帮助将不胜感激 .

PS: Eureka REST endpoints 文档在URL中提到"v2" . 但是,这在我的情况下不起作用 . 注册(适用于我)不使用"v2",如上所述 . 如果有人可以验证这一点,那也会有所帮助 . 这似乎没有足够的材料 .

1 回答

  • 10

    最后,我已经弄清楚如何使用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 . 那确实 not 工作(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 .

    这是列出在Eureka注册的活动实例的 GET 操作的示例输出:

    <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
    

    这将按预期取消注册实例 .

    That said, 我必须承认我没有太多关注Eureka服务器日志 . 当您注册Eureka客户端时,日志打印出实例的完全限定名称( FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d ),我可以将其用作我的猜测 .

    我希望有人在Eureka documentation修复此问题 .

相关问题