前言
每个spring-boot程序都依赖于一些特定的第三方数据源,在一个分布式系统中,需要有一个这样的数据源服务器,其他的微服务能够从这个数据源拿到最新的数据。spring cloud中实现这个功能的组件就是spring cloud config server。
spring cloud config server
Spring Cloud配置服务器为外部配置(名称-值对或等效的YAML内容)提供了基于HTTP资源的API。通过使用@EnableConfigServer注释,服务器可以嵌入到Spring引导应用程序中。因此,下面的应用程序是一个配置服务器:
application.properties
@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
public static void main(String[] args) {
SpringApplication.run(ConfigServer.class, args);
}
}
与所有Spring引导应用程序一样,默认情况下它运行在端口8080上,但是您可以通过各种方式将其切换到更传统的端口8888。最简单的方法是使用spring.config.name=configserver(Config Server jar中有一个configserver.yml)启动配置库,这也是设置默认配置库的方法。另一种方法是使用自己的application.properties,如下例所示:
server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo
其中${user.home}/config-repo是一个包含YAML和属性文件的git存储库。
在Windows上,如果文件是带有驱动器前缀的绝对文件,则需要在文件URL中额外添加一个“/”(例如,file:///${user.home}/config-repo)。
环境库
配置服务器的配置数据应该存储在哪里?管理这种行为的策略是为Environment对象服务的EnvironmentRepository。这个Environment是来自Spring Environment的域的浅拷贝(包括propertySources作为主要特性)。环境资源由三个变量参数化:
- {application},它映射到客户端spring.application.name。
- {profile},它映射到客户端的spring.profiles.active的客户端(逗号分隔列表)。
- {label},它是一个服务器端特性,用于标记配置文件的“版本化”集。
存储库实现的行为通常类似于Spring引导应用程序,从等于{application}参数的spring.config.name和spring.profiles.active等于{profiles}加载配置文件参数。概要文件的优先规则与常规Spring引导应用程序中的相同:活动概要文件优先于默认配置文件,并且,如果有多个概要文件,最后一个优先(类似于向Map中添加条目)。
下面的示例客户端应用程序有这样的引导配置:
bootstrap.yml
spring:
application:
name: foo
profiles:
active: dev,mysql
(与Spring引导应用程序一样,这些属性也可以由环境变量或命令行参数设置)。
如果存储库是基于文件的,则服务器从application.yml创建环境(在所有客户端之间共享)和foo.yml (foo.yml采取优先)。如果YAML文件中有指向Spring概要文件的文档,则应用这些文件的优先级更高(按照列出的概要文件的顺序)。如果存在特定于配置文件的YAML(或属性)文件,也会以高于默认值的优先级应用这些文件。较高的优先级将转换为环境中较早列出的PropertySource。(这些规则同样适用于独立的Spring引导应用程序。)
可以设置spring.cloud.config.server.accept-empty到false,这样如果没有找到应用程序,服务器将返回HTTP 404状态。默认情况下,此标志设置为true。
Git后端
环境存储库的默认实现使用一个Git后端,它对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以设置spring.cloud.config.server.git。配置服务器中的uri配置属性(例如application.yml中)。如果您将其设置为file:前缀,那么它应该在本地存储库中工作,这样您就可以在不使用服务器的情况下快速而轻松地入门。然而,在这种情况下,服务器直接在本地存储库上操作而不克隆它(如果它不是裸的也没关系,因为配置服务器从不更改“远程”存储库)。要扩展配置服务器并使其高可用性,您需要让该服务器的所有实例指向同一个存储库,这样只有共享文件系统才能工作。即使在这种情况下,最好还是为共享的文件系统存储库使用ssh:协议,这样服务器就可以克隆它并使用本地工作副本作为缓存。
这个存储库实现将HTTP资源的{label}参数映射到一个git标签(提交id、分支名称或标记)。如果git分支或标记名称包含斜杠(/),那么HTTP URL中的标签应该使用特殊字符串(_)指定(以避免与其他URL路径产生歧义)。例如,如果标签是foo/bar,替换斜杠将产生以下标签:foo(_)bar。包含特殊字符串(_)也可以应用于{application}参数
。如果使用curl之类的命令行客户机,请注意URL中的括号,应该使用单引号(")将它们从shell中转义。
Git搜索路径中的占位符
Spring Cloud Config Server还支持带有占位符的{application}和{profile}搜索路径(如果需要还支持{label}),如下面的示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
searchPaths: '{application}' #注意单引号
上面的清单导致在存储库中搜索同名(名称为{application})目录中的文件(以及顶层)。通配符在带有占位符的搜索路径中也有效(搜索中包括任何匹配的目录)。
推送通知和Spring Cloud Bus
许多源代码库提供商(如Github、Gitlab、Gitea、Gitee、Gogs或Bitbucket)通过webhook通知你库中的更改。您可以通过提供者的用户界面将webhook配置为一个URL和一组您感兴趣的事件。例如,Github使用一个JSON主体,其中包含一个提交列表和一个设置为push的头(X-Github-Event)。如果您在Spring-Cloud添加一个spring-cloud-config-monitor依赖项,并在配置服务器中激活Spring云总线,那么就启用了一个/monitor端点。