【SpringCloud笔记】(9)分布式配置中心之Config

Config

概述

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

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。

比如:有n个微服务连接同一套数据库,当连接数据库需要发生变动时,需要改n多次
比如:每一个微服务都有dev,prd环境

每一个微服务自己带着一个application.yml,上百个配置文件的管理…/(T o T)/~~

由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的,SpringCloud提供了ConfigServer来解决这个问题

当前主流使用的配置中心有三种

  • config+bus
  • alibaba nacos
  • 携程 阿波罗

Config是什么?

在这里插入图片描述

一句话:统一共用的配置放在配置中心,各自独立的配置各自保存

SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。

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

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

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

Config能干嘛?

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

config服务端配置与测试

git参考文档: https://blog.csdn.net/qq_44722674/article/details/117200397
https://lolitasian.blog.csdn.net/article/details/79085301
在GitHub上新建一个仓库:springcloud-config
获得刚才新建的git地址:git@github.com:mazhuorui/springcloud-config.git
在本地硬盘目录新建git仓库 比如我新建目录:D:\app\appFile\gitRepository,在该目录下执行以下命令
在这里插入图片描述
注意上面的操作不是必须的,只要github上有就可以,克隆到本地只是为了方便修改

新建Module模块cloud-config-center-3344

它即为Cloud的配置中心模块cloudConfig Center

pom文件

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

    <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><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
            <groupId>com.mzr.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

yml文件

server:
  port: 3344

spring:
  application:
    name:  cloud-config-center #注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
          uri: git@github.com:mazhuorui/springcloud_config.git #GitHub上面的git仓库名字
        ####搜索目录
          search-paths:
            - springcloud_config
      ####读取分支
      label: master

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

主启动类

@SpringBootApplication
@EnableConfigServer //加上该注解
@EnableEurekaClient
public class ConfigCenterMain3344
{
    public static void main(String[] args) {
        SpringApplication.run(ConfigCenterMain3344.class, args);
    }
}

windows下修改hosts文件,增加映射127.0.0.1 config-3344.com

启动微服务3344(先启动7001)
测试通过Config微服务是否可以从GitHub上获取配置内容
http://config-3344com:3344/master/config-dev.yml

在这里插入图片描述

配置读取规则

/{label}-{nalrne}-{profiles}.yml

  • label:分支(branch)
  • name :服务名
  • profiles:环境(dev/test/prod)

建议使用第一种

在这里插入图片描述

不加分支名{label}默认是master分支

在这里插入图片描述

前两种返回的时yml内容,第三种返回的是json串

在这里插入图片描述

config客户端配置与测试

新建cloud-config-client-3355模块

pom文件

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

    <dependencies>
        <dependency>
        	<!--这里与服务端不同,没有写server-->
            <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>
    </dependencies>

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

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

Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。

Bootstrap context和Application Context有着不同的约定,所以新增了一个bootstrap.yml文件,保证Bootstrap Context和Application Context配置的分离。
一般会有bootstrap.yml、application.yml两个文件,bootstrap.yml从外部获取共有的配置,application.yml负责微服务独有的配置,两个配置文件才能组合成一个完整的配置环境

本次只使用一个bootstrap.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 #配置中心地址k

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

主启动类

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

controller层

@RestController
public class ConfigClientController {
	
	//将配置文件中config.info内容注入到configInfo变量中
    @Value("${config.info}") 
    private String configInfo;

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

启动测试

可以发现3344和3355访问的内容是一致的

成功实现了客户端3355通过访问SpringCloud Config3344获取到GitHub上的配置信息

在这里插入图片描述
在这里插入图片描述

动态刷新

问题:如果我们修改了GitHub上配置文件内容,3344、3355还能获取到新的内容吗?

  • Linux运维修改GitHub上的配置文件内容做调整:比如修改config-dev.yml提交
  • 刷新3344,发现ConfigServer服务端配置中心立刻响应,得到最新值了
  • 刷新3355,发现ConfigClient客户端没有任何响应,拿到的还是旧值
  • 客户端3355没有变化除非自己重启或者重新加载,才能拿到最新值
  • 难到每次运维修改配置文件,客户端都需要重启??噩梦

解决动态刷新问题

修改3355模块

POM引入actuator

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

修改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 #配置中心地址k

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

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

@RefreshScope业务类Controller修改

@RestController
@RefreshScope//自动刷新注解
public class ConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

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

此时,我们客户端的配置已经完成了,我们再去刷新3355访问3355发现拿到的依然时旧值?!

最后一步操作:向客户端发送post请求刷新3355,相当于告诉3355GitHub内容已更新

curl -X POST “http://localhost:3355/actuator/refresh”
两个必须:1.必须是 POST 请求,2.请求地址:http://localhost:3355/actuator/refresh


假如有多个微服务客户端3355/3366/3377…

每个微服务都要执行一次post请求,手动刷新?

可否广播,一次通知,处处生效?我们想大范围的自动刷新,并且还能够定点通知、精确通知,比如100台

中我要剔除2台通知其他98台,求方法~


好哥们儿消息总线Bus不请自来!

点击即学

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webrtc turn服务器搭建

测试环境ubuntu 22LTS 首先从github上下载源码编译 GitHub - coturn/coturn: coturn TURN server project 用的tag docker/4.6.2-r7 ./configure --prefix /usr/local/coturn make 安装coturn的时候还需要安装一些依赖包 apt-get install pkg-config apt-get install op…

室内设计师效果图云渲染好?还是本地渲染好?

室内设计师在设计项目中经常面临一个关键的技术选择&#xff1a;使用云渲染服务或本地渲染完成效果图渲染呢&#xff1f;每种方式都有其独的优势与不足&#xff0c;且影响整个设计的完成速度、质量和成本。当然还有部分人群不知道云渲染是什么&#xff1f;本文整理关于云渲染的…

为什么都建议配备人员摔倒AI检测算法

旭帆科技的AI智能分析网关v4包含有30多种算法&#xff0c;包括人体、车辆、行为分析、烟火、入侵、安全帽、反光衣等等&#xff0c;可应用在安全生产、通用园区、智慧社区、智慧工地等场景中。 今天&#xff0c;小编就其中的摔倒检测算法来展开聊聊&#xff0c;可以用于哪些场…

达梦dm.ini参数之SELECT_LOCK_MODE详解

一、背景 1.现象概述 某项目当晚分区表变更&#xff0c;因为manager工具多开了1个窗口执行了语句慢取消了&#xff0c;新开了一个会话窗口执行添加分区/删除分区/truncate分区卡死了&#xff0c;v$session查不到关于这张分区表的阻塞和事务&#xff0c;但是在v$lock里根据表的…

C语言-第十七周课堂总结-数组

找出矩阵中最大值所在的位置 程序解析-求矩阵的最大值 源程序段 二维数组 多维数组的空间想象 一维数组&#xff1a;一列长表或一个向量二维数组&#xff1a;一个表格或一个平面矩阵三维数组&#xff1a;三位空间的一个方阵多维数组&#xff1a;多维空间的一个数据矩阵 …

如何在本地部署现有气象大模型

今年涌现了诸如Pangu、Fuxi、Fengwu、GraphCast、FourCastNet等诸多气象大模型&#xff0c;本文介绍如何用EC开发的ai-models在本地部署以上模型。 本文测试环境系统为&#xff1a; Ubuntu 18.04.6 LTS Anaconda 3 Cuda 11.8 libcudnn 8 1、创建并启动虚拟环境 conda cr…

修改orbslam2代码,加载二进制词典文件,加速词典加载速度

修改orbslam2代码&#xff0c;加载二进制词典文件&#xff0c;加速词典加载速度 0.在ORB_SLAM2下创建tools文件夹&#xff0c;放入bin_vocabulary.cc程序 #include <time.h>#include "ORBVocabulary.h" using namespace std;bool load_as_text(ORB_SLAM2::OR…

手动创建idea SpringBoot 项目

步骤一&#xff1a; 步骤二&#xff1a; 选择Spring initializer -> Project SDK 选择自己的JDK版本 ->Next 步骤三&#xff1a; Maven POM ->Next 步骤四&#xff1a; 根据JDK版本选择Spring Boot版本 11版本及以上JDK建议选用3.2版本&#xff0c;JDK为11版本…

算法模板之单调栈和单调队列图文详解

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;算法模板、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️单调栈讲解1.1 &#x1f514;单调栈的定义1.2 &#x1f514;如何维护一个单…

JS + CSS 实现高亮关键词(不侵入DOM)

之前在做关键词检索高亮功能的时候&#xff0c;研究了下目前前端实现高亮的几种方式&#xff0c;第一就是替换dom元素实现高亮&#xff0c;第二就是利用浏览器新特性Css.highlights结合js选区与光标与CSS高亮伪类实现&#xff0c;实现功能如下&#xff1a; 一、页面布局 一个…

海德堡UV灯电源维修eta Plus Elc PE22-400-210

uv灯电源维修故障包括&#xff1a; 1、电压不稳&#xff1a;检查uv打印机的电压&#xff0c;设置一个稳压箱即可。 2、温度过高&#xff1a;uv打印机温度过高也会影响uv灯&#xff0c;可以更换为水冷式循环降温。 3、水箱里的信号线接触不好&#xff1a;将两边的信号线对调&…

Python爬虫|使用Selenium轻松爬取网页数据

1. 什么是selenium&#xff1f; Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作浏览器一样。支持的浏览器包括IE&#xff0c;Firefox&#xff0c;Safari&#xff0c;Chrome等。 Selenium可以驱动浏览器自动执…

SpringBoot+ShardingSphereJDBC实战(读写分离,分库分表,垂直拆分、水平拆分)附源码

参考&#xff1a;https://www.51cto.com/article/747736.html https://blog.csdn.net/qq_41581588/article/details/126966665 源码地址&#xff1a;gitgitee.com:jackXUYY/springboot-example.git 读写分离测试 我们启用后缀名为dev的配置文件&#xff0c;如下&#xff0c;…

Visual Studio 2013 中创建一个基于 Qt 的动态链接库:并在MFC DLL程序中使用

在本地已经安装好 Qt 的情况下&#xff0c;按照以下步骤在 Visual Studio 2013 中创建一个基于 Qt 的动态链接库&#xff1a; 一、新建 Qt 项目&#xff1a; 在 Visual Studio 中&#xff0c;选择 “文件” -> “新建” -> “项目…”。在 “新建项目” 对话框中&#…

51和32单片机读取FSR薄膜压力传感器压力变化

文章目录 简介线性电压转换模块51单片机读取DO接线方式51代码实验效果 32单片机读取AO接线方式32代码实验效果 总结 简介 FSR薄膜压力传感器是可以将压力变化转换为电阻变化的一种传感器&#xff0c;单片机可以读取然后作为粗略测量压力&#xff08;仅提供压力变化&#xff0c;…

超时控制:Go语言下的网络请求与时间赛跑

开场白&#xff1a;在互联网的世界里&#xff0c;我们经常要与各种API打交道。有时&#xff0c;这些API可能会因为各种原因而变得“慢条斯理”&#xff0c;这时&#xff0c;超时控制就显得尤为重要了。今天&#xff0c;我们就来聊聊如何在Go语言中实现HTTP请求的超时控制&#…

【JavaScript】DOM事件的传播机制

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

企业如何正确的云迁移,云迁移过程中需要注意哪几个点?

如今的企业比以往任何时候都能访问更多的数据。这些数据正在以惊人的速度增长&#xff0c;无论是数量还是变化量。无论是传统的分析还是机器学习和人工智能等前沿技术&#xff0c;将这些信息从所有信息源集中到云存储库对业务至关重要。 为什么进行迁移&#xff1f; 企业将数…

【JavaScript】异步解决方案的发展历程

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

Flink1.17实战教程(第二篇:DataStream API)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…