SpringCloud搭建微服务之Consul服务注册与发现

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依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

4.3. 配置consul访问地址

在application.yml文件中配置consul访问地址

yaml 复制代码
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提供服务的健康检查

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

问题2 :提示移除commons-logging.jar

解决:在consul依赖中移除这个依赖

xml 复制代码
<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依赖

xml 复制代码
<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>
相关推荐
小南家的青蛙12 小时前
Spring Cloud 微服务熔断限流实战
微服务
猫猫不是喵喵.2 天前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
htzyl2062 天前
别急着上微前端:从 6 个场景倒推 Module Federation 2.0 与 qiankun 2.x 的选型
前端·微服务
知守观3 天前
一个方法两个触发口:反编译 XXL-Job 后,我看清了 inner/job 子包的裸奔现状
java·spring boot·微服务
wz97543 天前
Docker 从 systemd 托管容器、overlay2 存储驱动到 Compose 多容器实战
spring cloud·docker·eureka
草莓熊Lotso4 天前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
小郎君6588 天前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·spring cloud
jktantan8 天前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
wdyan2979 天前
带着小白学习-微服务-5 实战:配置中心-数据库连接
数据库·学习·微服务
胡写代码10 天前
把数据库连接搬进配置中心,服务起不来:spring.config.import 的 4 个必填项
spring cloud·微服务