不想每天重复修改,试试config一处修改病毒式蔓延自动更新配置?
nanshan 2024-10-22 12:54 10 浏览 0 评论
背景
有多少次因为配置文件忘记修改导致重新发布
有多少次因为无法实时修改配置导致重新发布
有多少次同一个配置在不同项目需要重复修改
有多少次因为配置导致项目启动失败!!!
配置服务中心
config
- 面对上面种种的问题springcloud为我们提供一种解决方案---Springcloud Config它为分布式微服务提供了集中化的外部配置支持,配置服务器为微服务下所有环境提供配置中心
- Springcloud Config分为服务端和客户端、服务端就是本节介绍的对象。而客户端就是嵌入在各个微服务中和服务端进行交互的从而实现配置的动态获取
pom
- 还是一样的味道我们通过framework-root框架来实现我们config中心,首先继承framework-root然后在pom中添加如下坐标
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-config-server</artifactid>
</dependency>
application.yml
- 除了一些基本的参数设定以外我们需要指定config拉取的仓库即git相关信息
server:
port: 8070
spring:
application:
name: config-server
cloud.config.server.git:
uri: https://gitee.com/zxhTom/spring-cloud-demo
searchPaths: helloworldconfig
启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class,args);
}
}
测试
- 你没看错!就是这简单或者说还是之前的配方。我们只需要引包、配置、启动即可!这就是spring的强大之处或者说是springboot的开箱即用的强大之处
- 我们访问http://localhost:8070/master/config-server-dev.properties就会将https://gitee.com/zxhTom/spring-cloud-demo项目下master分支下的helloworldconfig文件夹下的config-server-dev.properties文件读取出来!
- 请注意下,笔者的config仓库后续会有变动。最终读者的演示情况和笔者这里略有不同!!!
路径规则
- 上面我们已经可以通过接口的形式访问到我们的配置文件了。但是那只是其中一种方式我们换个接口同样可以访问到http://localhost:8070/config-server-dev.yml 。那么config的代理访问肯定是按照一定规律来的。我们访问官网,官网已经帮我们整理好了
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
- 咋一看,心里万马奔腾这是啥玩意呀。再仔细看看你会发现官网总结的太到位了。首先官网整理出的是三种访问格式:resultful、yml、properties 。当我们的接口满足其中一种格式的时候就会被config解析出来并有对应变量管理。
- 为了充分演示出效果,小哲这里新建了几个配置文件。当我们访问如下接口时会出现哪几种情况http://localhost:8070/config/server-dev .
- 按照我们上面的格式进行匹配,首先是resultful结构的,那么就只有一种匹配方式得出application=config;profile=server-dev,label=null。label是可填的默认是master。
- 最终我们可以看到我们分析是没有问题,其中多处一个version字段,这个笔者猜测是git commitId,因为我发现和提交记录一样。 而对应的配置文件就是propertySources里的文件。细心的朋友一定会发现这里为什么是个数组呢?这里笔者在官网上没有找到说明但是经过测试笔者这里整理出springcloud config映射规则
//后缀包括两种 。 回去找{label}分支下如下格式的文件
{application}/{profile}.[properties|yml]
{application}.[properties|yml]
- 另外两种方式和resultful差不多,只不过他返回的信息时精简版的。只返回配置文件中内容的并集。这里需要注意相同内容取前者,那么谁先谁后呢?这就需要我们resultful格式接口告诉我们了。
- 记住这个时候我们访问http://localhost:8070/config-server.properties 。 然后通过resultful风格来确定是来源哪里.这里在强调下上面hello为什么是yml 。还记得上面我提到在这么多文件中如果存在相同的配置会优先去首位的。这是什么意思呢?
- 我们通过resultful可以看出来会读取三个文件的配置分别是config-server.properties、config-server.yml、config.properties 。
- 我们在分别看下这三个文件中的内容,hello这个key出现在两个文件中。然后在resultful接口我们可以看出config-server.yml排在config.properties前面,所以我们通过文件后缀方式访问到的数据配置hello=yml 。
配置读取客户端
- 上面我们也提到了关于config存在两个角色,config中心是用来统一为微服务提供服务的,剩下的就是嵌入在微服务中的。在配置微服务的config客户端之前我们先来梳理下springboot的一个注意点。
- springboot的配置文件除了在加载顺序有不同之外,还有一点是文件名的区别。在springboot中其实存在两种配置文件名称;我们常用的是application开头的配置文件(application.yml和application.properties)。
- springcloud程序会创建一个bootstrap上下文同时他也是application上下文的父类!它负责从外部源加载配置属性,并解密本地外部配置文件中的属性。这两个上下文共享一个Environment,它是任何Spring应用程序的外部属性的来源。在springcloud中bootstrap类型的配置文件优先级最高所以不需要担心会被本地的配置所覆盖。
- 我们客户端想要读取config-server中心的配置数据我们就需要在bootstrap配置文件中配置。
bootstrap.yml
zxhtom: hello-zxhtom
spring:
cloud:
config:
label: master
name: config-server
profile: dev //这里和config-server解析不一样的是,他将访问master分支下的config-server-dev.yml或者properties文件
uri: http://localhost:8070
application.yml
zxhtom: hello-zxhtom2
server:
port: 80
tomcat:
max-threads: 10
pom
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-config</artifactid>
</dependency>
测试
- 首先引入pom包这里大家应该都没有问题,其次我们在application.yml和bootstrap.yml两个配置文件中配置相同的东西。这个时候在bootstrap中不配置config东西。此时我们访问zxhtom参数得到的结果是application中的。当我们将config配置加进来之后我们访问到的是git远程仓库的东西。关于演示笔者这里就不演示了。因为上面配置完成之后我们只需要写个接口获取参数就可以了。
小瑕疵
- 但是存在一个小瑕疵,当我们远程仓库配置修改后我们的服务也需要跟着修改!这好坑啊,感情玩了半天我还在原地打转啊。除了解决多模块相同配置重复修改的问题,重启的问题还是没能解决。难道我们就只能如此了吗?
- 上面我们已经实现config-server来读取远程仓库配置了。也实现了客户端通过config-server读取远程配置了。但是当我们修改git远程仓库上配置时,我们的config-server会实时的修改配置值,客户端确无法实时更新!解决办法就是重启。
动态刷新
- 发现问题才能不断进步当然前提你得承认问题!这是一个伟大的哲学家说的(我自己) 。
- 首先我们需要引入actuator模块,这个我们在讲解hystrix模块的时候在父项目root中引入了。当时笔者一直出了在高版本中actuator中需要加入actuator前缀。
- 然后我们在获取配置的接口类上添加@RefreshScope 。 记住这里一定要在这里加哦!!!
- 好了,到这里我们就解决了,现在启动我们的config客户端,在这里我们是order模块。启动之后通过http://localhost/order/config/getConfig获取zxhtom这个值。
仍然不足
- 上面我们基于actuator实现了动态刷新,但是这个动态刷新并不是自动刷新还是需要我们认为参与。实际项目生产使用中会有很多个微服务充电config-client角色。那么我们每次更新git仓库内容时是不是需要诶个调用接口呢?这显然是不行的。我也说了存在问题才能优化。那么我们该如何解决
奇技淫巧
脱离git
- 在config-server中我们通过spring.cloud.config.server.git.uri中指定git远程仓库。如果我们在内网环境开发而且内网中我们没有自己搭建git服务呢。我们可以配置本地地址也可以实现读取指定外部仓库的。
spring.cloud.config.server.git.uri=file://xxxxxx/repository
多仓库
spring.cloud.config.server.git:
uri: https://gitee.com/zxhTom/spring-cloud-demo
searchPaths: helloworldconfig
repos:
dev:
pattern: dev/*
uri: file:///D:\test\repository\spring-cloud-demo
searchPaths: helloworldconfig
- 上述配置spring.cloud.config.server.git.uri是默认的仓库配置。然后根据repos来进行多仓库的配置。repos下跟了多少个就说明是多少个环境配置。比如我们上面的配置repos下只有dev一个配置,这个dev就是我们用于dev的环境。他的匹配模式是任何已dev开头的都将使用dev这个配置的仓库来进行我们上面匹配规则分析。
添加权限
- 如果你的公司没有单独部署git。如果你使用的就是github这种公网性质。那么将我们项目中的配置放在这种地方是不是有点不安全呢?你的所有的服务的密码都被公开了。这样是极度不安全。那么我们要么自己单独部署git。要么将配置文件这个项目设置成私有
- 项目配置成私有我们config-server所在的服务可以通过ssh方式进行配置项目uri 。
- spring: cloud: config: server: git: username: xxxx password: xxxx
- 我们也可以通过如上配置方式将我们项目的用户名和密码配置,然后在通过http方式进行访问。这样也是可以的。
指定本地仓库位置
- 当我们通过接口访问获取远程仓库配置信息的时候,实际上config帮我们将远程仓库的文件拉取到本地路径上了。这个我们通过观察日志就可以看得出来。
- 可以证实我们没访问一次接口config都会刷新本地文件库的。但是本地文件存储的位置其实是不固定的,项目每次启动当前项目所在的目录都会发生随机改变。文件路径为config-repo-随机id。会出现这么一种情况当我们重启的时候git挂了这个时候我们将无法获取但是因为随机id的原因我们将获取不到配置信息了。所以config` 可以让我们指定这个路劲。
spring.cloud.config.server.git.basedir: xxxxx
分模块读取配置
- 实际分布式项目中我们会有很多模块,如果我们都将放在同一层级的话会显得很多。这用并不是不能使用但是为了方便管理我们还是希望能够进行分类管理不同的服务请求过来进不同文件中进行匹配。
spring.cloud.config.server.git.searchPaths: '{application}'
- 而application就是我们上文提到的通过地址分析中得到的那个application 。注意这里一定要加引号
总结
- springcloud config模块极大的简化了我们微服务中重复配置的问题,默认使用的git来实现公共服务的获取的当然他也是支持svn,关于svn的整合呢笔者这里没有指出因为现在使用svn的公司应该很少了。如果非要使用svn的话也很简单。将uri地址换成svn的就可以了。前提引入如下包
<dependency>
<groupid>org.tmatesoft.svnkit</groupid>
<artifactid>svnkit</artifactid>
<version>1.8.10</version>
</dependency>
相关推荐
- 实战派 | Java项目中玩转Redis6.0客户端缓存
-
铺垫首先介绍一下今天要使用到的工具Lettuce,它是一个可伸缩线程安全的redis客户端。多个线程可以共享同一个RedisConnection,利用nio框架Netty来高效地管理多个连接。放眼望向...
- 轻松掌握redis缓存穿透、击穿、雪崩问题解决方案(20230529版)
-
1、缓存穿透所谓缓存穿透就是非法传输了一个在数据库中不存在的条件,导致查询redis和数据库中都没有,并且有大量的请求进来,就会导致对数据库产生压力,解决这一问题的方法如下:1、使用空缓存解决对查询到...
- Redis与本地缓存联手:多级缓存架构的奥秘
-
多级缓存(如Redis+本地缓存)是一种在系统架构中广泛应用的提高系统性能和响应速度的技术手段,它综合利用了不同类型缓存的优势,以下为你详细介绍:基本概念本地缓存:指的是在应用程序所在的服务器内...
- 腾讯云国际站:腾讯云服务器如何配置Redis缓存?
-
本文由【云老大】TG@yunlaoda360撰写一、安装Redis使用包管理器安装(推荐)在CentOS系统中,可以通过yum包管理器安装Redis:sudoyumupdate-...
- Spring Boot3 整合 Redis 实现数据缓存,你做对了吗?
-
你是否在开发互联网大厂后端项目时,遇到过系统响应速度慢的问题?当高并发请求涌入,数据库压力剧增,响应时间拉长,用户体验直线下降。相信不少后端开发同行都被这个问题困扰过。其实,通过在SpringBo...
- 【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案
-
在我们使用redis时,也会存在一些问题,导致请求直接打到数据库上,导致数据库挂掉。下面我们来说说这些问题及解决方案。1、缓存穿透1.1场景一个请求进来后,先去redis进行查找,redis存在,则...
- Spring boot 整合Redis缓存你了解多少
-
在前一篇里面讲到了Redis缓存击穿、缓存穿透、缓存雪崩这三者区别,接下来我们讲解Springboot整合Redis中的一些知识点:之前遇到过,有的了四五年,甚至更长时间的后端Java开发,并且...
- 揭秘!Redis 缓存与数据库一致性问题的终极解决方案
-
在现代软件开发中,Redis作为一款高性能的缓存数据库,被广泛应用于提升系统的响应速度和吞吐量。然而,缓存与数据库之间的数据一致性问题,一直是开发者们面临的一大挑战。本文将深入探讨Redis缓存...
- 高并发下Spring Cache缓存穿透?我用Caffeine+Redis破局
-
一、什么是缓存穿透?缓存穿透是指查询一个根本不存在的数据,导致请求直接穿透缓存层到达数据库,可能压垮数据库的现象。在高并发场景下,这尤其危险。典型场景:恶意攻击:故意查询不存在的ID(如负数或超大数值...
- Redis缓存三剑客:穿透、雪崩、击穿—手把手教你解决
-
缓存穿透菜小弟:我先问问什么是缓存穿透?我听说是缓存查不到,直接去查数据库了。表哥:没错。缓存穿透是指查询一个缓存中不存在且数据库中也不存在的数据,导致每次请求都直接访问数据库的行为。这种行为会让缓存...
- Redis中缓存穿透问题与解决方法
-
缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...
- Redis客户端缓存的几种实现方式
-
前言:Redis作为当今最流行的内存数据库和缓存系统,被广泛应用于各类应用场景。然而,即使Redis本身性能卓越,在高并发场景下,应用于Redis服务器之间的网络通信仍可能成为性能瓶颈。所以客户端缓存...
- Nginx合集-常用功能指导
-
1)启动、重启以及停止nginx进入sbin目录之后,输入以下命令#启动nginx./nginx#指定配置文件启动nginx./nginx-c/usr/local/nginx/conf/n...
- 腾讯云国际站:腾讯云怎么提升服务器速度?
-
本文由【云老大】TG@yunlaoda360撰写升级服务器规格选择更高性能的CPU、内存和带宽,以提供更好的处理能力和网络性能。优化网络配置调整网络接口卡(NIC)驱动,优化TCP/IP参数...
- 雷霆一击服务器管理员教程
-
本文转载莱卡云游戏服务器雷霆一击管理员教程(搜索莱卡云面版可搜到)首先你需要给服务器设置管理员密码,默认是空的管理员密码在启动页面进行设置设置完成后你需要重启服务器才可生效加入游戏后,点击键盘左上角E...
你 发表评论:
欢迎- 一周热门
-
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
WindowsServer2022|配置NTP服务器的命令
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
K3s禁用Service Load Balancer,解决获取浏览器IP不正确问题
-
- 最近发表
-
- 实战派 | Java项目中玩转Redis6.0客户端缓存
- 轻松掌握redis缓存穿透、击穿、雪崩问题解决方案(20230529版)
- Redis与本地缓存联手:多级缓存架构的奥秘
- 腾讯云国际站:腾讯云服务器如何配置Redis缓存?
- Spring Boot3 整合 Redis 实现数据缓存,你做对了吗?
- 【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案
- Spring boot 整合Redis缓存你了解多少
- 揭秘!Redis 缓存与数据库一致性问题的终极解决方案
- 高并发下Spring Cache缓存穿透?我用Caffeine+Redis破局
- Redis缓存三剑客:穿透、雪崩、击穿—手把手教你解决
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)