Spring boot spring引导应用程序的领事服务发现问题

Spring boot spring引导应用程序的领事服务发现问题,spring-boot,cloud-foundry,spring-cloud,consul,Spring Boot,Cloud Foundry,Spring Cloud,Consul,根据这个基于eureka服务发现的博客,服务发现工作正常 但当您切换到使用Concur而不是Eureka时,服务发现不起作用,并出现以下错误: java.lang.IllegalStateException: No instances available for ACCOUNTS-SERVICE at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient

根据这个基于eureka服务发现的博客,服务发现工作正常

但当您切换到使用Concur而不是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) ...
更新:在通过提供正确的运行状况检查端点(请参见下面的答案)修复之前的错误后,将服务部署到Cloud Foundry时,在bootstrap.yml中正确提供了领事服务器的主机和端口(在“引导”阶段加载了基于领事的PropertySource):

---
春天:
个人资料:云
云:
领事:
主持人:
港口:8500
领事正在注册服务,但状态严重(失败)

如有任何帮助或指导,将不胜感激


谢谢

问题与设置为/health端点的领事健康检查默认路径有关。 因此,在所有客户端应用程序(web服务器和micro服务)中启用弹簧执行器后,此问题得到解决

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

  cloud:
    consul:
      discovery:
        healthCheckPath: /test
---
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
注意。为了在maven中启用弹簧执行器,将以下依赖项添加到pom.xml文件中:

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

org.springframework.boot

当部署(推送)到CF(CloudFoundry)时,部署的应用程序的URI应提供给Consor用于服务发现过程(CF在vcap.application.URIs环境变量中提供应用程序的URI),因此应将以下配置添加到bootsrap.yml文件中:

  cloud:
    consul:
      discovery:
        healthCheckPath: /test
---
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
---
春天:
个人资料:云
云:
领事:
主持人:
港口:8500
发现:
instanceId:${spring.application.name}:${vcap.application.application\u name}:${vcap.application.instance\u id}
主机名:${vcap.application.uris[0]}
港口:80
注意。Consor使用instanceId注册应用程序 (微服务)实例


如果服务成功注册,您是否检查了领事UI?只是为了消除注册或发现是您的问题。是的,服务失败(标记为严重)。您是否调整了健康检查?是的,感谢它与设置为/health端点的“领事”健康检查默认路径相关,因此,在启用了spring执行器之后,问题得到了解决。但是,当将服务部署到Cloud Foundry时,Concur正在注册这些服务,但是具有/health端点的临界状态(失败)!知道是什么原因吗?对于spring boot 2,运行状况检查端点是
/exactor/health
,需要在配置文件中显式地公开它,以便Consor可以访问它。