consul 接入注意事项

consul, spring cloud,

Posted by Deadline on July 17, 2020

团队准备从 spring boot 单体应用向 spring cloud 演进,对于注册中心的选型最终确定使用 consul。

本片文章就说说接入 consul 需要注意的事项。

常用配置项

#consul 服务端地址
spring.cloud.consul.host = xxxxx:8500
#是否使用 ip 地址,默认 false
spring.cloud.consul.discovery.prefer-ip-address = true
#实例 id 名
spring.cloud.consul.discovery.instance-id = ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

# 健康检测时间间隔
spring.cloud.consul.discovery.health-check-interval = 120s

#健康检测 path
spring.cloud.consul.discovery.healthCheckPath=/${server.servlet.context-path}/actuator/health

spring.cloud.consul.discovery.prefer-ip-address

默认情况下是使用主机名注册的,但是不一定能用主机名连接到服务实例,所以个人偏好使用 ip ,而且 ip 更方便识别主机。

spring.cloud.consul.discovery.instance-id

默认情况下注册的实例名是 {application.name}-{server.port},单机单实例情况下是没问题的。但是生产环境一般是多实例,那么就后面注册的实例就会覆盖掉前面已经注册的实例,意味着这个服务一直都只有一个实例。因为实例名是唯一的,所以解决办法是将应用名+ip+port,拼接起来。这样多机器情况下,也不会覆盖掉前面的实例了。

我第一生产上线的时候就碰到了这个奇怪的问题,始终就只有一个实例,中间还试过加随机数的方式,但是发现会出现新的问题。就是强制关闭应用的时候之前的实例不会下线。比如服务器用的是 centos7,正常情况下用 kill 命令结束应用的话会正常注销实例,但是用了 kill -9 实例就不会自动注销,然后下次启动的时候又生成了一个随机数,就导致实例会越来越多!

如果想把之前多余的实例注销,可以使用 consul deregister 命令 ,

curl -L -X PUT 'http://consul-server-ip:port/v1/agent/service/deregister/instance-id'

spring.cloud.consul.discovery.health-check-interval

健康监测间隔,默认 10s

spring.cloud.consul.discovery.healthCheckPath 健康检测路径

如果使用了 actuator ,因为默认用的就是 actuator healthCheck。没使用 actuator 的话就要指定了。

还有种情况就是配置了 server.servlet.context-path ,那就要在默认 actuator 地址前面拼接上,要不然 url 就不对了。

other

早之前,老项目想先接入 consul ,作为统计应用服务实例,只是注册上去,为了方便统计什么服务有哪些机器,这些机器的 ip 和端口是啥。但是又不想去改原来的代码集成 consul discovery jar。

后来就曲线救国,在机器上安装一个 consul jar ,让这个 jar 去 check 应用。


There are no comments on this post.