Spring启动应用程序的Consul服务发现问题

时间:2016-07-25 11:39:48

标签: spring-boot cloudfoundry spring-cloud consul

根据此博客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服务器的正确提供的主机和端口将服务部署到Cloud Foundry时(基于Consul)在' bootstrap'阶段加载PropertySource:

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

Consul正在注册该服务,但处于严重状态(失败)!

感谢任何帮助或指导。

由于

1 个答案:

答案 0 :(得分:2)

该问题与Consul运行状况检查默认路径有关,该路径设置为/ health端点。 因此,在所有客户端应用程序(Web服务器和微服务)中启用弹簧执行器后,此问题已得到解决。

或者您可以更改bootstrap.yml文件中的默认Consul运行状况检查端点:

  cloud:
    consul:
      discovery:
        healthCheckPath: /test

NB。要在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)时,应该将部署的应用程序的URI提供给Consul以进行服务发现过程(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
  

NB。 Consul使用instanceId来注册应用程序   (微服务)实例。