文章目录
- consul注册中心服务All service checks failing
- 问题一:能注册,有报错,中间件不可用
- 问题二:能注册,没报错,通不过检查
- 问题三:同一个服务,注册了很多次
consul注册中心服务All service checks failing
问题一:能注册,有报错,中间件不可用
- 现象:服务已启动,可以访问,但是注册中心里红叉
All service checks failing
- 原因:大多数情况下是程序有报错
- 首先去查看服务的启动日志,看看有没有报错,如果启动日志有明显报错,对应解决即可
- 大多数为配置文件设置的某个中间件连接不了,检查不通过
- 例如
redis
服务连接失败、数据库连接失败、kafka
连接失败,都遇到过
- 解决:将所有依赖的中间件,启动起来,保证可以正常访问即可
问题二:能注册,没报错,通不过检查
-
现象:这是一个新增的微服务,调用第三方服务的
SDK
提供服务,由于只有windows
版本SDK
,所以该服务只能在windows
系统里部署,而consul
注册中心在linux
里面,网络已打通。windows
里的单体微服务已启动,启动日志也没有任何报错信息,注册成功。服务接口能正常调用,但是注册中心红叉,校验不通过All service checks failing
-
原因:查看了注册中心的信息,发现健康检查的地址不对,是一个内网地址(
192.168.1.x
),windows
机器有多个网卡,取了机器的其中一个ip
地址,没取实际的连接地址(183.169.xxx.xx
),导致健康检查时http
访问不通
-
解决:在配置文件里,直接指定健康检查地址,将可访问的本机ip设置进去,即可
spring:cloud:consul:discovery:health-check-url: http://183.169.xxx.xx:xxxx/management/health
问题三:同一个服务,注册了很多次
- 现象:服务重启后,新增了一个微服务,之前的服务也没有从注册中心移除,而且健康状态也是绿色
- 原因:instantId不同,注册中心服务监测使用的url是一样的
-
服务的instantId,加了随机数,所以每次启动服务都会生成一个新的instantId
-
虽然instantId不同,但是注册中心服务监测使用的url都是一样的
-
在同一台机器上反复重启,就会增加很多instantId不同的该服务加入注册中心,而监测使用的url是一样的,则最新的服务启动成功后,注册中心监测是通过的,其余的
-
原有配置
-
spring:cloud:consul:discovery:healthCheckPath: /management/healthinstanceId: data-analysis:${spring.application.instance-id:${random.value}}service-name: data-analysis
- 服务名相同,instantId不同的服务,都加入了注册中心,且都检查最新的微服务
- 解决:去除随机数即可
- 注释掉instanceId一行,使用ip端口号生成
服务名-ip地址-端口号
,保证instance-id
在需要一致(ip端口相同)时保持一致即可 - 增加
heartbeat.enabled=true
,使用ttl
方式心跳监测服务监控状态 - 修改后的配置
- 注释掉instanceId一行,使用ip端口号生成
spring:cloud:consul:discovery:healthCheckPath: /management/healthinstance-id: ${spring.application.name}-${spring.cloud.client.ip-address}-${server.port}service-name: ${spring.application.name}heartbeat:enabled: true # 为true使用 ttl 方式,默认false使用 http 方式
注意:${spring.cloud.client.*} 是利用了Spring Boot配置文件可以读取环境变量的特点,应用需要集成Spring Boot Actuator。