Spring Cloud Consul
是HashiCorp
( Vagrant
的创建者)开发的一个服务发现与配置项目,与Docker
容器可以无缝集成。Consul
是一套开源的分布式服务发现和配置管理系统,支持多数据中心分布式高可用。用Go
语言开发,基于 Mozilla Public License 2.0
的协议开源。
Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性:
1.服务发现Consul
的客户端可用提供一个服务,比如 api
或者mysql
,另外一些客户端可用使用Consul
去发现一个指定服务的提供者.通过DNS
或者HTTP
应用程序可用很容易的找到他所依赖的服务。
2.健康检查Consul
客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%).这个信息可由operator
用来监视集群的健康.被服务发现组件用来避免将流量发送到不健康的主机。
3.Key/Value存储
应用程序可用根据自己的需要使用Consul
的层级的Key/Value
存储
比如动态配置,功能标记,协调,领袖选举等等,简单的HTTP API让他更易于使用。
4.多数据中心Consul
支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。
Consul服务端安装
由于Spring Cloud Consul
由HashiCorp
公司开发,并不是开发Spring
的Pivotal
团队,所以下载Consul
官方的服务端
Consul官网地址:https://www.consul.io/
Consul服务端下载地址:https://www.consul.io/downloads.html
对应自己的操作系统选择下载
进行环境变量配置
在系统变量Path
下加上解压的根目录
例如解压的是E盘下consul
文件夹就写E:\consul
验证是否配置成功
在cmd
中输入consul
出现以上信息就是配置成功了
启动服务端
windows
系统在cmd
下输入consul agent -dev
看到以下界面就是启动成功,
如果启动不了可以在cmd
进入到consul
根目录再输入consul agent -dev
需要关闭服务端在
cmd
中按Ctrl+C
就好了
成功启动会
Consul
代理输出了一些日志信息。例如版本号,端口号(默认是8500)
在浏览器中输入http://localhost:8500/可以进入到consul服务注册中心
的界面(强烈推荐使用谷歌浏览器)
SpringCloud与Consul客户端集成
引入Spring Cloud Consul
服务发现依赖和web依赖(不然注册不了)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在启动类中加上@EnableDiscoveryClient
注解
@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudConsulApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudConsulApplication.class, args);
}
}
在配置文件中加入Spring Cloud Consul
相关配置
spring:
cloud:
consul:
host: localhost
port: 8500
application:
name: springcloud-consul
server:
port: 9999
刷新下服务注册中心的页面
可以发现服务是注册上去了,但是服务状态为critical
,说明这个服务还是失败的
Consul规定了外部脚本退出码代表的语义:
正常passing
告警warning
失败critical
解决方法:
1.需要手动加一个GET方法的健康检测API
@RestController
public class HealthApi {
@GetMapping("/health")
public String health(){
return "hello consul";
}
}
然后在配置文件中加上spring.cloud.consul.discovery.health-check-path
的路径
spring:
cloud:
consul:
host: localhost
port: 8500
discovery:
health-check-path: /health
application:
name: springcloud-consul
server:
port: 9999
重新启动客户端
可以看到我们注册的服务已经
passing
通过了,说明服务注册成功其实在
cmd
上也可以看到
在
Service 'springcloud-consul' check
中可以看到我们自定义的健康检测和返回结果
Consul
用于检查运行状况端点的间隔默认是10s,每过10秒检测一次
2.加入actuator
依赖(推荐使用)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
不需要改spring.cloud.consul.discovery.health-check-path
,
默认的就行,默认是/actuator/health
。
通过健康检测可以看到服务状态是
UP
,服务已经注册到Consul
上