SpringCloud Config配置中心详解及环境搭建

前言

我们之前介绍并且搭建过eurekazuulhystrix组件。本节介绍的config是SpringCloud五大组件的最后一个,还有一个是Ribbon ----- 客服端负载均衡,之前我们有简单介绍过☞Eureka、Nacos注册中心及负载均衡原理,直接使用注解@LoadBalanced就可以实现负载均衡或者是网关zuul默认带有负载均衡策略、gateway使用lb。本节我们来介绍下config作用及环境搭建。

一、配置中心作用

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以也面临了一些问题:

  • 随着微服务工程的越来越多,每个工程都有一套配置文件,系统膨胀;
  • 如果每个项目都有公共的比如数据库链接信息,没有统一的管理,想要修改则需要每个工程都要修改;
  • 我们通常有很多系统环境:如prod(生产环境)、test(测试环境)、dev(预发布环境)

所以一套集中式的、动态的配置管理设施是必不可少的。

二、常见的配置中心

目前使用较多的三套配置:

  • Config+Bus

  • Nacos(后起之秀,我们之前已经介绍过了)

  • 携程阿波罗(Apollo)

三、Config的作用

  • 集中管理配置
    Spring Cloud Config 可以将应用程序的配置文件集中管理起来,以便在不同环境下轻松部署和管理应用程序。开发人员可以将配置文件存储在 Git、SVN 或本地文件系统等存储库中,并使用 Spring Cloud Config 服务器来访问和管理这些文件。

  • 多环境支持
    Spring Cloud Config 支持多环境配置文件的管理,开发人员可以将不同环境下的配置文件分别存储在不同的存储库中,并在应用程序启动时根据不同的环境加载相应的配置文件,分环境部署比如dev/test/prod/beta/release

  • 动态刷新配置
    Spring Cloud Config 还支持动态刷新配置,当应用程序运行时,开发人员可以通过调用 REST 接口来刷新配置,或者在配置中心修改配置文件后自动更新应用程序的配置。

  • 安全性控制
    Spring Cloud Config 提供了基于角色的安全性控制,开发人员可以通过配置用户角色来限制对配置文件的访问权限,确保只有授权用户才能访问敏感信息。

四、Config架构

SpringCloud Config分为服务端客户端两部分。

服务端也称为分布式配置中心,它是一个独立的微服务应用,为客户端提供配置信息,加密/解密信息等访问接口。服务器为外部配置(名称值对或等效的YAML内容)提供了基于资源的HTTP(REST接口)。

客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。
在这里插入图片描述
简单说明一下流程:

  • 把配置文件放在Git Repository中
  • Config Server从Git repository中读取配置信息
  • 其他客户端再从Config Server中加载配置文件

五、实战案例

在我们之前的eureka或者zuulhystrix项目上进行开发,省去繁琐的项目创建步骤。但各个组件之间并没有依赖关系,config也一样,完全可以新建一个项目按我的步骤开发。

项目中使用到的版本:

  • Spring Boot:2.3.12.RELEASE(2.2.X版本或者2.3.X版本)
  • Spring Cloud:Hoxton.SR1

1. 创建配置中心仓库

首先我们需要一个创建一个配置中心仓库。可以使用github或者是码云gitee。

1、在码云创建springcloud-config仓库,并创建以下两个文件:

文件命名规格:{项目名}-{配置环境版本}.yml。比如config-dev.yml,表示的是config项目的开发环境配置。

  • config-dev.yml文件:
    member:name: "张三 dev" 
    
  • config-prod.yml文件:
    member:name: "李四 prod" 
    
    在这里插入图片描述

2. 配置中心服务端搭建

新建springcloud-config模块:

2.1. 引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.2. 配置文件

bootstrap.yml【或者是application.yml】

spring:application:name: config-server  # 应用名称cloud:config:server:git:# 配置中心仓库地址uri: https://gitee.com/lin-shen/springcloud-config.git #配置文件所在仓库username: 码云用户名password: 码云密码default-label: master #配置文件分支
server:port: 9999

bootstrap.yml文件

applicaiton.yml是用户级的资源配置项,bootstrap.yml是系统级的,优先级更加高

要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的。因为bootstrap.yml是比application.yml先加载的。

Spring Cloud会创建一个“Bootstrap Context”,作为Spring应用的Application Context的父上下文。初始化的时候,Bootstrap Context负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的’Environment’。

Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。Bootstarp context 和 Application Context 有着不同的约定,所以新增了一个bootstrap.yml文件,保证Bootstrap Context和Application Context配置的分离。

2.3. 启动类

在 Application 启动类上增加相关注解 @EnableConfigServer

@SpringBootApplication
@EnableConfigServer
public class SpringcloudConfigApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudConfigApplication.class, args);}
}
2.4. 测试服务

启动SpringBoot服务,测试一下。

SpringCloud Config 有它的一套访问规则,我们通过这套规则在浏览器上直接访问就可以。

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
  • application:应用名,这里是config
  • profile:配置文件版本,比如dev、prod
  • label:git的分支,默认master

在这里插入图片描述

3. 客户端

客户端获取配置中心的配置内容。
在之前项目的provider-server模块或者是创建一个新的模块获取配置中心的相关配置:

3.1. 引入依赖
dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- spring cloud config 客户端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency>
</dependencies>

注意,客户端和服务端引入的config依赖是不一样的。

3.2. bootstrap.yml

由于配置文件的加载优先级不同,Spring Boot会尝试加载以下配置文件(按照优先级从高到低):

bootstrap.yml
application-dev.yml
application-dev.yaml
application.yml
application.yaml

高的配置生效后,低的不会生效。获取配置中心的配置,应该在bootstrap.yml配置文件中进行配置才能确保获取得到配置中心的数据。

---
spring:profiles:active: dev
---
spring:profiles: devapplication:name: configcloud:config:uri: http://localhost:9999label: masterprofile: dev
---
spring:profiles: prodapplication:name: configcloud:config:uri: http://localhost:9999label: masterprofile: prod

该配置文件指定了加载dev配置信息,会向配置中心服务端即http://locahost:9999服务发起请求获取配置,服务端则发起请求http://localhost:9999/config/dev从远程仓库获取数据返回给客户端。
在这里插入图片描述

这里遇到了一个奇怪的错误,有时候启动时,当resources文件下有其他配置文件时会干扰从远程仓库获取配置数据,即使远程仓库有member.name="张三-dev"配置也会报错,解决方法就是resources目录删除到只剩下bootstrap.yml文件。

3.3. 项目启动

访问后可以看到配置中心的配置生效。
在这里插入图片描述

3.4. 问题

我们上面提到的配置文件方式是多个配置环境写到同一个文件中,但这样维护非常繁琐,不同的环境就应该有对应的一个配置文件,但这种配置方式下配置中心的配置不生效,必须要本地文件配置member.name,不配置会报以下错误:找不到member.name属性。

Error creating bean with name ‘userController’: Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder ‘member.name’ in value “${member.name}”

在这里插入图片描述

六、实现自动刷新

Spring Cloud Config是在项目启动的时候加载的配置内容,导致了它存在一个缺陷,配置文件修改后,需要重启服务才能生效。我们在码云上修改config-dev.yml配置:

member:name: "王五-dev"

虽然访问http://localhost:9999/config/dev从之前的张三变成了王五,但是访问http://localhost:8082/user/login还是张三,说明配置没有自动刷新,可以通过 @RefreshScope 注解并结合 actuator实现自动刷新。

1. actuator方式

在这里插入图片描述

1.1. 添加依赖

客户端加入下面依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
1.2. 配置文件

在application.yml中添加如下actuator的配置

management:endpoints:web:exposure:include: refresh
1.3. 添加注解

在Controller上添加@RefreshScope注解

@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {@Value("${member.name}")private String name;@GetMapping("/login")public String login(){return "8080 " + name + " login success";}
}
1.4. 更新配置请求

当配置文件发生更改时,可以通过向应用程序发送POST请求来触发配置刷新。默认情况下,刷新端点的路径为/actuator/refresh。可以在cmd窗口使用curl命令发送POST请求:

注意:要向客户端发起请求,端口是8082,而不是服务端:9999

curl -X POST http://localhost:8082/actuator/refresh

2. SpringCloud Bus实现

上面提到的actuator方式,如果每次配置文件修改后,都需要我们主动发送post请求触发更新,这明显有点不太方便。而且如何客户端比较多的话,一个一个的手动刷新也很耗时。这个时候,我们可以借助Spring Cloud Bus的广播功能,让client端都订阅配置更新事件,当配置更新时,触发其中一个端的更新事件,Spring Cloud Bus就把此事件广播到其他订阅端,以此来达到批量更新。

Spring Cloud Bus 核心原理其实就是利用消息队列做广播,所以要先有个消息队列,目前官方支持 RabbitMQ 和 kafka。我们这里以RabbitMQ 为例。

在actuator方式配置下进行以下配置的修改

2.1. 在客户端中加入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>
2.2. 配置文件

在配置文件中进行以下配置,我们在上面说过使用RabbitMQ作为广播,rabbitmq可以参考:rabbitmq安装。

eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka
management:endpoints:web:exposure:include: bus-refresh
spring:rabbitmq:host: 127.0.0.1port: 5672username: ldhpassword: ldhcloud:bus:enabled: true
2.3. 启动客户端

启动多个客户端进行测试:
复制原来客户端:
在这里插入图片描述
端口配置:8088
在这里插入图片描述
现在我们就启动两个相同的客户端,他们的端口不同:
在这里插入图片描述

2.4. 访问服务

分别打开http://localhost:8099/user/loginhttp://localhost:8082/user/login,查看内容,然后修改码云上配置文件的内容并提交。再次访问这两个地址,数据没有变化。

在cmd窗口访问访问其中一个的 actuator/bus-refresh 地址:curl -X POST http://localhost:8082/actuator/bus-refresh

再次访问这两个地址,会看到内容都已经更新为修改后的数据了,相比actuator方式只需一次post请求即可刷新各个客户端访问服务端config的相关配置信息。

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

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

相关文章

统计学习 复习(知识点+习题)

复习资料&#xff1a;https://github.com/RuijieZhu94/StatisticalLearning_USTC 第一章 线性回归 1. From one to two 最小二乘 课后题 有偏/无偏估计 加权最小二乘 2. Regularization 线性回归&#xff08;二维情况&#xff09; 求解有约束优化问题 正则化最小加权二乘…

ByConity 社区回顾|ByConity 和开发者们一起展望未来,携手共进!

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 新年伊始&#xff0c;我们想在这里感谢一群 ByConity 社区的小伙伴们。 正是因为有社区的开发者的支持&#xff0c;截止到 2023 年底&#xff0c;ByConity GitHub …

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑥

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“ax&#xff1a;”&#xff08;x为2、3或4&#xff09;&#xff1b;其中变量x、y均须为整型。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码进行测试…

Java基础 - 黑马

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…

使用MATLAB连接USRP

文章目录 前言一、本地环境二、前期准备1、MATLAB版本、labview版本、UHD 版本对应关系2、下载 GNU Radio Companion3、确定 USRP UHD 版本①、下载一个 USRP 硬件驱动程序②、确认 MATLAB 的 UHD 版本 三、下载 USRP 通信工具箱支持包四、使用 MATLAB 连接 USRP 前言 本文记录…

F-Droid:开源Android应用的宝库

F-Droid&#xff1a;开源Android应用的宝库 引言 F-Droid是一个开源应用程序存储库&#xff0c;旨在为安卓用户提供自由、隐私和安全的应用程序。它最初于2010年由Ciaran Gultnieks创建&#xff0c;因为他认为Google Play Store上的应用程序不够透明和安全。F-Droid的目标是为…

Web3与环保:区块链如何推动可持续发展

随着气候变化和环境问题日益严峻&#xff0c;社会对可持续发展的需求变得愈发迫切。在这个背景下&#xff0c;Web3技术和区块链崭露头角&#xff0c;成为推动可持续发展的关键力量。本文将深入探讨Web3技术如何与环保理念相结合&#xff0c;引领我们迈向更加可持续的未来。 1. …

每日一题——LeetCode1200.最小绝对差

方法一 个人方法 排序一次遍历&#xff1a; 最小差值一定是出现在大小相邻的两个元素之间&#xff0c;所以将数组从小到大排序 循环求两元素之间的差值&#xff0c;先假设当前差值为最小差值&#xff0c;先往res数组里面push数据&#xff0c;当碰到更小差值的时候&#xff0c…

VS 中调用调试DLL库的方法

前提条件&#xff1a; 1、当前代码是最新的&#xff0c;并且编译成dll的库有程序使用。 2、打开运行dll库的程序。 配置步骤&#xff1a; 1、使用VS打开要调试的dll库项目。 2、点击调试菜单展开调试菜单。 3、点击附加到进程&#xff0c;弹出配置框。 4、在配置框中选…

学习笔记-数据库概念介绍

一.数据库概述 1.数据库: 存储数据的仓库,本质是一个文件系统. 用户可以对数据库中的数据进行 增加,修改,删除以及查询操作 2.特点 可以结构化存储大量的数据可以有效的保持数据的一致性,完整性读写效率高 3.常用数据库 二.数据库分类及其常用 关系型数据库 指的是二维表格…

【51单片机系列】51单片机的中断系统使用总结一

本文是在学习51单片机的中断系统的简单性总结&#xff0c;着重于51单片机的中断系统的工作原理及如何使用。 文章目录 一、中断原理简单介绍二、 外部中断相关介绍2.1 与外部中断相关的寄存器2.2、外部中断0使用示例2.3、外部中断1使用示例 三、定时器中断相关介绍3.1、51单片机…

基于Ubuntu22.04部署生产级K8S集群v1.27(规划和核心组件部署篇)

本文档主要根据k8s官网文档和其插件的官网文档&#xff0c;参考部分他人优秀经验&#xff0c;在实际操作中逐渐完成&#xff0c;比较详尽&#xff0c;适合在境内学习者和实践者参考。 实操环境基于VMware Workstation 17 pro&#xff0c;采用ubuntu22.04操作系统&#xff08;有…

链接全域直播产业经济,天府锋巢直播产业基地10层正式起航

100㎡-400㎡多种类型的办公户型可选 精装全包 拎包入驻 【天府锋巢直播基地】 由德商产投与无锋科技联袂打造 坐落于天府新区核心区域科学城板块 包含电商直播、娱乐直播、跨境直播 多种直播业态的全域直播基地 基地【10层】于12月初全面竣工 招&#xff5c;商 &#xff5c;火&…

中小企业如何做好信息化规划?

中小企业需不需要做信息化规划&#xff1f;什么时候做信息化规划比较好&#xff1f; 企业的信息化规划&#xff0c;一定是越早越好&#xff0c;越快越好。 因为信息化是一个过程&#xff0c;不是一个结果&#xff0c;它不是一天完成的事情&#xff0c;而是贯穿着企业经营管理…

鸿蒙应用开发学习:让page页面强制横屏

一、学习做了个适合横屏的页面但进入页面后是竖屏显示的 前几天在B站上跟着 黑马程序员的 HarmonyOS4.0开发应用教学视频学习了显式动画&#xff08;animateTo&#xff09;和属性动画&#xff08;animation&#xff09;功能&#xff0c;并参照教学视频的内容做了个小鱼动画。…

瑞_Java开发手册_(五)MySQL数据库

文章目录 (一) 建表规约(二) 索引规约(三) SQL 语句(四) ORM 映射附&#xff1a;雪花算法&#xff08;Java&#xff09; &#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的MySQL数据库篇&#xff0c;主要介绍建表规约、索引规约、SQL语句、ORM映射。由于博…

力扣hot100 路径总和Ⅲ dfs 前缀和 一题双解 超全注释

Problem: 437. 路径总和 III 思路 树的遍历 DFS 一个朴素的做法是搜索以每个节点为根的&#xff08;往下的&#xff09;所有路径&#xff0c;并对路径总和为 targetSumtargetSumtargetSum 的路径进行累加统计。 使用 dfs1 来搜索所有节点&#xff0c;复杂度为 O(n)O(n)O(n)&am…

1.IHRM人力资源后台 - 项目搭建

IHRM人力资源 - 项目搭建 文章目录 IHRM人力资源 - 项目搭建一、项目搭建1.1 项目搭建1.2 项目目录1.2.1 src 目录 1.3 App.vue 根组件解析1.4 基础设置 settings.js1.5 导航守卫 permission.js1.6 VUEX 二、 图标使用2.1 图标使用2.2 Icon 图标的解析 一、项目搭建 1.1 项目搭…

关于中考英语的一些刷题建议

怎么提高英语成绩&#xff1f; 对于英语&#xff0c;我个人认为只需要会刷题&#xff0c;多刷题就能提高&#xff0c;至于你们老师布置的关于直接背单词/语法&#xff0c;我认为提高效果并不是很明显。 为什么你从初一写到现在初三刷了这么多题&#xff0c;英语成绩还是没提高呢…

HiDataPlus 3.3.2-005 搭建(个人的一点心得体会 x86 平台)

HDP 集群搭建 前置安装 yum -y install createrepo yum install -y lrzsz yum install -y wget yum install -y vim修改当前集群机器的主机名 hostnamectl set-hostname XXX​ 这里的 XXX 就是要设置的当前机器的主机名称。主机名称是集群唯一的&#xff0c;一定不要重复&am…