天天看点

spring cloud实战(三)consulConsul 介绍开始使用Consul开发联调

Consul 介绍

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。

开始使用Consul

在开始使用Consul前,需要有一个consul server服务注册中心。本文假设consul server服务已经在localhost:8500启动。

  1. 在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>
           
  1. 在配置文件中添加如下内容:
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/)。

正常情况下我们应该可以从控制台看到我们的服务。

spring cloud实战(三)consulConsul 介绍开始使用Consul开发联调

服务注册失败

spring cloud实战(三)consulConsul 介绍开始使用Consul开发联调

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可以在控制台看到。

spring cloud实战(三)consulConsul 介绍开始使用Consul开发联调

springcloud(十三):注册中心 Consul 使用详解: http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html

服务注册发现consul之五:Consul移除失效服务的正确姿势: https://www.cnblogs.com/duanxz/p/6678694.html

继续阅读