Consul 介绍
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。
开始使用Consul
在开始使用Consul前,需要有一个consul server服务注册中心。本文假设consul server服务已经在localhost:8500启动。
- 在pom.xml中引入Consul依赖,添加如下内容:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul</artifactId>
</dependency>
<!-- spring cloud consul client默认使用actuator作为健康检查断点,如果自定义端点可以不用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 在配置文件中添加如下内容:
spring:
application:
name: resource-server-1
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true
instanceId: ${spring.application.name}-${MY_POD_IP}-${server.port}
- spring cloud consul默认使用${spring.application.name}作为应用名称,Feign通过这个名称调用远程服务,所以这个变量通常需要配置。当然也可以通过spring.cloud.consul.discovery.serviceName定义个性化的名称。
- ${spring.cloud.consul.host/port}是consul server的地址和端口。一般是个公共服务,不在本地。
- spring cloud consul默认使用hostname注册健康检查的地址,比如"localhost:8080/actuator/health",这样consul server健康检查显然会失败。通过${spring.cloud.consul. prefer-ip-address}使用ip注册到consul server。
- 默认的instanceId是${spring.application.name}: ${server.port},在生产分布式服务时id会冲突,我们可以手动配置。
开发联调
服务注册与发现的机制比较复杂,我们在开发过程中会遇到各种各样的问题,需要我们有问题处理能力。我们可以访问consul server的控制台观察服务注册信息(http://localhost:8500/)。
正常情况下我们应该可以从控制台看到我们的服务。
服务注册失败
consul server通过主动调用client服务实现健康检查。当我们的springcloud什么都没有配置时,我们会看到服务成功注册了,但监控检查失败。consul server后台可能会报这样的错误:
2019/08/14 01:59:00 [WARN] agent: Check "service:resource-server-1-8081" HTTP request failed: Get http://windows10.microdone.cn:8081/actuator/health: dial tcp: lookup windows10.microdone.cn on 202.96.209.15:53: no such host
这是由于spring cloud consul默认使用hostName(“windows10.microdone.cn”) 作为健康检查注册地址。hostName无法通过DNS解析。我们需要配置通过ip地址注册:
spring.cloud.consul.discovery.prefer-ip-address=true
这个时候consul server管理界面可能会报这样的错误:
HTTP GET http://172.17.0.1:8081/actuator/health: 404
原因是“/actuator/health”地址不存在,spring cloud consul默认使用Actuator作为监控端点,我们只需要将其引入到pom.xml中即可。
配置心跳检测和健康检查
心跳检测和健康检查是两种不同的存活监控方案。
当我们配置spring.cloud.consul.discovery.heartbeat.enabled=true时,spring cloud使用心跳检查push机制定期向consul server汇报自身存活情况,逾期没有汇报则server认为异常。
当heartbeat.enabled=false时,启用健康检查机制。我们可以通过以下参数配置健康检查的间隔。
spring.cloud.consul.discovery.health-check-interval=1s
服务状态不对
在开发过程中,如果我们修改配置或服务重启,可能会发现控制台上的服务状态没有变更。这时我们可以手动删除服务,重新注册。
curl -v -X PUT localhost:8500/v1/agent/service/deregister/{instanceId}
请求地址中instanceId可以在控制台看到。
springcloud(十三):注册中心 Consul 使用详解: http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html
服务注册发现consul之五:Consul移除失效服务的正确姿势: https://www.cnblogs.com/duanxz/p/6678694.html