配置中心 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接口
各类环境仓库都实现了顶级接口EnvironmentRepository
和SearchPathLocator
。
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;
//...
}
}
下图为基础应用中获取指定资源的截图:
locations对应的是本地仓库中的位置,由于根据profile区分,所以这里返回的两个位置为根目录和dev目录。该接口是一个用于定位资源搜索路径的策略,比如配置信息存储于文件系统或者类路径中,获取配置信息时需要准确定位到这些配置的位置。内部类Locations
定义了相应的应用服务配置存储信息,和findOne
方法的传参一样,方法getLocations
也需要应用服务的相关信息。
下图为接口EnvironmentRepository
和SearchPathLocator
的类图:
JGit方式实现配置仓库
MultipleJGitEnvironmentRepository
继承自JGitEnvironmentRepository
,JGit也是一种环境仓储的方式,我们首先需要了解下JGit是什么?
JGit 是一个用 Java 写成的功能相对健全的 Git 的实现,它在 Java 社区中被广泛使用。 JGit 项目由 Eclipse 维护,它的主页在 http://www.eclipse.org/jgit。
从上面的类图可以看出,JGitEnvironmentRepository
继承自抽象类AbstractScmEnvironmentRepository
,而该抽象类又继承自AbstractScmAccessor
,AbstractScmAccessor
是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方式实现配置仓库服务端存储相关定义,接下来将会重点介绍这种方式的实现。
- 点赞
- 收藏
- 关注作者
评论(0)