试图从不工作的咨询中注销服务?

trying to deregister a service from consult not working?

我正在使用 consul 客户端从我的 junit 测试中注销服务。我正在使用 vert-consul-client 。我使用的领事版本是 1.11.1 。该服务未向 consul 注册,只是测试如果我们尝试注销未注册的服务会发生什么。

从日志中我得到这个错误

Status message: 'Not Found'. Body: 'Unknown service "BadService"'

奇怪的是,我在使用 1.10.6 consul 版本进行测试时没有收到此错误。

如果您能提供帮助,我们将不胜感激 谢谢

strangely i dont get this error when testing with 1.10.6 consul version.

Consul 最近更改了在尝试注销不存在的服务时发送的 HTTP 响应代码。

在 Consul 1.11.0 之前,当 ACLs 被禁用时,Consul 在取消注册一个不存在的服务时会使用 HTTP 200 响应代码进行响应并且没有响应主体。

$ curl --include \
       --request PUT http://localhost:8500/v1/agent/service/deregister/test
HTTP/1.1 200 OK
Vary: Accept-Encoding
X-Consul-Default-Acl-Policy: allow
Date: Wed, 05 Jan 2022 03:07:35 GMT
Content-Length: 0

此行为已在 Consul 1.11.0 中由 PR hashicorp/consul#10632 wherein Consul now returns a HTTP 404 response code if a service does not exist, regardless of whether ACLs are enabled. (See diff of consul/agent/acl.go) 更改。

$ curl --include \
       --request PUT http://localhost:8500/v1/agent/service/deregister/test
HTTP/1.1 404 Not Found
Vary: Accept-Encoding
X-Consul-Default-Acl-Policy: allow
Date: Wed, 05 Jan 2022 03:24:21 GMT
Content-Length: 22
Content-Type: text/plain; charset=utf-8

Unknown service "test"

与 Consul 1.10.6 通信时,您显然没有在 vertx-consul-client 中看到错误,因为 HTTP 200 代码表明请求成功,而 HTTP 404 响应正确地表明资源没有成功存在,并正确引发错误(参见 vert-consul-client/src/main/java/io/vertx/ext/consul/impl/ConsulClientImpl.java#L1320-L1333)。

有趣的是,在 Consul 1.10.x 中,当在集群上启用 ACL 时,Consul 会回复 HTTP 500 错误代码和相应的错误消息,而不是200 响应代码。这是因为当启用 ACL 时,vetServiceUpdateWithAuthorizer 函数不会过早地 return (if authz == nil { return nil }) and proceeds with checking whether service exists, then raising an error because it does not (see consul/agent/acl.go#L96-L104).

$ curl --include \
       --header "X-Consul-Token: $CONSUL_HTTP_TOKEN" \
       --request PUT http://localhost:8500/v1/agent/service/deregister/test
HTTP/1.1 500 Internal Server Error
Vary: Accept-Encoding
X-Consul-Default-Acl-Policy: deny
Date: Wed, 05 Jan 2022 03:14:52 GMT
Content-Length: 22
Content-Type: text/plain; charset=utf-8

Unknown service "test"

如果您在启用 ACL 的情况下测试了 1.10.6,您也会收到与在 1.11.1 中看到的类似的错误。