分布式配置中心是如何通过组合方式获取环境配置
《配置中心 Spring Cloud Config 详解》系列文章更新,一起在技术的路上精进!本系列文章将会介绍Spring Cloud 中提供了分布式配置中心Spring Cloud Config。应用服务中除了实现系统功能的代码,还需要连接资源和其它应用,经常有很多需要在外部配置的数据去调整应用的行为,如切换不同的数据库,设置功能开关等。随着微服务的不断增加,需要系统具备可伸缩和可扩展性,除此之外就是管理相当多的服务实例的配置数据。在应用的开发阶段由各个服务自治,但是到了生产环境之后会给运维带来很大的麻烦,特别是微服务的规模比较大,配置的更新更为麻烦。为此,系统需要建立一个统一的配置管理中心。
在前面的文章,我们进一步介绍了如何通过组合方式获取配置。本文将会接着前面一篇文章,重点介绍如何获取指定服务的资源文件。
获取指定服务的资源文件
ResourceRepositoryConfiguration
是资源的配置类,在SearchPathLocator
对象存在时,将ResourceRepository
加入到Spring的上下文中。
@Bean
@ConditionalOnBean(SearchPathLocator.class)
public ResourceRepository resourceRepository(SearchPathLocator service) {
return new GenericResourceRepository(service);
}
前面讲到EnvironmentRepository
,相比而言ResourceRepository
用来定位一个应用的资源,返回的是某一个具体的资源文件,最后其内容转换成文本格式;而EnvironmentRepository
返回的信息更加全面,是一种键值对的格式,包括应用的基本信息,指定应用的配置源(可能来自多个源或者共享配置文件),这些键值对可以替换资源文本中的占位符。
public interface ResourceRepository {
Resource findOne(String name, String profile, String label, String path);
}
最后返回的Resource
是一个资源描述符的接口,用于抽象底层资源的实际类型,如文件或类路径资源。
spring:
profiles: dev
cloud:
version: Camden SR4
上面是示例项目中客户端服务获取其对应的资源文件的结果,Resource流经过转化成String文本,
ResourceRepository
接口的实现类为GenericResourceRepository
,覆写了findOne方法,返回配置数据。
public class GenericResourceRepository
implements ResourceRepository, ResourceLoaderAware {
private SearchPathLocator service;
//通过构造函数设置SearchPathLocator对象
public GenericResourceRepository(SearchPathLocator service) {
this.service = service;
}
//...
@Override
public synchronized Resource findOne(String application, String profile, String label,
String path) {
String[] locations = this.service.getLocations(application, profile, label).getLocations();
try {
for (int i = locations.length; i-- > 0;) {
String location = locations[i];
for (String local : getProfilePaths(profile, path)) {
Resource file = this.resourceLoader.getResource(location)
.createRelative(local);
if (file.exists() && file.isReadable()) {
return file;
}
}
}
}
//...
}
}
从上面实现来看,主要是通过构造函数设置SearchPathLocator
对象,传入应用名等参数调用#getLocations
方法得到配置资源的具体路径,SearchPathLocator
的实现类会保证是最新的配置仓库。因为profile可以有默认值default,在创建资源文件之前,先调用#getProfilePaths
方法根据profile值对path进行处理,然后由resourceLoader
的#getResource(location)
方法创建绝对路径的配置资源。
小结
本文主要介绍了 Spring Cloud Config 服务端 Config Server 中如何获取指定服务的资源文件。至此,服务端的内容就讲解完了。
除此之外,Spring Cloud Config 服务端内置了一些对外查询的 API 端点,下一篇文章将会具体介绍这些 REST 接口。
- 点赞
- 收藏
- 关注作者
评论(0)