title: spring cloud config 源码分析(二)
date: 2023-04-21 14:33:36
tags
config源码分析
如果config server从数据库中读取数据,config server如何去获取数据。
1.在org.springframework.cloud.config.server包中存在EnviormentController类中,也是通过rest风格去访问。
2.我们从游览器访问对应的url,然后再去debug
3.在这个位置打个断点,进行debug
4.然后会从findOne方法去查找配置,根据对应的label,profiles,name
5.进行findOne方法后,继续进行debug
6.继续debug后,我们发现它会将相关信息 注入到Environment对象中。
7.最重要的一步就是EnvironmentRepositories这个接口,这是一个接口,我们可以通过这个接口去实现config server如何去获取数据,在findOne方法中,this.environmentRepositories是一个集合,因为有多个类实现该接口,所以Spring在启动的时候会去获取实现该接口的所有类,那么它就是一个接口。
8.这个类在config server中十分重要,我们可以通过继承这个类去扩展config server通过git,数据库获取数据等其他方法
git和数据库便是通过这两个类去查找配置信息的
9.然后再去判断Spring中实现EnvironmentRepositories的接口有多少个类,然后再去遍历
如果是多个实现的话,它会去遍历查询然后将获取的配置全部加入到env中
至于它如何去控制Bean加载到spring中仍需要研究
10.我们这里debug只查出this.environmentRepositories.size() == 1,那么我们进入if分支,他去获取第一个Bean然后调用方法
这里会新建一个NativeEnvironmentRepository对象,并且获取配置文件和相关环境信息
这里会获取一些元数据
11.这里有个getLocaltions方法会去获取,当地文件的位置
它会获取你从数据库读取放在本地,然后文件的地址
12.接着debug,label为空所以,它进入if分支,将label进行赋值,这里是自己实现的,具体分析根据自己debug所得。
我们这里自己实现了使config server分支默认为master
13.我们接着debug,看看部门大佬如何写的,下面我们来到refresh方法
14.我们进入refresh方法,我们来看看它是如何判断的
这里配置文件可以配置refreshRate刷新频率,这里设置了refreshRate = 600,经过计算十分钟刷新一次
15.然后我们在进行debug可以看见getWorkingDirectory方法,紧接着cleanDirectory方法会去清理你文件夹中是否含有其他文件,如果含有它就会清理,如何再将查询的数据加入到文件夹中。
16.然后我们会去数据库中读取数据然后利用writeConfig方法将配置文件写入到文件夹中。
17.它通过jdbcTemplate去获取数据,这里的getsql会去获取表中的所有数据,这里有个existLabels对象,它是一个set数据结构,它用来保存label数据并且将label唯一,然后最后去判断是否存在label标签,如果不存在会抛出一个异常。(用set是为了方便去检索是否存在)
17.下面我们debug一下writeConfig方法,这个writeStringToFile会将数据创建放入之前的文件夹中。
18.最后更新一下刷新时间。
19,返回之后 我们达到refresh方法,检查label类型,返回一个location对象
10,debug之后,来到下一步
我们可以看到findOne方法会去获取相关配置信息
11,我们对findOne方法进行debug会发现这个方法会将配置文件放入它里面(核心)
12.我们来到clean方法,它会将刚刚获取的配置信息放入到PropertySource,然后再放入Environment对象中,最后将它返回
13回调之后我们来到,它将配置文件内容赋值给envRepo,最后依次set进去
14 再继续回调,我们会来到对环境配置进行解密
这里会判断它是否设置了加解密,如果设置则进行解密操作
15,再继续回调我们就会发现,它将配置文件返回给客户端