网易首页 > 网易号 > 正文 申请入驻

Spring Cloud Consul 从入门到精通

0
分享至

Consul 介绍和安装

Consul 是什么

Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,采用 Go 语言开发。

Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对。Consul 采用 Raft 一致性协议算法,来保证服务的高可用;使用 GOSSIP 协议管理成员和广播消息,并且支持 ACL 访问控制。

Consul 的使用场景

  • Docker 实例的注册与配置共享
  • 与 Consul template 服务集成,动态生成 Nginx 和 HAProxy 等配置文件
  • Spring-Cloud-Consul 服务发现和配置文件存储

Consul 的优势

  • 使用 Raft 算法来保证一致性, 比 ZooKeeper 的 Paxos 算法更简单直接。
  • 支持多数据中心,内外网的服务采用不同的端口进行监听。 ZooKeeper 和 etcd 均不提供多数据中心功能的支持。
  • 支持健康检查,etcd 不提供此功能。
  • 支持 http 和 dns 协议接口。ZooKeeper 的集成较为复杂,etcd 只支持 http 协议。
  • 官方提供 web 管理界面,etcd 无此功能。
  • Consul 1.2 新增 Service Mesh 解决方案。

Consul、ZooKeeper、etcd、Eureka 比较

启动

Consul 安装包解压完成之后就是一个可执行程序,直接运行即可。

Consul 默认启动为 dev 模式,重启后丢失数据,启动参数详解请见附录部分。

Windows

consul.exe agent -server -bootstrap -advertise 127.0.0.1 -data-dir ./data -ui

Linux

consul agent -server -bootstrap -advertise 127.0.0.1 -data-dir ./data -ui

Mac

  1. 1. 安装

    brew install consul

  2. 2. 修改 Consul 启动参数:

    vim /usr/local/opt/consul/homebrew.mxcl.consul.plist

  3. 3. 修改 ProgramArguments 部分:

    <key>ProgramArguments</key><array><string>/usr/local/opt/consul/bin/consul</string><string>agent</string><string>-server</string><string>-bootstrap</string><string>-advertise</string><string>127.0.0.1</string><string>-data-dir</string><string>./data</string><string>-ui</string></array>

  4. 4. 启动: bash brew services start consul

访问 Web 界面

我们为 Consul 添加了 -ui 启动参数,就会自动 Consul 的 Web 界面。端口默认为 8500,本地访问:http://localhost:8500/

Spring Cloud Consul

Spring Cloud Consul 项目是 Spring Cloud 针对 Consul 服务治理的实现。

提供了服务发现(可替代Eureka)和配置管理(可替代Spring Cloud Config)的功能。

服务发现

1. 使用 IDEA Spring Initalizr 创建项目(consul-demo)

添加 Consul Discovery 和 Actuator (用于 Consul 服务监控检查)依赖:

注意:Spring Boot 2.0 的变化,2.0 actuator http 默认只开启了 health 和 info,全功能开放需要添加配置。

management: endpoints: web: exposure: include: '*'

2. 新建 bootstrap.yml 配置文件

spring: application: name: consul-demo cloud: consul: host: localhost port: 8500

3. 查看 Consul web 界面可以看到 consul-demo 服务已经注册

分布式配置

Consul 提供了用于存储配置和其他元数据的 [键/值存储]。是 Spring Cloud Consul Config 的替代方案。

默认情况下,配置存储在 /config 文件夹中。根据应用程序的名称和模拟 Spring Cloud Config 顺序解析属性的活动配置文件,创建多个 PropertySource 实例。

例如,名为“consul-demo”的应用程序和“dev”配置文件将创建以下属性源:

config/consul-demo,dev/config/consul-demo/config/application,dev/config/application/

注意:application 为所有服务的通用配置。,dev 表示 dev 环境的配置。

更改依赖

想要使用 Spring Cloud Consul 的分布式配置功能,需要将 spring-cloud-starter-consul-discovery 依赖更改为 spring-cloud-starter-consul-all

注:spring-cloud-starter-consul-all 中包含了下列依赖:

<!--消息总线,提供配置实时刷新,不再依赖中间件--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-bus</artifactId></dependency><!--consul的配置中心功能--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-config</artifactId></dependency><!--服务注册和发现功能--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>

在 Consul KEY/VALUE 中添加配置

首先,在 bootstrap.yml 中添加 Consul 配置:

key spring.cloud.consul.config.format value yamlspring: cloud: consul: host: localhost port: 8500 config: format: yaml

然后:打开 Consul UI 界面添加 key/value 配置:

添加 consul-demo 服务配置:config/consul-demo/data

server: port: 8100

添加通用配置:config/application/data

配置的自动更新

Consul 中的 key/value 配置更改之后 Spring Cloud 服务端需要开启 Spring 的定时任务 watch Consul 中的配置,添加注解:@EnableScheduling

不同于 Spring cloud config 的配置更新机制(配置更新之后使用 bus 将配置变动推送给各个服务),Spring Cloud Consul 采用的是客户端定时 watch Consul 中的 key/value 变化,然后触发 Spring 的 RefreshEvent,刷新上下文。

Consul 集群搭建

Consul 集群搭建最方便的方式是采用 Docker compose。

集群说明

  1. 1. 3 server 节点(consul-server1 ~ 3)和 2 node 节点(consul-node1 ~ 2)
  2. 2. 映射本地 consul/data1 ~ 3/ 目录到 Docker 容器中,避免 Consul 集群重启后数据丢失。
  3. 3. Consul web http 端口分别为 8501、8502、8503

新建 docker-compose.yml

version: '2.0'services: consul-server1: image: consul:latest hostname: "consul-server1" ports: - "8501:8500" volumes: - ./consul/data1:/consul/data command: "agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0" consul-server2: image: consul:latest hostname: "consul-server2" ports: - "8502:8500" volumes: - ./consul/data2:/consul/data command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0" depends_on: - consul-server1 consul-server3: image: consul:latest hostname: "consul-server3" ports: - "8503:8500" volumes: - ./consul/data3:/consul/data command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0" depends_on: - consul-server1 consul-node1: image: consul:latest hostname: "consul-node1" command: "agent -join consul-server1 -disable-host-node-id" depends_on: - consul-server1 consul-node2: image: consul:latest hostname: "consul-node2" command: "agent -join consul-server1 -disable-host-node-id" depends_on: - consul-server1

集群启动时默认以 consul-server1leader,然后 server2 ~ 3 和 node1 ~ 2 加入到该集群。当 server1 出现故障下线是,server2 ~ 3 则会进行选举选出新leader

集群操作

  1. 1. 创建并启动集群:docker-compose up -d
  2. 2. 停止整个集群:docker-compose stop
  3. 3. 启动集群:docker-compose start
  4. 4. 清除整个集群:docker-compose rm(注意:需要先停止)

访问

  • http://localhost:8501
  • http://localhost:8502
  • http://localhost:8503

Consul 负载均衡

Consul 可以使用 Ngxin 来做集群的负载均衡。

设定负载均衡的服务器列表

upstream consul { server 127.0.0.1:8501; server 127.0.0.1:8502; server 127.0.0.1:8503; }

服务配置

server { listen 80; server_name consul.test.com;#服务域名,需要填写你的服务域名 location / { proxy_pass http://consul;#请求转向consul服务器列表 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

Spring Cloud 服务中 Consul 的地址填写 http://consul.test.com (你的服务域名)即可,不需要像 Eureka 中需要填写各个服务的地址,Consul 的集群轻量高效。

总结

相较于 Eureka,Consul 有着更少的资源占用能支撑更大的规模集群。

相较于 Spring Cloud Config 配置中心,使用起来没有 Git 存储的配置管理版本追溯方便,需要自己采用用数据库管理配置并同步到 Consul 的方式。

但是 Spring Cloud Consul 的配置更新方式更加简单高效。

附录

Consul 启动参数说明

启动参数说明-advertise通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址-bootstrap用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader-bootstrap-expect在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用-bind该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0-clientconsul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1-config-file明确的指定要加载哪个配置文件-config-dir配置文件目录,里面所有以.json结尾的文件都会被加载-data-dir提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在-dc该标记控制agent允许的datacenter的名称,默认是dc1-encrypt指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key-join加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败,默认agent启动时不会加入任何节点。-retry-join和join类似,但是允许你在第一次失败后进行尝试-retry-interval两次join之间的时间间隔,默认是30s-retry-max尝试重复join的次数,默认是0,也就是无限次尝试-log-levelconsul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err-node节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名-protocolconsul使用的协议版本-rejoin使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中-server定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个-syslog开启系统日志功能,只在linux/osx上生效-ui使用自带的ui-ui-dir提供存放web ui资源的路径,该目录必须是可读的-pid-file提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent

Spring Cloud Consul 配置

核心参数

配置项默认值spring.cloud.consul.enabledtruespring.cloud.consul.hostlocalhostspring.cloud.consul.port8500

服务发现参数

配置项默认值spring.cloud.consul.discovery.acl-tokenspring.cloud.consul.discovery.catalog-services-watch-delay10spring.cloud.consul.discovery.catalog-services-watch-timeout2spring.cloud.consul.discovery.datacentersspring.cloud.consul.discovery.default-query-tagspring.cloud.consul.discovery.default-zone-metadata-namezonespring.cloud.consul.discovery.deregistertruespring.cloud.consul.discovery.enabledtruespring.cloud.consul.discovery.fail-fasttruespring.cloud.consul.discovery.health-check-critical-timeoutspring.cloud.consul.discovery.health-check-interval10sspring.cloud.consul.discovery.health-check-path/actuator/healthspring.cloud.consul.discovery.health-check-timeoutspring.cloud.consul.discovery.health-check-tls-skip-verifyspring.cloud.consul.discovery.health-check-urlspring.cloud.consul.discovery.heartbeat.enabledfalsespring.cloud.consul.discovery.heartbeat.interval-ratiospring.cloud.consul.discovery.heartbeat.ttl-unitsspring.cloud.consul.discovery.heartbeat.ttl-value30spring.cloud.consul.discovery.hostnamespring.cloud.consul.discovery.instance-groupspring.cloud.consul.discovery.instance-id默认为服务名+环境+端口号spring.cloud.consul.discovery.instance-zonespring.cloud.consul.discovery.ip-addressspring.cloud.consul.discovery.lifecycle.enabledtruespring.cloud.consul.discovery.management-portspring.cloud.consul.discovery.management-suffixmanagementspring.cloud.consul.discovery.management-tagsspring.cloud.consul.discovery.portspring.cloud.consul.discovery.prefer-agent-addressfalsespring.cloud.consul.discovery.prefer-ip-addressfalsespring.cloud.consul.discovery.query-passingfalsespring.cloud.consul.discovery.registertruespring.cloud.consul.discovery.register-health-checktruespring.cloud.consul.discovery.schemehttpspring.cloud.consul.discovery.server-list-query-tagsspring.cloud.consul.discovery.service-namespring.cloud.consul.discovery.tags

配置服务参数

配置项默认值spring.cloud.consul.config.enabledtruespring.cloud.consul.config.prefixconfigspring.cloud.consul.config.default-contextapplicationspring.cloud.consul.config.profile-separator,spring.cloud.consul.config.data-keydataspring.cloud.consul.config.formatKEY_VALUE, PROPERTIES, YAML, FILESspring.cloud.consul.config.name${spring.application.name}spring.cloud.consul.config.acl-tokenspring.cloud.consul.config.fail-fastfalsespring.cloud.consul.config.watch.enabledtruespring.cloud.consul.config.watch.wait-time55spring.cloud.consul.config.watch.delay1000

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
为啥上海没有想象中那么繁华?网友:你没机会见到上海繁华的一面

为啥上海没有想象中那么繁华?网友:你没机会见到上海繁华的一面

带你感受人间冷暖
2026-04-11 00:30:08
大案纪实:沦丧的亲情,变态儿子竟向母亲伸出魔爪

大案纪实:沦丧的亲情,变态儿子竟向母亲伸出魔爪

莫地方
2026-04-04 15:06:36
怪不得这么多男明星和她传过绯闻,现实中确实惊为天人。

怪不得这么多男明星和她传过绯闻,现实中确实惊为天人。

手工制作阿歼
2026-04-09 04:26:53
定了!公积金提取限制全面取消,2026年4月1日起执行

定了!公积金提取限制全面取消,2026年4月1日起执行

甜到你心坎
2026-04-10 06:36:20
重庆亮点茶楼:一个色情帝国的崛起与崩塌

重庆亮点茶楼:一个色情帝国的崛起与崩塌

干史人
2026-04-09 22:33:24
何济霆 / 任翔宇激战 50 分钟惜败世界第一,攻防出色尽显潜力

何济霆 / 任翔宇激战 50 分钟惜败世界第一,攻防出色尽显潜力

小兰看体育
2026-04-11 21:02:20
伊美开始直接谈 双方坐在同一张桌旁!伊朗:美国同意解冻资产、在黎巴嫩停火

伊美开始直接谈 双方坐在同一张桌旁!伊朗:美国同意解冻资产、在黎巴嫩停火

每日经济新闻
2026-04-12 00:46:30
Netflix下架《边境杀手》:9.1分神作只剩7天

Netflix下架《边境杀手》:9.1分神作只剩7天

追星雷达站
2026-04-09 15:51:39
她是香港第一美女,拒绝刘德华求婚后,被家暴12年,如今还好吗?

她是香港第一美女,拒绝刘德华求婚后,被家暴12年,如今还好吗?

阿凫爱吐槽
2026-04-12 01:14:47
伊朗提出谈判两大先决条件,特朗普公布美方首要任务

伊朗提出谈判两大先决条件,特朗普公布美方首要任务

21世纪经济报道
2026-04-11 10:14:54
净身高一米八在欧美算很矮吗?网友:去西班牙尿池都比国内高

净身高一米八在欧美算很矮吗?网友:去西班牙尿池都比国内高

带你感受人间冷暖
2026-04-12 00:10:16
国家卫健委通报10起科研失信行为

国家卫健委通报10起科研失信行为

界面新闻
2026-04-09 17:01:42
重庆一三甲医院被通报:过度诊疗、过度检查、重复开药

重庆一三甲医院被通报:过度诊疗、过度检查、重复开药

鬼菜生活
2026-04-11 20:47:04
股价一年暴涨2500%!存储热潮下闪迪“升咖”:4月20日将跻身纳指100

股价一年暴涨2500%!存储热潮下闪迪“升咖”:4月20日将跻身纳指100

财联社
2026-04-11 14:24:34
新加坡网友发帖:“我接受不了自己以游客身份进入中国”。

新加坡网友发帖:“我接受不了自己以游客身份进入中国”。

荆楚寰宇文枢
2026-04-11 17:21:54
全场压制上港,残阵不影响体系运转!斯卢茨基给申花打下强队烙印

全场压制上港,残阵不影响体系运转!斯卢茨基给申花打下强队烙印

中国足球的那些事儿
2026-04-11 23:38:45
顾不上美国工厂!台积电再投1650亿美元,大陆稀土断供要怎么办?

顾不上美国工厂!台积电再投1650亿美元,大陆稀土断供要怎么办?

次元君情感
2026-04-11 07:33:49
10投狂砍21分11板4帽!这才是CBA顶级大中锋,广州靠他冲击季后赛

10投狂砍21分11板4帽!这才是CBA顶级大中锋,广州靠他冲击季后赛

老叶评球
2026-04-11 22:58:29
泽连斯基:如果美国真的考虑退出北约,英国、乌克兰必须加入欧盟

泽连斯基:如果美国真的考虑退出北约,英国、乌克兰必须加入欧盟

二大爷观世界
2026-04-11 08:56:36
扫墓才知道家里有长辈是饿死的!网友:原来荒诞的从来都只是人生

扫墓才知道家里有长辈是饿死的!网友:原来荒诞的从来都只是人生

夜深爱杂谈
2026-04-08 17:04:46
2026-04-12 01:47:00
数据人生
数据人生
人生苦短 我学Java
169文章数 2153关注度
往期回顾 全部

科技要闻

半夜被燃烧瓶砸醒,OpenAI CEO发文反思

头条要闻

霍尔木兹海峡突传大消息 特朗普最新发声

头条要闻

霍尔木兹海峡突传大消息 特朗普最新发声

体育要闻

换帅之后,他们从降级区冲到升级区

娱乐要闻

郑钧回应儿子走路:会监督他挺直腰板

财经要闻

从日本翻身看:这次谁能扛住高油价?

汽车要闻

焕新极氪007/007GT上市 限时19.39万起

态度原创

艺术
本地
游戏
亲子
房产

艺术要闻

你绝对想不到,这个国家美女竟如此多!

本地新闻

12吨巧克力有难,全网化身超级侦探添乱

排面拉满!《影之刃零》入选国家级艺术杂志

亲子要闻

孩子出现这些行为,不是早恋那么简单!

房产要闻

土地供应突然暴跌!2026海口楼市,格局大变!

无障碍浏览 进入关怀版