1. Consul介绍
Consul是由HashiCorp公司使用Go语言开发的一款开源工具,主要用于实现分布式系统的服务发现和服务配置,其内置了服务注册与发现框架、分布式一致性协议实现、健康检查、Key-Value存储、多数据中心方案。Consul具有高可移植性,支持Linux、Windows和Max OS X等多个操作系统,其安装包只是一个可执行文件,方便部署,也可与Docker等轻量级容器无缝配合。Consul使用Raft算法来保证一致性,相比使用Paxos算法更简单。更多详情,可以参阅Consul官网
2. 多种注册中心比较
项目 | Eureka | Consul | ETCD | Zookeeper | Nacos |
---|---|---|---|---|---|
编写语言 | Java | Go | Go | Java | Java |
客户端支持 | HTTP | HTTP、DNS | HTTP、Etcd3、gRPC | 跨语言弱,Curator组件 | HTTP、动态DNS、UDP |
服务健康检查 | 需要显示配置健康检查 | 提供详细的服务状态、内存、硬盘检查 | 连接心跳 | 长连接、Keepalive | TCP/HTTP/MySQL |
多数据中心 | 无 | 通过WAN的Gossip协议支持 | 无 | 无 | 支持单机模式、多集群模式 |
Key-Value存储 | 无 | 支持 | 支持 | 支持 | 支持 |
一致性 | 只能保证最终一致性,不能保证强一致性 | Raft | Raft | Paxos | Raft |
CAP | AP | AP | CP | CP | CP/AP |
Watch支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
自身监控 | Metrics | Metrics | Metrics | 使用第三方组件 | Metrics |
安全 | ACL | ACL/HTTPS | HTTPS | ACL | ACL/HTTPS |
Spring Cloud集成 | 支持 | 支持 | 支持 | 支持 | 支持 |
3. Consul下载与安装
3.1. Consul下载
进入Consul官网,如下图:
点击Download进入下载页面
选择适合的系统和版本,这里使用Windows系统,386对应的是32位操作系统,AMD64对应的是64位操作系统。
3.2. Consul安装
下载后解压到指定文件夹,可以看到consul.exe的文件,在安装文件路径下使用cmd命令符,使用consul --version
查看版本号
如果可看到版本号信息,表明下载的Consul安装软件适用于本安装系统,使用consul agent -dev
启动Consul
-dev 表示以开发模式运行,-server 表示以服务器模式运行
在浏览器地址栏输入http://localhost:8500/,进入Consul管理页面
4. Spring Cloud集成Consul
4.1. 版本说明
本文使用最新的SpringBoot和SpringCloud版本
JDK:17
Maven:3.9.6
SpringBoot:3.2.3
SpringCloud:2023.0.0
4.2. 引入核心依赖
在pom.xml文件中引入consul依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
4.3. 配置consul访问地址
在application.yml文件中配置consul访问地址
spring:
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true
service-name: ${spring.application.name}
4.4. 主启动类
在主启动类上添加注解@EnableDiscoveryClient
即可
4.5. 验证
启动服务,查看consul控制台页面
5. 问题处理
问题1:控制台启动成功了,Consul管理端依然提示错误
解决:在pom.xml中引入actuator依赖,这是因为consul需要actuator提供服务的健康检查
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
问题2:提示移除commons-logging.jar
解决:在consul依赖中移除这个依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
问题3:启动服务后,控制台出现大量WARN警告
解决:这是spring-cloud-commons存在的问题,将spring cloud的组件排除掉,直接引用新的commons依赖,该问题会在spring cloud下个版本中解决,到时就不需要额外引入spring-cloud-commons依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
<version>4.1.1</version>
<scope>compile</scope>
</dependency>