Docker 中的 Consul 和 Spring Boot 服务 - 不取消注册
Posted
技术标签:
【中文标题】Docker 中的 Consul 和 Spring Boot 服务 - 不取消注册【英文标题】:Consul and Spring Boot services in Docker - not deregistering 【发布时间】:2017-09-04 22:07:50 【问题描述】:所以我们有使用 Spring-Boot 编写的 Java 微服务,使用 Consul 进行服务发现和配置管理,并在 Docker 容器中运行。所有这些都在工作,但是当一个容器死掉或一个服务重新启动时,旧的服务 ID 永远不会在 Consul 中消失,并且服务在 Consul UI 中显示为“失败”之后永远不会消失,即使新容器已经注册并显示了所有绿色。
我们没有使用心跳 - 但我找不到太多关于 Consul 的心跳和健康检查之间的区别的文档。
这是我的 bootstrp.yml
spring:
application:
name: my-service
cloud:
config:
enabled: false
consul:
host: $discovery.host:localhost
port: $discovery.port:8500
config:
watch:
wait-time: 30
delay: 10000
profile-separator: "-"
format: FILES
discovery:
prefer-ip-address: true
instanceId: $spring.application.name:$spring.application.instance_id:$random.value
还有其他设置可以启用心跳,但文档说这会给 Consul 集群带来更多压力。
有没有人设法让 Consul 和 Spring Boot/Docker 服务自动注销?它实际上并没有引起任何实际问题,但它使 Consul UI 在实际监控 up/down 服务方面毫无用处。
【问题讨论】:
也许这个有帮助:***.com/questions/32259323/… 【参考方案1】:Consul 不会自动注销服务。
有关同一问题的提示,请参阅 https://groups.google.com/forum/#!topic/consul-tool/slV5xfWRpEE。根据该线程,您需要更新配置或执行Agent API call。由于代理是事实来源,因此您不应尝试通过目录 API 进行更新。有关详细信息,请参阅GitHub。他们还在 Google 小组中提到,如果节点正常关闭,您不一定必须取消注册服务,但这似乎不是您的用例。
请查看 Consul not deregistering zombie services 以获取有关使用 api 或 registrator 等工具自动注销服务的提示。
【讨论】:
【参考方案2】:您提到您正在使用 docker 容器来运行微服务。您是否在 docker 容器的入口点脚本中捕获 SIGTERM ?如果发送了 SIGTERM,启动应用程序会收到它,您将看到以下日志显示微服务正在向 Consul 取消注册。
2017-04-27 09:20:19.854 INFO 6852 --- [on(6)-127.0.0.1] inMXBeanRegistrar$SpringApplicationAdmin : Application shutdown requested.
2017-04-27 09:20:19.857 INFO 6852 --- [on(6)-127.0.0.1] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@afb5821: startup date [Thu Apr 27 09:20:00 EDT 2017]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@130c12b7
2017-04-27 09:20:19.859 INFO 6852 --- [on(6)-127.0.0.1] o.s.c.support.DefaultLifecycleProcessor : Stopping beans in phase 2147483647
2017-04-27 09:20:19.863 INFO 6852 --- [on(6)-127.0.0.1] o.s.c.support.DefaultLifecycleProcessor : Stopping beans in phase 0
2017-04-27 09:20:19.863 INFO 6852 --- [on(6)-127.0.0.1] o.s.c.c.s.ConsulServiceRegistry : Deregistering service with consul: xxxxxxxxxxxxx
This blog post discusses this.
【讨论】:
是的,我也是这么想的,但在我的日志中,我确实看到了“正在向 Consul 取消注册......”信息消息。 @Gandalf 你在你的 Dockerfile 中使用这个表单吗? CMD exec java -jar microservice.jar 在我的 consul/docker/spring-boot 设置中,服务已正确注销。不同的是,我没有领事代理。我的微服务直接与处于引导模式的领事服务器对话。以上是关于Docker 中的 Consul 和 Spring Boot 服务 - 不取消注册的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Consul 和 Consul Clients dockerized
Consul on Docker Swarm 与 Spring Boot 客户端