【SpringCloud13】SpringCloud Config分布式配置中心

news2024/11/25 15:26:06

1.概述

1.1 分布式系统面临的配置问题

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。

SpringCloud提供了ConfigServer来解决这个问题,否则我们每一个微服务自己带着一个application.yml,上百个配置文件的管理这不直接G啊

1.2 是什么

在这里插入图片描述
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置

1.3 如何使用

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

服务端(Config Server)也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口

客户端(Client)则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。

1.4 作用

  • 集中管理配置文件

  • 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release

  • 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息

  • 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置

  • 将配置信息以REST接口的形式暴露:post、curl访问刷新均可…

1.5 与GitHub整合配置

由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持SVN和本地文件),但最推荐的还是Git,而且使用的是http/https访问的形式

1.6官网

官网
在这里插入图片描述

2.Config服务端配置与测试

2.1GitHub创建仓库

用自己的账号在Gitee上新建一个名为springcloud-config的新Repository
在这里插入图片描述

2.2由上一步获取新建的git地址

https://gitee.com/czl1270784659/springcloud-config.git
在这里插入图片描述

2.3本地硬盘目录上新建git仓库并clone

命令: git clone https://gitee.com/czl1270784659/springcloud-config.git

在这里插入图片描述

在这里插入图片描述

2.4在clone下的磁盘中新建springcloud-config

在这里插入图片描述
注意: 保存格式必须为UTF-8

如果需要修改操作git和github

  • git add .
  • git commit -m 'init yml'
  • git push origin main

2.5新建Module模块

新建cloud-config-center-3344它即为Cloud的配置中心模块cloudConfig Center

2.6POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.atguigu.springcloud</groupId>
        <artifactId>cloud2022</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-config-center-3344</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</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.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

2.7YML

server:
  port: 3344

spring:
  application:
    name: cloud-config-center #注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/czl1270784659/springcloud-config.git #Gitee上面的git仓库名字
          ####搜索目录
          search-paths:
            - springcloud-config
      ####读取分支
      label: main

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

2.8 主启动类

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: ${DATE} ${TIME}
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigCenterMain3344.class,args);
    }
}

2.9 修改Windows下hosts文件,增加映射

本机IP映射
127.0.0.1config-3344.com

在这里插入图片描述

2.10 测试

查看Config微服务是否可以从Gitee上获取配置内容
在这里插入图片描述
注意1: 将仓库设置成共有,否则会报错Authentication is required but no CredentialsProvider has been registered
注意2: 如果是编码问题,会报错Failed to load property source from location ‘file:/C:/Users/12707/AppData/Local/Temp/config-repo-1856996159345519574/config-dev.yml’

测试页面:http://config-3344.com:3344/master/config-dev.yml
在这里插入图片描述

2.11配置读取规则

配置要跟官网要求一直

2.11.1 官网要求配置

在这里插入图片描述

2.11.2 /{label}/{application}-{profile}.yml

1.master分支

http://config-3344.com:3344/master/config-dev.yml
http://config-3344.com:3344/master/config-test.yml
http://config-3344.com:3344/master/config-prod.yml

2.dev分支

http://config-3344.com:3344/dev/config-dev.yml
http://config-3344.com:3344/dev/config-test.yml
http://config-3344.com:3344/dev/config-prod.yml

2.11.3 /{application}-{profile}.yml

http://config-3344.com:3344/config-dev.yml
http://config-3344.com:3344/config-test.yml
http://config-3344.com:3344/config-prod.yml
http://config-3344.com:3344/config-xxxx.yml(不存在的配置)
在这里插入图片描述

2.11.4 /{application}/{profile}[/{label}]

http://config-3344.com:3344/config/dev/master
http://config-3344.com:3344/config/test/master
http://config-3344.com:3344/config/config/master
在这里插入图片描述
读取内容不同

2.11.5 重要配置细节总结

  • label:分支(branch)表示 git 分支,默认是 master 分支,如果项目是以分支做区分也是可以的,那就可以通过不同的 label 来控制访问不同的配置文件了
  • name:服务名就是应用名称,对应到配置文件上来,就是配置文件的名称部分,例如我上面创建的配置文件
  • profiles:环境(dev/test/prod)是配置文件的版本,我们的项目有开发版本、测试环境版本、生产环境版本,对应到配置文件上来就是以 application-{profile}.yml 加以区分,例如application-dev.yml、application-sit.yml、application-prod.yml

3.Config客户端配置与测试

3.1 新建cloud-config-client-3355

3.2 POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.atguigu.springcloud</groupId>
        <artifactId>cloud2022</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-config-client-3355</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <!--config客户端-->
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</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.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

3.3 bootstrap.yml

3.3.1 是什么

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

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

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

要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的,因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml
在这里插入图片描述

3.3.2 YML内容

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

在这里插入图片描述

3.4 主启动

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: ${DATE} ${TIME}
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientMain3355.class, args);
    }
}

3.6 业务类

package com.atguigu.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: 2023/1/17 10:35
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@RestController
public class ConfigClientMain3355 {

    @Value("${config.info}")
    private String configInfo;

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

3.7 测试

  1. 启动Config配置中心3344微服务并自测
    在这里插入图片描述

  2. 启动3355作为Client准备访问
    在这里插入图片描述

3.7 修改config-dev.yml配置并提交至Gitee

  1. 3.7.1 Linux运维修改Gitee上配置文件的内容已做调整
    在这里插入图片描述

  2. 刷新3344,发现ConfigServer配置中心立刻响应
    在这里插入图片描述

  3. 刷新3355,发现ConfigClient客户端没有任何响应
    在这里插入图片描述

  4. 3355需要重新启动或重新加载才能有响应
    在这里插入图片描述

问题: 每次运维修改配置文件,客户端都要重启,简直就是噩梦

4.Config客户端之动态刷新

4.1 避免每次更新配置都要重启客户端微服务3355

4.2 动态刷新步骤,修改3355模块

4.2.1 POM引入actuator模块

这里之前已经添加了

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

4.2.2 修改YML,暴露监控端口

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

4.2.3 业务类Controller修改

添加注解: @RefreshScope
在这里插入图片描述

4.2.4 怎么做

  1. 修改gitee
    在这里插入图片描述

  2. 观察3344
    在这里插入图片描述

  3. 观察3355
    在这里插入图片描述

问题:发现3355的版本信息还是4并没有改变,也就是说明配置没有生效
如何解决:需要运维人员发送Post请求刷新3355

必须是POST请求
模拟测试人员发送命令: curl -X POST "http://localhost:3355/actuator/refresh"
在这里插入图片描述
查看3355
在这里插入图片描述
客户端3355配置文件版本更新了,避免了服务重启

4.3 其他问题

想想还有什么问题?

  • 假如有多个微服务客户端3355/3366/3377…
  • 每个微服务都要执行一次post请求,手动刷新?
  • 可否广播,一次通知,处处生效?
  • 我们想大范围的自动刷新,求方法
  • 想要精确打击,100台机器只想要通知98台,其余两台因为版本发包的问题,不用换成最新的版本,进行定点通知,定点清除?

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

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

相关文章

PointNext论文解读

论文地址&#xff1a;https://arxiv.org/abs/2206.04670 github地址&#xff1a;GitHub - guochengqian/PointNeXt: [NeurIPS22] PointNeXt: Revisiting PointNet with Improved Training and Scaling Strategies 本文主要提出优化PointNet的两大关键点. 1) 好的训练策略 2…

如何搭建一个专业的知识库

当客户跟你达成合作关系后&#xff0c;需要持续的关系维护&#xff0c;在一定的销售点&#xff0c;定期和客户沟通&#xff0c;据调查&#xff0c;赢得一个新客户的成本可能是保留一个现有客户的5到25倍&#xff0c;作为营销策略&#xff0c;客户服务支持必须满足他们的期望。建…

[BJDCTF2020]Easy MD5(浅谈PHP弱类型hash比较缺陷)

目录 信息收集 构造payload PHP弱类型hash比较缺陷 0e碰撞 数组MD5 总结 信息收集 看题目应该和MD5加密相关 select * from admin where passwordmd5($pass,true) PHP的MD5函数 string必需。规定要计算的字符串。raw 可选。规定十六进制或二进制输出格式&#xff1a; …

2023-01-17 PostgreSQL 并行查询概述

简介&#xff1a; 大数据时代&#xff0c;人们使用数据库系统处理的数据量越来越大&#xff0c;请求越来越复杂&#xff0c;对数据库系统的大数据处理能力和混合负载能力提出更高的要求。PostgreSQL 作为世界上最先进的开源数据库&#xff0c;在大数据处理方面做了很多工作&…

详谈ORB-SLAM2的单目初始化器Initializer

单目初始化器Initializer类&#xff0c;这个类只用于单目初始化&#xff0c;因为这是ORB-SLAM里遗留的一个类&#xff0c;也是祖传代码&#xff0c;双目和RGBD相机只需要一帧就能初始化&#xff0c;因为双目和RGBD相机拍到的点都是有信息的&#xff0c;但是单目相机就不一定了&…

六种方法在云平台和远程桌面中使用Kali

一、说明 本篇主要介绍方便在云服务器&#xff0c;或者以远程桌面&#xff08;GUI&#xff09;形式使用kali配置教程&#xff0c;帮助渗透更加方便顺利。 二、方法 2.1 方法一 云服务提供商预装 备注&#xff1a;预算充足&#xff0c;可以首考虑此方法 优点&#xff1a; 云服…

java 探花交友项目实战 day3 完善个人信息 阿里云OSS文件存储 百度人脸识别

完善用户信息 业务概述 阿里云OSS Data ConfigurationProperties(prefix "tanhua.oss") public class OssProperties { private String accessKey; private String secret; private String bucketName; private String url; //域名 private Strin…

微分方程的特征值解法:斯图姆-刘维尔方程

一.基础概念 前置:福克斯定理和奇点理论 常点的级数解 奇异点的级数解 则至少存在一个如下形式的解(弗罗贝尼乌斯级数): 19世纪中期,常微分方程的研究到了新的阶段,存在定理和斯图姆-刘维尔理论都假设微分方程区域内含解析函数或至少包含连续函数,而另一方面,以前研究…

东莞注塑MES管理系统具有哪些功能

伴随着人们对于物质生活的品质要求越来越高&#xff0c;日用品、医疗保健、汽车工业、电子行业、新能源、家电、包装行业以及建筑等行业对注塑产品的需求量日益突出。注塑企业提供的各种各样的塑料产品已渗透到经济生活的各个领域&#xff0c;为国家经济的各个部门包括轻工业和…

ARM SD卡启动详解

一、主流的外存设备介绍 内存和外存的区别&#xff1a;一般是把这种 RAM(random access memory&#xff0c;随机访问存储器&#xff0c;特点是任意字节读写&#xff0c;掉电丢失)叫内存&#xff0c;把 ROM&#xff08;read only memory&#xff0c;只读存储器&#xff0c;类似…

15子空间投影

子空间投影 从向量的投影入手&#xff0c;延伸到高维投影&#xff0c;并将投影使用矩阵形式给出。做投影也即向另一个向量上做垂线。上一章讨论的Axb无解时的最优解求解时&#xff0c;并没有解释这个最优解为何“最优”&#xff0c;本节课给出相应的解释。相对简单的二维空间的…

MyBatis -- resultType 和 resultMap

MyBatis -- resultType 和 resultMap一、返回类型&#xff1a;resultType二、返回字典映射&#xff1a;resultMap一、返回类型&#xff1a;resultType 绝⼤数查询场景可以使用 resultType 进⾏返回&#xff0c;如下代码所示&#xff1a; <select id"getNameById"…

企业如何借助制造业ERP系统,做好生产排产管理?

随着市场竞争越来越激烈&#xff0c;生产制造行业订单零碎化趋势越发突出。面对品种多&#xff0c;数量小&#xff0c;批次多&#xff0c;个性化需求也多的生产方式&#xff0c;PMC生产排产管理变得非常困难&#xff1b;同时生产过程还会有各种不确定的临时性因素出现&#xff…

详解pandas的read_csv函数

一、官网参数 pandas官网参数网址&#xff1a;pandas.read_csv — pandas 1.5.2 documentation 如下所示&#xff1a; 二、常用参数详解 1、filepath_or_buffer(文件) 一般指读取文件的路径。比如读取csv文件。【必须指定】 import pandas as pddf_1 pd.read_csv(r"C:…

Xilinx FPGA电源设计与注意事项

1 引言随着半导体和芯片技术的飞速发展&#xff0c;现在的FPGA集成了越来越多的可配置逻辑资源、各种各样的外部总线接口以及丰富的内部RAM资源&#xff0c;使其在国防、医疗、消费电子等领域得到了越来越广泛的应用。当采用FPGA进行设计电路时&#xff0c;大多数FPGA对上电的电…

软件测试复习06:基于经验的测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录软件缺陷基于缺陷分类的测试缺陷模式探索性测试软件缺陷 主要由以下几种原因造成&#xff1a; 疏…

Redux相关知识(什么是redux、redux的工作原理、redux的核心概念、redux的基本使用)(十一)

系列文章目录 第一章&#xff1a;React基础知识&#xff08;React基本使用、JSX语法、React模块化与组件化&#xff09;&#xff08;一&#xff09; 第二章&#xff1a;React基础知识&#xff08;组件实例三大核心属性state、props、refs&#xff09;&#xff08;二&#xff0…

Arduino 开发ESP8266(ESP12F)模块

①ESP12F模块的硬件说明如上图所示&#xff0c;其他引脚均引出。②准备好硬件之后就是要下载Arduino IDE&#xff0c;目前版本为2.0.3&#xff0c;下载地址为&#xff1a;https://www.arduino.cc/en/software&#xff0c;如下图所示③安装Arduino IDE较为简单&#xff0c;安装之…

aws cloudformation 在堆栈中使用 waitcondition 协调资源创建和相关操作

参考资料 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.htmlhttps://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waitcondition.html 本文介绍cloudformation的waitcondition条件&#xff0c;wait…

Win10之bandicam录音无声音问题

0.问题描述&#xff1a;在Xubuntu22.04中通过gnome-boxes跑win10&#xff0c;但是win10本机录音机录音ok&#xff0c;使用bandicam录屏却没声音的问题&#xff0c;以下是分析步骤。1.Linux端设置选择Xbuntu声音图标speaker选择声卡&#xff1a;sof-hda-dsp Speaker Headphonesm…