怎么使用Consul当配置中心和动态刷新配置

一、背景

由于Eureka官方已经正式宣布,自2.0起不再维护该项目,如果需要使用2.x,自行承担风险。

项目之前使用的Eureka,现在不维护了则需要寻找替代方案。现在Spring Cloud官方推荐Spring Cloud Consul替换Eureka作为注册中心,那么什么是Consul呢?

官网的描述:

HashiCorp Consul 是一种服务网络解决方案,可以帮助团队在本地和多云环境以及运行时之间管理服务之间的安全网络连接。Consul 提供服务发现、服务网格、流量管理和对网络基础设备的自动更新。您可以单独使用这些功能,也可以在单个 Consul 部署中将它们一起使用。

能干什么?

服务注册与发现:consul提供服务注册与发现功能,服务启动时会向consul注册自己的信息,其它服务可以通过consul来查询特定服务的信息,从而实现不同服务之间的通信。

健康检查:consul提供了多种健康检查的方式,对服务进行健康检查,确保服务能正常提供服务。如果检测到服务不再健康,consul会自动将其标记为不可用,并将流量路由到其它健康的实例。

KV存储:它提供了一个分布式的K/V存储系统,可用于配置和存储数据。也就是它能当配置中心的原因。

一致性的保证:consul使用Raft协议来确保数据的一致性,保证节点之间数据的一致。

DNS接口:提供了DNS接口,允许使用域名进行服务发现,使得服务发现变得更简单通用。

多数据中心:consul支持多个数据中心集群,支持在不同的地区部署多个consul集群,并在他们之间进行通讯和同步。

可视化界面:提供了一套可视化的页面,非常方便查看集群信息和进行相应的配置。

二、配置中心

1. 什么是配置中心?

在现在分布式系统和微服务架构中,每个服务都有自己的配置,这些配置又分为公共的配置(每个服务都相同的部分)和私有的配置(这个服务特有的部分配置)。并且在不同的环境中配置又不尽相同,例如在开发环境和生成环境的数据库配置就会不一样,如果单独对每个服务进行配置和管理会显得及其麻烦,所以集中式管理的思想就诞生了!

配置中心是一个集中管理和分发应用程序配置的系统。在现代分布式系统和微服务架构中,配置中心起着至关重要的作用,因为它能够提供一种统一的方式来管理不同服务的配置,并且支持动态更新配置而无需重启服务。

2. Spring Cloud Config配置中心

项目之前使用spring cloud config作为配置中心,但是需要配合git存储,且还需要配合Spring Cloud Bus来实现动态刷新配置,动态刷新配置这一块不是很方便。

3. Consul作为配置中心

了解到了上面提到的,K/V存储可以存储配置信息。Spring Cloud官方还声明Consul可以作为Spring Cloud Config配置中心的替代方案。并且不需要git配合,不需要集成Spring Cloud Bus即可实现动态刷新配置,它通过长轮询的方式从consul上检测到配置的变化,然后通知到客户端。所以,我们决定使consul作为配置中心。

三、实战演示

1. Consul下载

下载地址:Install | Consul | HashiCorp Developer

2. 在本地启动

启动命令如下,因为我们要做配置中心,配置要持久化,所以采用下面的方式启动,而不是consul.exe agent -dev

consul.exe agent -server -config-dir=C:/ProgramFiles/consul/config -data-dir=C:/ProgramFiles/consul/data -bind=127.0.0.1 -bootstrap-expect=1 -ui

启动成功后,访问http://localhost:8500/,如果出现下面的页面则启动成功。

3. 在pom文件中加入 SpringCloud Consul及其配置中心相关的包
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter</artifactId>
</dependency>
<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>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
4. application.yml添加consul的配置
spring:application:name: consulMicroserviceprofiles:active: devcloud:consul:host: localhostport: 8500discovery:healthCheckPath: /management/healthinstanceId: consulmicroservice:${spring.application.instance-id:${random.value}}service-name: consulmicroserviceprefer-ip-address: true#consul健康检查需要开启actuator的health断点
management:endpoints:web:base-path: /managementexposure:include:- health
5. bootstrap.yml添加consul配置中心的相关配置 
spring:application:name: consulMicroserviceprofiles:active: devcloud:consul:config:fail-fast: false # if not in "prod" profile, do not force to use Spring Cloud Configformat: yamlprofile-separator: '-'# 是否启用配置中心,默认值 true 开启enabled: true# 设置配置的基本文件夹,默认值config 可以理解为配置文件所在的最外层文件夹prefix: config# 设置应用的文件夹名称,默认值application 一般建议设置为微服务应用名称default-context: application# Consul Key/Values 中的Key, 默认为data, Value 对应整个配置文件data-key: data#name: consulMicroservice# 以上配置可以理解为:加载 config/application/下Key 为data 文件夹下公共配置 和 config/jhipsterSampleMicroservice/下Key 为data 的Value 对应的私有配置watch:# 等待(或阻塞)监视查询的秒数,默认:55秒,需要小于60,如果需要修改后立刻能读取配置,则需要修改为1秒wait-time: 55# 是否开启自动刷新,默认值true 开启enabled: true# 刷新频率,单位:毫秒,默认值1000delay: 1000discovery:tags:- profile=${spring.profiles.active}- version=#project.version#- git-version=${git.commit.id.describe:}- git-commit=${git.commit.id.abbrev:}- git-branch=${git.branch:}- context-path=${server.servlet.context-path:}host: localhostport: 8500
6. 读取本地配置-启动项目

启动成功后在本地,看到是在8080端口运行。服务也已经注册到consul上了。

7. 在consul上创建相关的配置项

官网上的文件加载顺序:

 大概的意思是,项目启动后加载配置文件的顺序如下:

  1. config/testApp,dev/
  2. config/testApp/
  3. config/application,dev/
  4. config/application/

其中,config/testApp文件夹中的配置,只适用于testApp,config/application文件夹中的配置对所有注册到consul上的服务都可用。

接下来,我按照这个结构在consul上创建文件夹config/application存放公共的配置和文件夹config/consulMicroservice用来存放consulMicroservice私有的配置。

在application文件夹中添加公共配置,比如jwt token的密钥

 在consulMicroservice文件夹中添加私有的配置,并把端口修改为8090

8. 读取配置中心的配置-启动项目

在启动项目之前,我们先加一个controller来读取config/spplication中的配置,看能否读取到。注意需要加上@RefreshScope这个注解。

@RestController
@RefreshScope
public class DynamicConfigResource {private final Logger log = LoggerFactory.getLogger(DynamicConfigResource.class);@Value("${spring.security.authentication.jwt.base64-secret:null}")private String jwtKey;@GetMapping("/jwt")public String getConfigValues() {log.info("JWT Key: {}", jwtKey);return "jwt Config: " + jwtKey;}
}

项目启动之后,我们可以看在在8090端口上运行,说明成功加载了配置中心config/consulMicroservice中的配置数据。

接下来我们继续测试,能否读取到config/spplication中的公共配置。浏览器中访问:http://localhost:8090/jwt

将配置中心中公共配置打印出来了,说明也成功的读取到了config/application中的数据。

9. 配置动态刷新

这对我们项目来说很重要的一个特性。当配置中心的配置发生变化时,客户端能够获取到最新的配置。它是通过长轮询,和下面的两个机制实现的。

  • Consul Watch机制:监视配置变化,当配置发生变化时,通知客户端。
  • @RefreshScope注解:标记需要动态刷新的Bean,当接收到刷新事件时,这些Bean会重新加载最新的配置。

首先,我们先在配置中心更新 base64-secret的值。直接在后面加"test_refresh",然后保存。

然后,我们可以看到log中输出了下面的信息,证明配置更新了。可能不会立即看到,因为默认每次轮询等待时间为55s,如果希望立刻看到变化需要修改配置:spring.cloud.consul.config.watch.wait-time = 1

接下来,我们再到浏览器中请求一下:http://localhost:8090/jwt 可以看配置已经动态刷新。

 最后,我们来总结一下动态刷新配置的原理。

Consul使用一种叫做长轮询的机制来检测配置的变化。客户端发送一个HTTP请求到Consul服务器,服务器在有新的变更发生时立即返回响应。如果在指定的wait-time内没有变化,服务器会在超时前返回一个空响应。这种机制可以减少服务器的负载,因为客户端不会频繁地发起请求,而是等待配置变更事件的发生。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE面试题汇总(九)

之间联系&#xff08;Model 和 ViewModel 的双向数据绑定&#xff09; 解析&#xff1a; MVVM 是 Model-View-ViewModel 的缩写。MVVM 是一种设计思想。Model 层代表数据模型&#xff0c;也可以在 Model 中定义数据修改和操作的业务逻辑&#xff1b;View 代表 UI 组件&#xf…

推荐5个AI辅助生成论文、降低查重率的网站【2024最新】

一、引言 对于忙碌的学生来说&#xff0c;毕业论文通常是一项艰巨的任务。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;现在有一些工具可以帮助学生轻松完成论文。本文将介绍五个免费的AI工具&#xff0c;它们能够一键帮助你生成毕业论文&#xff0c;让你的学术生…

实验一:Ubuntu系统中的USB设备绑定实验

实验一&#xff1a;Ubuntu系统中的USB设备绑定实验 一、实验目的二、实验原理三、实验环境四、实验步骤任务 1&#xff1a;绑定不同USB设备任务 2&#xff1a;绑定多个相同设ID的串口设备 五、注意事项六、拓展练习 一、实验目的 学习Ubuntu中USB设备命名方法&#xff1b;掌握…

ADI Trinamic tmc2209专为3D打印和激光雕刻打造的高性能解决方案

TMC2209-LA是专为3D打印机和激光雕刻机设计的一款高性能、超静音的两相步进电机驱动器IC。该芯片结合了Trinamic公司的先进技术&#xff0c;为设备提供了稳定、可靠且低噪音的动力驱动解决方案 TMC2209-LA与许多传统驱动器以及TMC2208-LA引脚兼容。TRINAMICS先进的StealthChop2…

springboot基于Web的社区医院管理服务系统 LW+ PPT+源码+讲解

3系统需求分析 3.1系统功能 通过前面的功能分析可以将社区医院管理服务系统的功能分为管理员、用户和医生三个部分&#xff0c;系统的主要功能包括首页、个人中心、用户管理、医生管理、预约医生管理、就诊信息管理、诊疗方案管理、病历信息管理、健康档案管理、费用信息管理…

数据结构_二叉树

目录 一、树型结构 二、二叉树 2.1 概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储 2.5 遍历二叉树 2.6 操作二叉树 总结 一、树型结构 树是一种非线性的数据结构&#xff0c;它是由 n(n>0) 个有限结点组成一个具有层次关系的集合&#xff0c;一棵 n 个…

中央空调水系统安装

冷热水管&#xff1a; 空调冷热水管道的材质应由业主或使用方明确&#xff1a; 1、普通焊接钢管&#xff1b; 2、无缝钢管&#xff1b; 3、镀锌钢管&#xff1b; 4、PP-R管&#xff1b; 5、紫铜管&#xff1b; 6、水管内外表面应光洁、无疵孔、裂缝、结疤、层裂或气泡。…

手摸手带你实现一个时间轴组件

这是开头 本文给大家带来一个时间轴的组件开发教程&#xff0c;话不多说&#xff0c;先看动图&#xff1a; 主要功能就是可以拖动时间轴来定位当前时间&#xff0c;可以通过鼠标滚轮来修改当前时间分辨率&#xff0c;也支持显示时间段功能&#xff0c;动图未体现&#xff0c;可…

华为手机怎么找回删除的照片?掌握3个方法,恢复不是梦

由于误删、设备故障、软件更新等原因&#xff0c;我们有时可能会不慎丢失这些宝贵的照片。当面对空空如也的相册时&#xff0c;那种失落感无法言喻。华为手机该怎么找回删除的照片呢&#xff1f;但是&#xff0c;请不要绝望&#xff01;在科技的帮助下&#xff0c;我们可以采取…

tplink安防监控raw文件转码合成mp4的方法

Tplink(深圳普联)专业的网络设备生产商&#xff0c;属于安防监控市场的后来者。Tplink的安防产品恢复了很多&#xff0c;其嵌入式文件系统也一直迭代更新。今天要说的案例比较特殊&#xff0c;其不仅仅要求恢复&#xff0c;还要求能解析出音频并且要求画面和声音实现“同步”。…

zynq qspi启动、无SD卡、格式化分区emmc、调试全过程

1 背景 使用黑金开发板&#xff0c;全部开发流程避开使用SD卡调试&#xff0c;zynq开发过程中很多资料都是基于SD启动。这样就对新板卡调试带来了一定的困难&#xff0c;因为新板卡基本上没有设计SD卡。这里就一步一步实现qspi启动内核&#xff0c;格式化分区emmc&#xff0c;…

阿里拍卖资产推荐算法 召回进展年中总结

阿里拍卖是阿里巴巴旗下拍卖平台&#xff0c;覆盖房产、机动车、土地、债权等类目。召回策略作为推荐场景的第一环&#xff0c;决定了整个推荐系统的上限&#xff0c;目前包含了包括向量召回、I2I、LBS2I、C2I等多路召回。召回的核心目标是尽可能的返回用户所有可能会感兴趣的商…

DataOps真能“降本增效”?

在各行各业中&#xff0c;越来越多的公司开始重视收集数据&#xff0c;并寻找创新方法来获得真实可行的商业成果&#xff0c;并且愿意投入大量时间和金钱来实现这一目标。 据IDC称&#xff0c;数据和分析软件及云服务市场规模在 2021 年达到了 900 亿美元&#xff0c;随着企业继…

CSDN自定义模块全攻略,DIY系统原有样式打造专属个性化主页!

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f4af;如何通过HTMLCSS自定义模板diy出自己的个性化csdn主页&#x…

明日开考!2024年全国青少年人工智能创新挑战赛及真题

Scratch实验室2024-06-21讯 2024年全国青少年人工智能创新挑战赛【编程创作与信息学专项赛】第二轮将在明天&#xff08;2024年6月22日&#xff09;举行&#xff0c;请参加的同学积极备考&#xff0c;参加选拔赛的青少年需通过“人工智能创新挑战赛”专题页面点击“参加选拔赛”…

RocketMQ快速入门:集成spring, springboot实现各类消息消费(七)附带源码

0. 引言 rocketmq支持两种消费模式&#xff1a;pull和push&#xff0c;在实际开发中这两种模式分别是如何实现的呢&#xff0c;在spring框架和springboot框架中集成有什么差异&#xff1f;今天我们一起来探究这两个问题。 1. java client实现消息消费 1、添加依赖 <depen…

正定矩阵(Positive Definite Matrix)

正定矩阵&#xff08;Positive Definite Matrix&#xff09; flyfish Positive&#xff08;正数&#xff09; &#xff1a;在数学和统计学中&#xff0c;通常指大于零的数。在矩阵理论中&#xff0c;一个矩阵被称为正定&#xff0c;是因为它的性质类似于正数的性质。 Defini…

裁员裁到大动脉,是一种什么体验!

大家好啊&#xff0c;我是董董灿。 降本增效是每个当老板的人都喜欢挂在嘴边的口头禅&#xff0c;尤其是行业不景气&#xff0c;公司发展遇到瓶颈的时候。 大部分公司降本增效的手段其实非常相似&#xff0c;比较容易实施的手段也就那几种。 要么搞设备自动化和流程自动化&a…

Anthropic 发布新AI模型Claude 3.5 Sonnet

&#x1f989; AI新闻 &#x1f680; Anthropic 发布新AI模型Claude 3.5 Sonnet 摘要&#xff1a;Anthropic 发布了其最强 AI 模型 Claude 3.5 Sonnet。速度更快、处理细微差别和幽默的能力提升&#xff0c;且支持编写、编辑和执行代码。该模型通过公司网站、iPhone 应用及 A…

数据库系统概念(第八周 第一堂)(规范化关系数据库设计)(强推学习!!!)

目录 前言 E-R模型质量低的深层原因 数据依赖 函数依赖 主属性/非主属性 逻辑蕴含与闭包 Armstrongs Axiom 求解F闭包算法 求解属性集闭包算法 属性集闭包的作用 候选码求解理论和算法 候选码求解理论 无关属性 检验方法 正则覆盖 关系模式的设计 关系…