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

网友投稿 546 2022-05-30

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

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

Spring Cloud 分布式

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据库动态脱敏
下一篇:Java 变量使用小技巧~
相关文章