配置中心 Spring Cloud Config:配置存储的实现

举报
溜溜丽 发表于 2021/06/01 16:13:16 2021/06/01
【摘要】 配置中心 Spring Cloud Config:EnvironmentRepository接口和SearchPathLocator接口《配置中心 Spring Cloud Config 详解》系列文章更新,一起在技术的路上精进!本系列文章将会介绍Spring Cloud 中提供了分布式配置中心Spring Cloud Config。应用服务中除了实现系统功能的代码,还需要连接资源和其它应...

配置中心 Spring Cloud Config:EnvironmentRepository接口和SearchPathLocator接口

《配置中心 Spring Cloud Config 详解》系列文章更新,一起在技术的路上精进!本系列文章将会介绍Spring Cloud 中提供了分布式配置中心Spring Cloud Config。应用服务中除了实现系统功能的代码,还需要连接资源和其它应用,经常有很多需要在外部配置的数据去调整应用的行为,如切换不同的数据库,设置功能开关等。随着微服务的不断增加,需要系统具备可伸缩和可扩展性,除此之外就是管理相当多的服务实例的配置数据。在应用的开发阶段由各个服务自治,但是到了生产环境之后会给运维带来很大的麻烦,特别是微服务的规模比较大,配置的更新更为麻烦。为此,系统需要建立一个统一的配置管理中心。

在前面的文章,我们介绍了 Spring Cloud Config 配置服务器实现中的 Config Server 配置类。本文将会介绍配置服务器实现中的 EnvironmentRepository 接口和 SearchPathLocator 接口。

EnvironmentRepository接口和SearchPathLocator接口

各类环境仓库都实现了顶级接口EnvironmentRepositorySearchPathLocator

public interface EnvironmentRepository {
	Environment findOne(String application, String profile, String label);
}

该接口定义了一个获取指定应用服务的环境信息,返回的是Environment对象。需要传入的参数也很熟悉,有application、profile和label,对应于客户端应用的信息。该方法根据传入的客户端服务的信息,用于获取对应应用服务的配置信息。如下为我们获取到的一个Environment对象。

{
    "name": "config-client",
    "profiles": [
        "dev"
    ],
    "label": null,
    "version": "1e3e73d366cb37b99c918cd9b6f3ac471da17211",
    "propertySources": [
        {
            "name": "https://gitee.com/keets/Config-Repo.git/dev/config-client-dev.yml",
            "source": {
                "spring.profiles": "dev",
                "cloud.version": "Camden SR4"
            }
        }
    ]
}

除了传入的客户端应用的信息,还有version对应于git提交的CommitId,propertySources对应环境变量的源和具体的值。

另一个接口是SearchPathLocator,根据传入的客户端应用信息,获取对应的配置环境文件的位置信息。

public interface SearchPathLocator {

	Locations getLocations(String application, String profile, String label);

	class Locations {
		private final String application;
		private final String profile;
		private final String label;
		private final String[] locations;
		private final String version;
		//...
	}
}

下图为基础应用中获取指定资源的截图:

图片.png

locations对应的是本地仓库中的位置,由于根据profile区分,所以这里返回的两个位置为根目录和dev目录。该接口是一个用于定位资源搜索路径的策略,比如配置信息存储于文件系统或者类路径中,获取配置信息时需要准确定位到这些配置的位置。内部类Locations定义了相应的应用服务配置存储信息,和findOne方法的传参一样,方法getLocations也需要应用服务的相关信息。

下图为接口EnvironmentRepositorySearchPathLocator的类图:

图片.png

JGit方式实现配置仓库

MultipleJGitEnvironmentRepository继承自JGitEnvironmentRepository,JGit也是一种环境仓储的方式,我们首先需要了解下JGit是什么?

JGit 是一个用 Java 写成的功能相对健全的 Git 的实现,它在 Java 社区中被广泛使用。 JGit 项目由 Eclipse 维护,它的主页在 http://www.eclipse.org/jgit。

图片.png

从上面的类图可以看出,JGitEnvironmentRepository继承自抽象类AbstractScmEnvironmentRepository,而该抽象类又继承自AbstractScmAccessorAbstractScmAccessor是SCM(软件配置管理,source control management)实现的父类,定义了基础的属性组成以获取SCM的资源。我们从基类AbstractScmAccessor看起,基类中定义了SCM的配置属性和基本方法。

public abstract class AbstractScmAccessor implements ResourceLoaderAware {

	private static final String[] DEFAULT_LOCATIONS = new String[] { "/" };

	private File basedir;

	private String uri;
	private ConfigurableEnvironment environment;

	private String username;

	private String password;

	private String passphrase;
 	// 拒绝那些SSH keys不在已知的host列表中的远端访问主机
	private boolean strictHostKeyChecking;
	// 搜索在本地工作副本中使用的路径。 默认情况下只搜索根
	private String[] searchPaths = DEFAULT_LOCATIONS.clone();
	//...
	public AbstractScmAccessor(ConfigurableEnvironment environment) {
		this.environment = environment;
		this.basedir = createBaseDir();
	}
	protected File createBaseDir() {
		//...
	}
	protected File getWorkingDirectory() {
		//...
	}
}

远端仓库的地址URI、用户名、密码等属性,在使用git仓库时都需要配置的。还有一些属性,如basedir(即本地拷贝之后的工作仓库地址)和passphrase(即SSH的私钥)等,也都是我们在环境仓库进行设置时可选项。

小结

本文主要介绍了 Spring Cloud Config 服务端 Config Server EnvironmentRepository接口和SearchPathLocator接口的实现。以及 JGit方式实现配置仓库服务端存储相关定义,接下来将会重点介绍这种方式的实现。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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