【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: 3344spring: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: 3355spring:application:name: config-clientcloud:#Config客户端配置config:label: master #分支名称name: config #配置文件名称profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取,读取路径http://config-3344.com:3344/master/config-dev.ymluri: 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: 3355spring:application:name: config-clientcloud:#Config客户端配置config:label: master #分支名称name: config #配置文件名称profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取,读取路径http://config-3344.com:3344/master/config-dev.ymluri: 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可以呢?

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

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

相关文章

如何从 Android 手机免费恢复已删除的通话记录/历史记录?

有一个有合作意向的人给我打电话&#xff0c;但我没有接听。更糟糕的是&#xff0c;我错误地将其删除&#xff0c;认为这是一个骚扰电话。那么有没有办法从 Android 手机恢复已删除的通话记录呢&#xff1f;” 塞缪尔问道。如何在 Android 上恢复已删除的通话记录&#xff1f;如…

滴水逆向三期笔记与作业——02C语言——08 结构体

本节课内容简单&#xff0c;仅截图记录 滴水三期 一、什么是结构体结构体偏移结构体的定义与赋值结构体类型的参数结构体类型的函数返回 二、作业 一、什么是结构体 结构体偏移 结构体的定义与赋值 结构体类型的参数 本质是内存数据的复制&#xff0c;将结构体中在内存存储的…

LLM之RAG理论(二)| RAG综述论文详解

论文地址&#xff1a;https://arxiv.org/pdf/2312.10997.pdf 大型语言模型&#xff08;LLMs&#xff09;展示了强大的能力&#xff0c;但在实际应用中仍面临挑战&#xff0c;如幻觉现象、知识更新缓慢&#xff0c;以及在回答中缺乏透明度。检索增强生成&#xff08;RAG&#xf…

Azure Machine Learning - 如何使用 GPT-4 Turbo with Vision

介绍如何在Azure中使用GPT-4 Turbo with Vision 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c;项目管理…

C++设计模式 #6 桥模式(Bridge)

动机 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;乃至多个变化的维度。 如何应对这种“多维度的变化”&#xff1f;如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化&#xff0c;而不引入额外的复杂度 举个栗子 我们…

YUM和编译安装

一、安装Linux 1.编译安装&#xff0c;灵活性高&#xff0c;难度较大&#xff0c;可以安装较新的版本 2.rpm安装&#xff08;redhat&#xff09; linux包安装 rpm 软件名 3.yum yum是rpm升级版本&#xff0c;解决了rpm的弊端 2和3用的都是红帽打包好的软件包&#xff0c;能…

Elasticsearch基本使用

文章目录 概要一、核心概念二、索引操作2.1 创建索引2.2 判断索引是否存在2.3 查看索引2.4 打开、关闭索引2.5 删除索引 三、映射操作3.1 创建映射字段3.2 映射属性详解3.3 查看映射关系 四、文档增删改查4.1 新增文档4.2 查看单个文档4.3 查看所有文档4.4 _source定制返回字段…

小白也能搞定的Python选择排序

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 小白也能搞定的Python选择排序。全文3300字&#xff0c;阅读大约10分钟 选择排序&#xff08;Selection Sort&#xff09;是一种简单但有效的排序算法&#xff0c;它通过逐步…

IW5500手提式强光巡检工作灯

适用场所&#xff1a; 适用于铁路列检作业、工务巡道、车辆检修&#xff1b; 适用于冶金、厂电、网电等行业的巡查、设备检修等。 产品特点&#xff1a; 工作光、强光两种光设计&#xff0c;按动按钮可进行自由转换。 工作时间长&#xff0c;强光和工作光的连续工作时间分别在…

c++代码寻找USB00端口并添加打印机

USB00*端口的背景 插入USB端口的打印机&#xff0c;安装打印机驱动&#xff0c;在控制面板设备与打印机处的打印机对象上右击&#xff0c;可以看到打印机端口。对于不少型号&#xff0c;这个端口是USB001或USB002之类的。 经观察&#xff0c;这些USB00*端口并不是打印机驱动所…

制作自己的 Docker 容器

软件开发最大的麻烦事之一&#xff0c;就是环境配置。用户必须保证操作系统的设置&#xff0c;各种库和组件的安装&#xff0c;只有它们都正确&#xff0c;软件才能运行。docker从根本上解决问题&#xff0c;软件安装的时候&#xff0c;把原始环境一模一样地复制过来。 以 koa-…

为什么c++的开源库那么少?

为什么c的开源库那么少&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「 C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;…