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

news2024/11/26 17:32:31

一、背景

由于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: consulMicroservice
  profiles:
    active: dev
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        healthCheckPath: /management/health
        instanceId: consulmicroservice:${spring.application.instance-id:${random.value}}
        service-name: consulmicroservice
        prefer-ip-address: true

#consul健康检查需要开启actuator的health断点
management:
  endpoints:
    web:
      base-path: /management
      exposure:
        include:
          - health
5. bootstrap.yml添加consul配置中心的相关配置 
spring:
  application:
    name: consulMicroservice
  profiles:
    active: dev
  cloud:
    consul:
      config:
        fail-fast: false # if not in "prod" profile, do not force to use Spring Cloud Config
        format: yaml
        profile-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
          # 刷新频率,单位:毫秒,默认值1000
          delay: 1000
      discovery:
        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: localhost
      port: 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.coloradmin.cn/o/1845487.html

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

相关文章

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

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

【CT】LeetCode手撕—300. 最长递增子序列

目录 题目1- 思路2- 实现⭐300. 最长递增子序列——题解思路 3- ACM 实现 题目 原题连接&#xff1a;300. 最长递增子序列 1- 思路 模式识别&#xff1a;最长递增子序列——> 利用动规五部曲 解决 ——> 借助 i 和 j 指针&#xff0c;其中 j < i 动规五部曲 1.定义…

深入理解和实现Windows进程间通信(管道)

进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;是指在不同进程之间的数据传输。进程是操作系统分配资源和调度的独立单位&#xff0c;每个进程都有自己独立的地址空间&#xff0c;一个进程无法直接访问另一个进程的数据。因此&#xff0c;当需…

【Linux】进程信号2——阻塞信号,捕捉信号

1.阻塞信号 1.1. 信号其他相关常见概念 在开始内容之前&#xff0c;先介绍一些信号的专业名词&#xff1a; 实际执行信号的处理动作称为信号递达&#xff08;Delivery&#xff09;信号从产生到递达之间的状态&#xff0c;称为信号未决&#xff08;Pending&#xff09;&#…

Numpy: np.memmap详细用法

文章目录 0. 引言1. 基本用法2. 参数说明3. 例子3.1 读取内存映射文件3.2 修改内存映射文件 4. 使用场景5. 注意事项 0. 引言 np.memmap 是 NumPy 提供的一种用于内存映射大文件的类&#xff0c;允许大文件不完全加载到内存中&#xff0c;而是通过内存映射的方式部分加载。这在…

使用 Llama 3 开源和 Elastic 构建 RAG

作者&#xff1a;Rishikesh Radhakrishnan 使用开源的 Llama 3 和 Elastic 构建 RAG Llama 3 是 Meta 最近推出的开源大型语言模型。这是 Llama 2 的后继者&#xff0c;根据已发布的指标&#xff0c;这是一个重大改进。与 Gemma 7B Instruct、Mistral 7B Instruct 等最近发布的…

用于快速充电站的 AC/DC 转换器概述

电动汽车构成了未来实现可持续交通部门的有前途技术的主要部分。AC/DC 转换器是扩展和改进 EV 功能的骨干组件。本文概述了 AC/DC 转换器、充电站类型、传统两电平 (2L) AC/DC 转换器面临的问题以及使用多电平转换器 (MLC) 的重要性。 AC/DC 充电器示意图&#xff08;&#xff…

01 Shell编程规范与变量

1、Shell脚本概述 在一些复杂的Linux维护工作中&#xff0c;大量的重复性的输入和交互操作不仅费力费时&#xff0c;而且容易出错&#xff0c;而编写一个恰到好处的Shell脚本程序&#xff0c;可以批量处理、自动化地完成一系列维护任务&#xff0c;大大减轻管理员的负担。 Sh…

我在淄博,给唐朝古树办“身份证” | 《社区开放麦》首期预告

&#xff08;预约直播&#xff09; 或许每一个男孩都曾向往成为英雄&#xff0c;时常在内心预演用魔法拯救世界的场景。而回到没有超能力的现实生活&#xff0c;平凡人即便只有一技之长&#xff0c;也能拥有属于自己的“高光时刻”。 在开源社区&#xff0c;有这样一位青年对…

【机器学习 复习】第2章 线性回归及最大熵模型

一、概念 1.回归就是用一条曲线对数据点进行拟合&#xff0c;该曲线称为最佳拟合曲线&#xff0c;这个拟合过程称为回归。 2.一个自变量 叫 一元线性回归&#xff0c;大于一个自变量 叫 多元线性回归。 &#xff08;1&#xff09;多元回归&#xff1a;两个x&#xff0c;一个…

idea解决git代码冲突,提交代码冲突如何有效解决

当在提交代码的时候遇到问题冲突&#xff0c;是已经进行git commit , 但是在 git push 的时候&#xff0c;出现提交代码问题冲突 处理方式&#xff1a; 在IDEA 左下角&#xff0c;找到git 比如在git commint 之前忘记了 git pull ,那么很容易在git push 的时候出现问题&…

简单了解MyBatis

MyBatis 1、快速入门 MyBatis中文手册官网MyBatis中文网 1.1、创建数据表添加数据 create table user(id int auto_increment primary key comment 主键id,name varchar(20) comment 姓名,age int comment 年龄,gender char(1) comment 性别&#xff08;1&#xff1a;男, 2…

AI写论文:如何结合AI工具和传统教学方法?

Sora——这个让人在24年初引爆AI圈的新产品&#xff0c;它究竟会如何改变我们的教育领域呢&#xff1f; 从gpt到Sora&#xff0c;从对话型的ai到游戏和短剧制作的新风口&#xff0c;我们从23年到24年一个接一个地被震惊&#xff01; Sora能够根据文本提示生成高质量的视频内容…

Java实现自动定时任务配置并判断当天是否需要执行示例

最近接到一个需求&#xff0c;用户要能配置一个定时循环的任务&#xff0c;就是和手机闹钟循环差不多&#xff0c;设置好比如周一、周二、周三&#xff0c;那么在这几天内这个任务就需要自动执行 需求不复杂&#xff0c;首先我需要判断当前是周几&#xff0c;当然用户说了让我…

北航数据结构与程序设计图部分选填题

一、 抓两个关键信息&#xff1a;无向图&#xff0c;邻接表。无向图中&#xff0c;边&#xff08;vi&#xff0c;vj&#xff09;要在vi的链表中记录一次&#xff0c;再以&#xff08;vj&#xff0c;vi&#xff09;的形式在vj的链表中记录一次。 每个边都要记录两次&#xff0c…

大创项目推荐 酒店评价的情感倾向分析

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 酒店评价的情感倾向分析 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/post…

qemu 安装ubuntu22.04虚拟机 -纯命令行-可ssh-带网络-编译安装 linux kernel-编译安装 kernel module

1&#xff0c;预备系统盘数据 1.1 下载光盘 注意需要 liver-server $ wget https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso 1.2 挂载并拷贝 $ sudo mkdir /mnt/iso_ubuntu-22.04.4-live-server-amd64 $ sudo mount ubuntu-22.04.4-live-ser…

采用java+B/S架构开发的工业级UWB(Ultra-Wideband)室内定系统源码UWB定位系统技术接口及技术特点

采用javaB/S架构开发的工业级UWB&#xff08;Ultra-Wideband&#xff09;室内定系统源码UWB定位系统技术接口及技术特点 UWB&#xff08;Ultra-Wideband&#xff09;定位技术本身并不直接连接蓝牙或其他无线通信技术进行定位。然而&#xff0c;在实际应用中&#xff0c;UWB定位…

RecyclerVIew->加速再减速的RecyclerVIew平滑对齐工具类SnapHelper

XML文件 ItemView的XML文件R.layout.shape_item_view <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"100dp"android:layout_heig…

Ubuntu 安装 CloudCompare

步骤&#xff1a; sudo apt install flatpakflatpak install flathub org.cloudcompare.CloudCompare此时会有报错&#xff1a; error: No remote refs found similar to ‘flathub’执行 flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.fla…