其他节点上的领事代理服务注册无法从 Rest API 获取,但显示在 UI

Consul Agent Service Registrations on other nodes are not fetchable from Rest API but is showing on UI

我们有一个由 3 个服务器组成的 consul 集群,并通过 Rest Api 在其中任何一个上注册代理服务。

在UI中,一个服务器的注册在其他服务器上也是可见的。例如服务器 A 上的注册在服务器 B 的 UI 上可见(可通过 http://serverb:8500/ 访问)。

然而,当通过 Rest Api 访问服务器 B 时,它只显示它自己的注册而不显示服务器 A 的注册。

服务器启动为 服务器 A consul -server -ui bootstrap-expect=1 -node=ServerA -data-dir=D:\data -bind=11.223.15.78 -client=0.0.0.0 -retry-join=11.223。 15.79 -retry-join=11.223.15.80


服务器 B
consul -server -ui bootstrap-expect=1 -node=ServerB -data-dir=D:\data -bind=11.223.15.79 -client=0.0.0.0 -retry -join=11.223.15.78 -retry-join=11.223.15.80


服务器 C
consul -server -ui bootstrap-expect=1 -node=ServerC -data-dir=D:\data -bind=11.223.15.80 -client=0.0.0.0 -retry -join=11.223.15.78 -retry-join=11.223.15.79

这是个问题还是我做错了什么?

服务的可见性将取决于您使用的 API 端点以及您注册服务的位置。 Consul 打算针对 Consul 客户端代理注册服务,该客户端代理与部署的服务位于同一主机上 运行。向数据中心中的每个代理注册的服务聚合形成服务目录 (https://www.consul.io/docs/architecture/anti-entropy#catalog)。

/catalog/services endpoint returns an aggregated list of services registered with each agent across the data center. The /agent/services 端点将仅return 针对您正在与之通信的特定本地代理注册的服务。

如果您希望客户端能够跨任何服务器注册服务,您需要使用 /catalog/register endpoint. You can optionally use a tool like Consul External Services Monitor to provide health checking for services, independently from the Consul servers. See https://www.hashicorp.com/blog/consul-and-external-services 注册它们以获取更多信息。

如果一个服务只在一个集群的一个consul节点上通过代理api注册,您仍然可以通过目录api从所有的服务中查询服务名称服务器节点:

/v1/catalog/:servicename

https://www.consul.io/api-docs/catalog#list-nodes-for-service

请注意,您需要通过代理 api 在同一个 consul 节点 上注销服务,您已经通过代理 api 在其中注册了该服务第一名。如果你只是从目录中注销它,几分钟后它就会回来(至少我的经验是这样)

Consul 文档 recommends to use the agent api for registration,所以我仍然会坚持通过代理注册 api,尽管它使注销有点棘手。