Consul服务发现在Spring Boot应用中出现问题

4
根据这篇博客 https://spring.io/blog/2015/07/14/microservices-with-spring,它基于Eureka服务发现,当服务发现正常工作时。
但是当切换到使用Consul而非Eureka时,服务发现就无法工作,并收到以下错误提示:
java.lang.IllegalStateException: No instances available for ACCOUNTS-SERVICE
at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:79)
at org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor.intercept(LoadBalancerInterceptor.java:46) ...

更新:在提供了正确的健康检查端点后(请参见下面的答案),通过在bootstrap.yml中提供Consul服务器的正确主机和端口(在“引导”阶段加载基于Consul的PropertySource),将服务部署到Cloud Foundry:

---
spring:
  profiles: cloud
  cloud:
    consul:
      host: <consul host or ip>
      port: 8500

Consul正在注册服务,但状态为关键状态(失败)!

感激任何帮助或指引。

谢谢。


1
你是否检查了Consul UI,以确认服务是否成功注册?这样可以排除注册或发现是你的问题。 - daniel.eichten
是的,该服务正在失败(被标记为关键)。 - kmarabet
1
你可能调整了健康检查吗? - daniel.eichten
是的,谢谢。这与“Consul”健康检查默认路径有关,该路径设置为/health端点,因此在启用spring-actuator后,问题得到解决。 - kmarabet
但是当将服务部署到Cloud Foundry时,Consul会将它们注册,但状态为关键状态(失败),并且具有/health端点!你有什么想法是什么原因导致的? - kmarabet
抱歉,我没有CF的经验。 - daniel.eichten
1个回答

4

出现问题与Consul健康检查默认路径有关,该路径设置为/health端点。 因此,在所有客户端应用程序(Web服务器和微服务)启用spring-actuator后,该问题得到解决。

或者您可以在bootstrap.yml文件中更改默认的Consul健康检查端点:

  cloud:
    consul:
      discovery:
        healthCheckPath: /test

注意:为了在Maven中启用Spring-Actuator,需要在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

更多信息请参见:http://cloud.spring.io/spring-cloud-consul/spring-cloud-consul.html 在部署(推送)到CF(CloudFoundry)时,应向Consul提供已部署应用程序的URI以进行服务发现过程(CF在vcap.application.uris环境变量中提供应用程序的URI),因此应将以下配置添加到bootsrap.yml文件中:
---
spring:
  profiles: cloud
  cloud:
    consul:
      host: <consul host or ip>
      port: 8500
      discovery:
        instanceId: ${spring.application.name}:${vcap.application.application_name}:${vcap.application.instance_id}
        hostname: ${vcap.application.uris[0]}
        port: 80

注意:instanceId被Consul用于注册应用程序(微服务)实例。

对于Spring Boot 2,健康检查端点是/actuator/health,需要在配置文件中显式地公开它,以便Consul可以访问它。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接