分布式配置中心是如何通过组合方式获取环境配置

举报
溜溜丽 发表于 2021/07/01 20:34:05 2021/07/01
【摘要】 《配置中心 Spring Cloud Config 详解》系列文章更新,一起在技术的路上精进!本系列文章将会介绍Spring Cloud 中提供了分布式配置中心Spring Cloud Config。应用服务中除了实现系统功能的代码,还需要连接资源和其它应用,经常有很多需要在外部配置的数据去调整应用的行为,如切换不同的数据库,设置功能开关等。随着微服务的不断增加,需要系统具备可伸缩和可扩展性...

《配置中心 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 接口。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。