SpringCloud入门实战(九)- SpringCloud Config配置中心

news2024/12/26 22:27:05

📝 学技术、更要掌握学习的方法,一起学习,让进步发生
👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。
💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。
💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。
❤️ 《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。

👉🏻 👉🏻 👉🏻 SpringCloud 入门实战系列不迷路 👈🏻 👈🏻👈🏻:

  • SpringCloud 入门实战(一)什么是SpringCloud?
  • SpringCloud 入门实战(二)-SpringCloud项目搭建
  • SpringCloud 入门实战(三)-Eureka注册中心集成
  • SpringCloud入门 实战(四)-Zookeeper、Consul注册中心集成
  • SpringCloud入门实战(五)-Ribbon负载均衡集成
  • SpringCloud入门实战(六)-OpenFeign服务调用集成
  • SpringCloud入门实战(七)-Hystrix入门简介
  • SpringCloud入门实战(七)-Hystrix服务降级
  • SpringCloud入门实战(七)-Hystrix服务熔断
  • SpringCloud入门实战(七)-Hystrix服务限流
  • SpringCloud入门实战(七)-Hystrix Dashboard图形化监控
  • SpringCloud入门实战(八)-Gateway服务网关集成
  • SpringCloud入门实战(九)- Config配置中心

文章目录

  • 一、SpringCloud Confg简介
    • 1、SpringCloud Confg是什么?
    • 2、为什么需要配置中心?
    • 3、常见的配置有什么?
  • 二、Config的作用
  • 三、Config的核心
  • 四、SpringCloud Config服务端配置
    • 1、新建远程仓库
    • 2、新建服务端应用
    • 3、pom中添加Config服务端依赖:
    • 4、配置文件application.yml
    • 5、主启动类添加注解@EnableConfigServer
    • 6、测试
  • 五、SpringCloud Config客户端配置
    • 1、新建客户端应用
    • 2、pom文件添加client依赖
    • 3、bootstrap.yml文件
    • 4、启动类
    • 5、对外接口
    • 6、测试
  • 六、分布式配置中心动态刷新

一、SpringCloud Confg简介

1、SpringCloud Confg是什么?

SpringCloud Confg官网中如下描述:

Spring Cloud Config为分布式系统中的外部化配置提供服务器端客户端支持。使用Config Server,您可以在中心位置管理所有环境中应用程序的外部属性。客户端和服务器上的概念与Spring Environment和PropertySource抽象,因此它们非常适合Spring应用程序,但可以与以任何语言运行的任何应用程序一起使用。在应用程序从开发人员到测试人员再到生产人员的整个部署过程中,您可以管理这些环境之间的配置,并确保应用程序具有它们迁移时所需的一切。服务器存储后端的默认实现使用git,因此它可以轻松支持配置环境的标记版本,并且可以通过各种工具来访问这些内容来管理内容。添加替代实现并将其插入Spring配置很容易。
在这里插入图片描述

SpringCloud Confg中文手册

2、为什么需要配置中心?

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

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

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

3、常见的配置有什么?

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

  • Config+Bus
  • Nacos(后起之秀)
  • 携程阿波罗(Apollo)

二、Config的作用

  • 集中管理配置文件
  • 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
  • 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
  • 当配置发生变动时,服务不需更重启即可感知到配置的变化,并应用新的配置
  • 将配置信息以REST接口的形式暴露

三、Config的核心

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

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

定位资源的默认策略:Spring Cloud Config服务器从git存储库(必须提供)为远程客户端提供配置,例:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo

HTTP服务具有以下格式的资源,也就是配置读取规则(url路径):

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

可见资源由三个变量参数化:
label: 分支(branch),是可选的git标签(默认为“master”)
name/application: 服务名
profiles:环境(dev/test/prod)

读取配置文件信息返回的是 json格式。不存在的配置访问结果为{} 空。

由于SpringCloud Config默认使用Git来存储配置文件(也有其他方式,比如SVN和本地文件),但最推荐使用的还是Git,而且使用的是http/https访问的形式。这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。

客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。

四、SpringCloud Config服务端配置

1、新建远程仓库

远程仓库随便添加个配置文件测试

2、新建服务端应用

3、pom中添加Config服务端依赖:

   <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
  </dependency>

完整pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <!-- log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>
        <!-- devtools热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>

4、配置文件application.yml

server:
  port: 1234
spring:
  application:
    name: cloud-config #微服务应用的名字
  cloud:
    config:
      server:
        git:
          uri: https://gitlab.com/springcloud5521407/springcloud-config.git # git 码云的仓库地址
          search-paths:
            - config  # 搜索目录
      label: main  # 读取分支
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

5、主启动类添加注解@EnableConfigServer

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class,args);
    }
}

6、测试

启动注册中心和cloud-config微服务。
访问:http://localhost:1234/main/config-dev.yml输出了github配置文件内容

Config服务端已经成功访问远程github上内容。

五、SpringCloud Config客户端配置

1、新建客户端应用

2、pom文件添加client依赖

 <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-client</artifactId>
 </dependency>

3、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配置的分离。

bootstrap.yml:

server:
  port: 1235
spring:
  application:
    name: cloud-config-client
  cloud:
    ## config 客户端配置
    config:
      ## 分支名称
      label: main
      ## 配置文件名称前部分
      name: config
      ## 配置文件名称后部分
      profile: dev
      ## 配置中心地址
      uri: http://localhost:1234

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

4、启动类

@SpringBootApplication
@EnableEurekaClient
 public class ConfigClientApplication {
     public static void main(String[] args) {
         SpringApplication.run(ConfigClientApplication.class, args);
}
 

5、对外接口

 @RestController
 public class ConfigClientController {
     @Value("${config.info}")
     String configInfo;
 
     @GetMapping("configInfo")
     public String getConfigInfo() {
         return configInfo;
    }
 }

6、测试

如果启动报错:

14:57:15.781 [restartedMain] DEBUG org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - Application failed to start due to an exception
org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor$ImportException: No spring.config.import set
	at org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor.postProcessEnvironment(ConfigDataMissingEnvironmentPostProcessor.java:82)
	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)

则是因为Spring Cloud 新版本默认将 Bootstrap 禁用,需要将 spring-cloud-starter-bootstrap 依赖引入到工程中:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

访问:http://localhost:1235/configInfo

六、分布式配置中心动态刷新

修改远程配置仓库中的配置,那config的服务端和客户端会立刻获得更新的内容吗?

修改github内容,再次访问,查看是否读取到最新修改内容:
http://localhost:1234/main/config-dev.yml -->能(ConfigServer配置中心立刻响应)
http://localhost:1235/configInfo -->不能(ConfigClient客户端没有任何响应)–>需要重启或者重新加载


那如何能够修改配置,客户端不需要重启呢?

常用的配置刷新手段:
1.重启用户服务(不建议)
2.加入依赖 actuator,提供一个刷新配置的接口,通过POST请求进行动态更新
3.使用rabbitmq进行集群更新

我们这里先讲一下第二种手动刷新的方式:

1、确定是否有actuator依赖:

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>

2、Controller类添加注解@RefreshScope

@RestController
@RefreshScope
public class ConfigClientController {
    @Value("${config.info}")
    String configInfo;

    @GetMapping("configInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}

3、bootstrap.yml添加暴露监控断点配置

server:
  port: 1235
spring:
  application:
    name: cloud-config-client
  cloud:
    ## config 客户端配置
    config:
      ## 分支名称
      label: main
      ## 配置文件名称前部分
      name: config
      ## 配置文件名称后部分
      profile: dev
      ## 配置中心地址
      uri: http://localhost:1234

## 暴露监控断点
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

4、测试
执行一下: curl -X POST "http://localhost:1235/actuator/refresh"手动刷新一下


再去访问ConfigClient客户端: http://localhost:1235/configInfo 结果已经刷新。

每一次手动刷新太麻烦,那怎么动态刷新呢?结合消息总线bus下一次详细介绍。
在这里插入图片描述

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

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

相关文章

java List集合使用笔记

1、List集合的特点 有序集合、有序的序列&#xff0c;用户可以精准的控制元素插入的位置通过索引访问元素可以搜索元素与Set不同&#xff0c;List允许重复的元素存在 2、List集合特有的方法 add(索引,元素) remove(索引)&#xff1a;返回的是被删除的索引 get(索引)&#xf…

Arduino uno 环境配置 for Mac

1、IDE 在官网下载 官网地址&#xff1a;https://www.arduino.cc/en/software 看到钱&#x1f4b0;不要怕&#xff0c;只是问你捐不捐款&#xff0c;不收钱&#xff0c;你直接安装就行 &#xff08;你也可以捐一点&#xff5e;&#xff09; 安装之后 2、安装驱动 地址 &…

单片机-矩阵键盘密码锁

89C52RC芯片 1.矩阵按键输入正确密码&#xff0c;LCD1602右上角显示ok&#xff0c;错误显示Err。 涉及文件&#xff1a; 1.main.c (#include<regx52.h>) 2.lcd1602.c lcd1602.h 3.Delay.c Delay.h 4.MatrixKey.c MetrixKey.h 共7项 代码 main.c #…

此导入从不用作值,必须使用 “import type“ ,因为 “importsNotUsedAsValues“ 设置为 “error“。

前言 最近电脑更新了一次系统&#xff0c;重启后在 VsCode中打开项目 &#xff0c;发现原本正常的代码出现了一堆语法提示。网上搜了一下&#xff0c;没有找到关于此问题的回答&#xff0c;不知道我是不是第一个遇到的。在此记录一下这次的经历&#xff0c;如果有其他人遇到&a…

蓝桥杯专题-试题版含答案-【6174问题】【笨小熊】【鸡兔同笼】【小学生算数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

突破APP广告收益天花板的多种数据优化方法

​APP开发者对于广告变现最关心的问题就是收益。事实上&#xff0c;广告收益与广告请求、曝光和点击等关键数据之间存在着密切的联系。这些数据的表现直接影响着广告的收益情况。 因此&#xff0c;开发者需要重视并优化这些关键链路数据。本文将介绍一些优化方法&#xff0c;帮…

zabbix 介绍及部署

目录 一、zabbix的基本概述 二、zabbix功能 &#xff08;一&#xff09;数据收集 &#xff08;二&#xff09;灵活的阈值定义 &#xff08;三&#xff09;高度可配置的告警 &#xff08;四&#xff09;实时图形 &#xff08;五&#xff09;网络监控功能 &#xff08;六…

牛客网专项练习——C语言错题集(10)

文章目录 两数相除后的数据类型if 语句表达式类似转义字符逗号表达式易错题指针概念异或刁钻题&#xff0c;多维数组地址自动变量 两数相除后的数据类型 C语言规定除法运算符( / )的运算结果的数据类型与被除数的数据类型保存一致&#xff0c;所以一个整数除以另一个整数的结果…

JPA 批量插入较大数据 解决性能慢问题

JPA 批量插入较大数据 解决性能慢问题 使用jpa saveAll接口的话需要了解原理&#xff1a; TransactionalOverridepublic <S extends T> List<S> saveAll(Iterable<S> entities) {Assert.notNull(entities, "Entities must not be null!");List<…

建设Web3需要Web2的人才?探索传统技能在Web3时代的作用

摘要&#xff1a;Web3作为下一代互联网技术的前沿&#xff0c;许多人关注着它的发展和应用。然而&#xff0c;建设Web3是否需要Web2的人才仍然是一个有争议的问题。 Web3作为下一代互联网技术&#xff0c;以去中心化、智能合约和用户自治等特点引起了广泛的关注。与此同时&…

基于STM32单片机的智能家居毕设

文章目录 一、硬件选型1、硬件清单2、硬件展示&#xff08;部分&#xff09; 二、效果展示1、整体效果展示2、显示屏&#xff08;触摸&#xff09;效果展示 三、功能分析1、系统总体结构框图2、主要包含的功能 四、怎么做&#xff1f;1、STM32单片机部分2、语音识别与播报部分3…

wamp环境解决局域网不能访问的问题!

安装好wamp后&#xff0c;想用手机通过局域访问电脑上wamp下的网页&#xff0c;结果出现如下提示403错误&#xff1a; 第一步&#xff1a;找到 conf 这个文件&#xff1a; 找到下图中红色方框中的onlineoffline tag - don’t remove&#xff0c;将原来的Require local替换为Re…

JMeter:如何开始简单的WEB压力测试?

目录 背景 如何开始简单的WEB压力测试 PutsReq网站截图 执行测试计划 背景 JMeter是一款广泛使用的性能测试工具&#xff0c;它可以模拟用户行为并生成负载&#xff0c;用于评估Web应用程序的性能和稳定性。 最近工作上被安排针对Web网站进行性能压测&#xff0c;以评估特…

chatgpt赋能python:关于Python除二取余法的优缺点分析

关于Python除二取余法的优缺点分析 Python是当前数据分析和科学计算最火热的语言之一&#xff0c;其中除二取余法是Python中很有趣的算法之一。它也是很常用的基础算法之一&#xff0c;特别是在图像处理和编码中&#xff0c;非常常用。除二取余法指的是一个数值除以二后的余数…

『手撕 Mybatis 源码』09 - MyBatis 插件

MyBatis插件 概述 问题&#xff1a;什么是Mybatis插件&#xff1f;有什么作用&#xff1f; Mybatis插件本质上来说就是一个拦截器&#xff0c;它体现了 JDK 动态代理和责任链设计模式的综合运用 Mybatis 中所允许拦截的方法如下 Executor 【SQL执行器】【update&#xff…

深信服行为感知系统远程命令执行

什么是男子汉?困难打不倒的人才是真正的男子汉&#xff01; 漏洞复现 构造payload访问漏洞url&#xff1a; /tool/log/c.php?strip_slashessystem&hostipconfig漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢…

linux服务器python2升级安装python3.7环境

文章目录 开始1. 首先&#xff0c;先检查自己的系统是否安装了python32. 如果你只是想安装python3.63. 安装python3.7的准备工作4. 安装python35. 添加软链接&#xff0c;让python3和pip3这两个命令指向刚刚安装的python3.76. 检验python3安装是否ok7. 更新默认 Python 版本8. …

Spring管理事务知识

目录 1.什么是事务 2.事务的特性ACID 3.Spring 管理事务的方式 4.Spring管理事务的体现&#xff1a;JDBCTemplate 5.声明式事务的属性有哪些 6.声明式事务属性---只读 7.声明式事务属性---超时 8.声明式事务属性---回滚策略 9.声明式事务属性---事务隔离级别 10.声明…

mac 安装 aab android包

一、配置bundletool环境 1、下载最新版的bundletool 版本号要最新的 bundletool-all-1.15.1.jarhttps://github.com/google/bundletool/releases/download/1.15.1/bundletool-all-1.15.1.jar Releases google/bundletool GitHub​​​​​​​​​​ 2、把bundletool放在…

简要介绍 | 基于Diffusion model的图像生成和重建

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对基于Diffusion model的图像生成和重建进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 基于Diffusion model的图像生成和重建 What are Stable Diffusion Models and Why are they a Step Forw…