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 客户端

Java Spring 在作为 Docker 容器运行时不会与 Consul 对话

Docker - 使用Consul组合动态分配的端口

Spring Cloud Consul

Spring Cloud Consul 健康检查配置