我正在使用 consul 客户端从我的 junit 测试中注销服务。我正在使用 vert-consul-client。我正在使用的 consul 版本是 1.11.1。该服务未向 consul 注册,但只是测试如果我们尝试注销未注册的服务会发生什么。
从日志中我得到这个错误
Status message: 'Not Found'. Body: 'Unknown service "BadService"'
奇怪的是,当测试 1.10.6 领事版本时,我没有得到这个错误。
如果你能帮忙谢谢
奇怪的是,当测试 1.10.6 领事版本时,我没有得到这个错误。
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 T
Content-Length: 0
PRhashicorp/consul#10632在 Consul 1.11.0 中更改了此行为,其中,如果服务不存在,Consul 现在将返回 HTTP 404 响应代码,而不管是否启用了 ACL。(请参阅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 T
Content-Length: 22
Content-Type: text/plain; cht=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/ConsulImpl.java#L1320-L1333)。
有趣的是,在 Consul 1.10.x 中,当在集群上启用 ACL时,Consul 将使用 HTTP 500 错误代码和相应的错误消息而不是 200 响应代码进行回复。这是因为启用 ACL 后,vetServiceUpdateWithAuthorizer
函数不会过早返回 (if authz == nil { return nil }
),而是继续检查服务是否存在,然后引发错误,因为它不存在 (a>)。
$ 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 T
Content-Length: 22
Content-Type: text/plain; cht=utf-8
Unknown service "test"
如果您测试了启用 ACL 的 1.10.6,您也会收到与 1.11.1 类似的错误。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(64条)