Spring Cloud 为开发人员提供了一系列的工具来快速构建分布式系统的通用模型 。例如:配置管理、服务发现、断路由、智能路由、微代理、控制总线、一次性Token、全局锁、决策竞选、分布式session、集群状态等等。分布式系统的协助需要一大堆的模型,使用Spring Cloud开发者能快速的建立支持实现这些模式的服务和应用程序。他们将适用于任何分布式环境,无论是开发者的个人电脑还是生产环境,还是云平台。
版本:Brixton.SR3
作者:链上研发-欧阳
(注:阅读前置技能树 Spring 以及Spring的 Property Source、Environment、Profile 和 Spring Boot ,原始文档有些没头没尾的,适当添加了些内容。)
Spring Cloud中文文档(持续更新中。。。)
特性
Spring Cloud 专注于提供良好开箱即用的典型方案和可扩展方式。
- 分布式/版本化配置
- 服务注册/服务发现
- 路由
- 服务间调用
- 负载均衡
- 断路器
- 全局锁
- 领导选取和集群状态监控
- 分布式消息
Cloud Native 应用
Cloud Native是一种持续交付和价值驱动开发推荐的最佳实践方式。它的理念包含了DevOps、持续交付、微服务、敏捷基础设施、康威定律,以及根据商业能力对公司进行重组。一个很好的契约例子是12-factor Apps。Spirng Cloud 提供了一系列的工具和特性来促进这些开发,所有的组件都是基于分布式,并且非常容易开始使用。
构建Spring Cloud的大部分特性都是基于Spring Boot的。Spring Cloud的一些特性来源于两个库:Spring Cloud Context 和 Spring Cloud Commons。Spring Cloud Context为Spring Cloud应用程序的ApplicationContext提供了基础的服务(启动上下文,加密,刷新作用域和环境端点)。Spring Cloud Commons是为实现不同的Spring Cloud实现的抽象。(例如:Spring Cloud Netflix 和 Spring Cloud Consul)
如果使用Sun的JDK遇到Illegal key size
异常,需要安装JCE
更多信息请查看:
提取文件到JDK/jre/lib/security文件夹(无论你使用的那个版本的JRE/JDK x64/x86)
- 注意:
Spring Cloud是基于非限制性的Apache 2.0 license发布的。如果你发现文档有问题,或只是想提高它们的质量,请到github上参与进来。
Spring Cloud 上下文
Spring Boot使用约定的方式来构建Spring应用,例如:它约定了配置文件的位置、通用的端点管理和监控任务。Spring Cloud建立在它的上面,并且增加了一些分布式系统可能需要的组件。
启动上下文
Spring Cloud会创建一个`Bootstrap Context`,作为Spring应用的`Application Context`的父上下文。初始化的时候,`Bootstrap Context`负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的`Environment`。`Bootstrap`属性有高优先级,默认情况下,它们不会被本地配置覆盖。 `Bootstrap context`和`Application Context`有着不同的约定,所以新增了一个`bootstrap.yml`文件,而不是使用`application.yml` (或者`application.properties`)。保证`Bootstrap Context`和`Application Context`配置的分离。下面是一个例子: **bootstrap.yml**
spring: application: name: foo cloud: config: uri: ${SPRING_CONFIG_URI:http://localhost:8888}
推荐在`bootstrap.yml` or `application.yml`里面配置`spring.application.name`. 你可以通过设置`spring.cloud.bootstrap.enabled=false`来禁用`bootstrap`。
应用上下文层次结构
如果你通过`SpringApplication`或者`SpringApplicationBuilder`创建一个`Application Context`,那么会为spring应用的`Application Context`创建父上下文`Bootstrap Context`。在Spring里有个特性,子上下文会继承父类的`property sources` and `profiles` ,所以`main application context` 相对于没有使用Spring Cloud Config,会新增额外的`property sources`。额外的`property sources`有:
- “bootstrap” : 如果在
Bootstrap Context
扫描到PropertySourceLocator
并且有属性,则会添加到CompositePropertySource。Spirng Cloud Config就是通过这种方式来添加的属性的,详细看源码
ConfigServicePropertySourceLocator`。下面也也有一个例子自定义的例子。 - “applicationConfig: [classpath:bootstrap.yml]” ,(如果有
spring.profiles.active=production
则例如 applicationConfig: [classpath:/bootstrap.yml]#production): 如果你使用bootstrap.yml
来配置Bootstrap Context
,他比application.yml
优先级要低。它将添加到子上下文,作为Spring Boot应用程序的一部分。下文有介绍。
由于优先级规则,Bootstrap Context
不包含从bootstrap.yml
来的数据,但是可以用它作为默认设置。(其实就是最低的优先级,测试过)
你可以很容易的扩展任何你建立的上下文层次,可以使用它提供的接口,或者使用SpringApplicationBuilder
包含的方法(parent()
,child()
,sibling()
)。Bootstrap Context
将是最高级别的父类。扩展的每一个Context
都有有自己的bootstrap property source
(有可能是空的)。扩展的每一个Context
都有不同spring.application.name
。同一层层次的父子上下文原则上也有一有不同的名称,因此,也会有不同的Config Server配置。子上下文的属性在相同名字的情况下将覆盖父上下文的属性。
注意SpringApplicationBuilder
允许共享Environment
到所有层次,但是不是默认的。因此,同级的兄弟上下文不在和父类共享一些东西的时候不一定有相同的profiles
或者property sources
。
修改Bootstrap属性配置
源码位置BootstrapApplicationListener
。
String configName = environment.resolvePlaceholders("${spring.cloud.bootstrap.name:bootstrap}"); String configLocation = environment.resolvePlaceholders("${spring.cloud.bootstrap.location:}"); Map<String, Object> bootstrapMap = new HashMap<>();bootstrapMap.put("spring.config.name",configName); if(StringUtils.hasText(configLocation)){ bootstrapMap.put("spring.config.location", configLocation); }
bootstrap.yml
是由spring.cloud.bootstrap.name
(默认:”bootstrap”)或者spring.cloud.bootstrap.location
(默认空)。这些属性行为与spring.config.*
类似,通过它的Environment
来配置引导ApplicationContext
。如果有一个激活的profile
(来源于spring.profiles.active
或者Environment
的Api构建),例如bootstrap-development.properties
就是配置了profile
为development
的配置文件.
覆盖远程属性
property sources
被bootstrap context
添加到应用通常通过远程的方式,比如”Config Server”。默认情况下,本地的配置文件不能覆盖远程配置,但是可以通过启动命令行参数来覆盖远程配置。如果需要本地文件覆盖远程文件,需要在远程配置文件里设置授权 spring.cloud.config.allowOverride=true
(这个配置不能在本地被设置)。一旦设置了这个权限,你可以配置更加细粒度的配置来配置覆盖的方式,
比如:
- spring.cloud.config.overrideNone=true
覆盖任何本地属性
- spring.cloud.config.overrideSystemProperties=false
仅仅系统属性和环境变量
源文件见PropertySourceBootstrapProperties
自定义启动配置
bootstrap context
是依赖/META-INF/spring.factories
文件里面的org.springframework.cloud.bootstrap.BootstrapConfiguration
条目下面,通过逗号分隔的Spring @Configuration
类来建立的配置。任何main application context
需要的自动注入的Bean可以在这里通过这种方式来获取。这也是ApplicationContextInitializer
建立@Bean
的方式。可以通过@Order
来更改初始化序列,默认是”last”。
# spring-cloud-context-1.1.1.RELEASE.jar
# spring.factories
# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,
org.springframework.cloud.autoconfigure.RefreshAutoConfiguration,
org.springframework.cloud.autoconfigure.RefreshEndpointAutoConfiguration,
org.springframework.cloud.autoconfigure.LifecycleMvcEndpointAutoConfiguration
# Application Listeners
org.springframework.context.ApplicationListener=
org.springframework.cloud.bootstrap.BootstrapApplicationListener,
org.springframework.cloud.context.restart.RestartListener
# Bootstrap components
org.springframework.cloud.bootstrap.BootstrapConfiguration=
org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration,
org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration,
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration
- 警告
小心,你添加的自定义
BootstrapConfiguration
类没有错误的@ComponentScanned
到你的主应用上下文,他们可能是不需要的。使用一个另外的包不被@ComponentScan
或者@SpringBootApplication
注解覆盖到。
bootstrap context
通过spring.factories
配置的类初始化的所有的Bean都会在SpingApplicatin启动前加入到它的上下文里去。
自定义引导配置来源:Bootstrap Property Sources
默认的`property source`添加额外的配置是通过配置服务(Config Server),你也可以自定义添加`property source`通过实现`PropertySourceLocator`接口来添加。你可以使用它加配置属性从不同的服务、数据库、或者其他。
- 下面是一个自定义的例子:
@Configuration public class CustomPropertySourceLocator implements PropertySourceLocator { @Override public PropertySource<?> locate(Environment environment) { return new MapPropertySource("customProperty", Collections.<String, Object>singletonMap("property.from.sample.custom.source", "worked as intended")); } }
Environment
被ApplicationContext
建立,并传入property sources
(可能不同个profile
有不同的属性),所以,你可以从Environment
寻找找一些特别的属性。比如spring.application.name
,它是默认的Config Server property source
。
如果你建立了一个jar包,里面添加了一个META-INF/spring.factories
文件:
org.springframework.cloud.bootstrap.BootstrapConfiguration=sample.custom.CustomPropertySourceLocator
那么,”customProperty“的PropertySource
将会被包含到应用。
Environment改变
应用程序将监听EnvironmentChangeEvent
,并且响应这一些改变(添加的ApplicationListeners
可以被用户用标准的方式增加到@Beans
)。当EnvironmentChangedEvent
观察到这些值被改变,会触发这些事情:
- 重新绑定
@ConfigurationProperties
bean到上下文 - 根据
logging.level.*
来舍得属性的日志级别
默认情况下,Config Client不轮询Environment
的改变。一般情况,不建议使用这种方式来监测变化(虽然你可以通过@Scheduled
注解来设置)。对于可扩展的应用程序,使用广播EnvironmentChangeEvent
到所有实例的方式,好过轮询的方式。(比如使用Spring Cloud Bus项目)。
修改Environment
可以通过发布EnvironmentChangeEvent
来做,这是Spring核心Api的方式。你可以通过观察/configprops
端点(Spring Boot Actuator的特性)来检查这些改变绑定到@ConfigurationProperties
的bean的情况。对于DataSource
这样一个实例,在运行的时候修改maxPoolSize
增加大小,修改的变化不会通知实例里面,可以使用@RefreshScope
来初始化Bean。
@RefreshScope
一个Spring的@Bean
在添加了@RefreshScope
注解,可以解决Bean初始化的时候只能获得初始配置的问题。比如,在使用DataSource
获得一个数据库连接的是时候,当通过Environment
修改数据库连接字符串的时候,我们可以通过执行@RefreshScope
俩根据修改的配置获取一个新的URL的连接。
@RefreshScope
的beans,在使用它初始化的时候是延迟代理的。通过RefreshEndpoint
Bean来控制。或者/refresh
请求来重新初始化。
- 注意
@RefreshScope注解在一个
@Configuration
类上面,在重新初始化的时候需要注意到可以相互依赖造成的冲突。
加密和解密
Spring Cloud可以在本地进行预处理的解密,与Config Server有相同的规则,通过设置相同的`encrypt.*`来实现。因此,可以使用加密的值在`{cipher}*`上,在应用通过`Environment`获得属值之前进行解密。使用加密特性需要包含Spring Security RSA的包到classpath。Maven依赖”org.springframework.security:spring-security-rsa”。并且,需要在JVM添加JCE扩展。 如果使用Sun的JDK遇到`Illegal key size`异常,需要安装JCE 更多信息请查看:
提取文件到JDK/jre/lib/security文件夹(无论你使用的那个版本的JRE/JDK x64/x86)。
端点
相对于Spring Boot Actuator的应用,添加了一些管理端点:
- POST to /env 更新
Environment
重新加载@ConfigurationProperties
和日志级别 - /refresh 重新初始化添加了
@RefreshScope
的bean - /restart 重启初始化ApplicationContext,重启 (默认是禁用的)
- /pause and /resume 调用ApplicationContext生命周期的方法
stop()
和start()
通用的抽象Spring Cloud Commons
比如服务发现、负载平衡和断路器等通用的模型,本身是一个抽象层,可以被所有Spring Cloud组件独立的实现,例如服务发现有具体的实现Eureka、Consul。
Spring RestTemplate作为负载均衡客户端
RestTemplate
可以使用ribbon自动配置,简历一个负载均衡的RestTemplate
使用@Bean
和@LoadBalanced
来预设。
- 警告
RestTemplate
不会通过自动配置建立,必须单独配置。
@Configuration public class MyConfiguration { @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } } public class MyClass { @Autowired private RestTemplate restTemplate; public String doOtherStuff() { String results = restTemplate.getForObject("http://stores/stores", String.class); return results; } }
这里的URI需要使用虚拟主机名,比如服务名称,而不是Host名称。Ribbon客户端用它来建立一个完整的物理地址。可以查看`RibbonAutoConfiguration`的详细去设置`RestTemplate`。
多个RestTemplate对象
如果你希望创建一个未负载均衡的`RestTemplate`,可以用正常的方式来注意。访问负载均衡方式的`RestTemplate`使用`@LoadBalanced`来注解你建立的`@Bean`
@Configuration public class MyConfiguration { @LoadBalanced @Bean RestTemplate loadBalanced() { return new RestTemplate(); } @Primary @Bean RestTemplate restTemplate() { return new RestTemplate(); } } public class MyClass { @Autowired private RestTemplate restTemplate; @Autowired @LoadBalanced private RestTemplate loadBalanced; public String doOtherStuff() { return loadBalanced.getForObject("http://stores/stores", String.class); } public String doStuff() { return restTemplate.getForObject("http://example.com", String.class); } }
- 提示
如果你遇到了
java.lang.IllegalArgumentException: Can not set org.springframework.web.client.RestTemplate field com.my.app.Foo.restTemplate to com.sun.proxy.$Proxy89
的错误提示,尝试使用spring.aop.proxyTargetClass=true
的代理方式注入。
忽略网络接口
有的时候,对于服务发现注册,忽略某些命名的网络接口是非常有用的,比如使用Docker容器的时候。可以通过一些规则设置来忽略这些网络接口,下面这个配置显示了忽略“docker0”的入口,所有的入口以“veth.*”来匹配。详细的配置类见`InetUtilsProperties`。
- application.yml
spring:
cloud:
inetutils:
ignoredInterfaces:
- docker0
- veth.*
Spring Cloud Config
Spring Cloud Config提供了在分布式系统的外部配置的客户端支持。通过配置服务(Config Server)来为所有的环境和应用提供外部配置的集中管理。这些概念都通过Spring的Environment
和PropertySource
来抽象,所以它可以适用于各类Spring应用,同事支持任何语言的任何应用。它也能为你支持对应用开发环境、测试环境、生产环境的配置、切换、迁移。默认的配置实现通过git实现,同事非常容易的支持其他的扩展(比如svn等)。
快速开始
开始配置服务:
$ git clone https://github.com/spring-cloud/spring-cloud-config.git
$ cd spring-cloud-config
$ cd spring-cloud-config-server
$ ../mvnw spring-boot:run
这是一个 Spring Boot应用,你可以在IDE里面通过ConfigServerApplication
来启动。
可以看看效果:
$ curl localhost:8888/foo/development
{"name":"development","label":"master","propertySources":[
{"name":"https://github.com/scratches/config-repo/foo-development.properties","source":{"bar":"spam"}},
{"name":"https://github.com/scratches/config-repo/foo.properties","source":{"foo":"bar"}}
]}
默认通过git资源加载配置属性(使用spring.cloud.config.server.git.uri
来配置git地址)。使用这些配置来初始化一个非常轻量的SpringApplication
。这个应用的Environment
加载属性通过返回JSON对象的请求。
- 这些请求的Http资源下面这些
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
- application 根据
spring.config.name
来获得 - profile 激活的剖面,比如
spring.profiles.active = test
- label git资源的label 默认是master
必须提供一个git资源,Spring Cloud Config Server才能从远程git服务pull资源来配置,例如:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
客户端用法
配置服务一般作为单独的服务部署,各个需要的应用会添加一个客户来从配置服务获取配置。而配置服务的配置,依赖git提交的配置文件。
在Spring Boot应用里面,使用这个特性需要添加spring-cloud-config-client
的依赖。比较方便是方式是添加一个Spring Boot的starter依赖org.springframework.cloud:spring-cloud-starter-config
。对于Maven用户,有一个spring-cloud-starter-parent的父pom文件。对于Gradle和Spring CLI用户,可以用Spring IO版本管理文件。下面是Maven配置:
- pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- 上面版本可能依赖一些snapshots版本,添加spring的资源 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>http://repo.spring.io/milestone</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
创建一个简单是Spring Boot的web应用:
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
当你运行的时候,这个应用默认启动8080端口,默认它会寻找本地的8888端口的配置服务。你可以修改bootstrap.properties
文件配置服务的uri:
spring.cloud.config.uri: http://myconfigserver.com
启动加载的属性可以通过/env
来查看,它有很高的优先级:
$ curl localhost:8080/env
{
"profiles":[],
"configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"},
"servletContextInitParams":{},
"systemProperties":{...},
...
}
一条属性是"configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"}
里面的配置,它有最高优先级的。属性源中的 URL是git仓库的地址而不是配置服务器的URL。
配置服务服务端 Spring Cloud Config Server
Spring Cloud Config Server提供了一个基本Http的,资源API的,可扩展的配置(使用key-value的properties或者相似的yaml的方式)。通过添加@EnableConfigServer
非常容易的嵌入到了Spring Boot应用里面。下面是一个配置服务的app:
- ConfigServer.java
@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
public static void main(String[] args) {
SpringApplication.run(ConfigServer.class, args);
}
}
Spring Boot应用通常默认启动8080端口,Config Server通常切换到8888端口。在Config Server 的jar文件里面configserver.yml默认配置了spring.config.name=configserver
,你可以在自己的配置文件里面修改。
- application.properties
server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo
${user.home}/config-repo
是一个git资源包含YAML文件和属性文件。
在Windows系统里面,如果文件URL是绝对路径,前面有驱动符号,你需要多增加个’/’符号, file:///${user.home}/config-repo.
- 下面是在创建例如上面的Git仓库配方
$ cd $HOME
$ mkdir config-repo
$ cd config-repo
$ git init .
$ echo info.foo: bar > application.properties
$ git add -A .
$ git commit -m "Add application.properties"
使用本地的git资源最好只用作测试使用,生产环境建议使用git服务器。
初始化配置的是非常高效快速的,当你使用特别大的二进制文件,可能会遇到第一个请求延迟的情况或者服务内存溢出的情况。
- 补充
配置默认存储在tmp文件目录,linux系统默认会清理一定时间没有更新的tmp目录下的文件。生产环境上演出这一出悲剧。
资源库环境Environment Repository
Config Server的配置数据存储在哪里?
解决这个问题的是`EnvironmentRepository`,服务`Environment`对象。`Environment`对象是对Spring的Environment(其中包括 propertySources做为主要属性)的浅拷贝。Environment资源被参数化成了3个变量:
- {application} 对应客户端的”spring.application.name”
- {profile} 对应客户端的”spring.profiles.active”(逗号分隔)
- {label} 服务端依赖的资源文件标记(比如git 的master)
配置库资源实现的表形式与Spring Boot的配置相关,比如{application}参数来自”spring.config.name”,{profiles}来自”spring.profiles.active”,profiles的优先级规则也和Spring Boot应用一样。激活的profiles的优先级高于默认的,有多个profiles,最后一个起作用。与Map的set操作类似。
例如:
- bootstrap.yml
spring:
application:
name: foo
profiles:
active: dev,mysql
与Spring Boot应用程序一样,这些参数也可以通过环境变量或命令行参数进行设置。
如果配置库是基于文件的,服务器将优先根据foo.yml,在根据application.yml创建一个Environment对象。如果这些 YAML文件中有指定了Spring profiles,那么这些profiles将有较高优先级,同时如果存在指定profile后缀YAML(或properties)文件,这些文件就比默认的文件具有更高的优先级。高优先级的配置优先转成Environment对象中的PropertySource。(这和单独的Spring Boot系统使用的规则是一样的)
后端的git
EnvironmentRepository
默认情况下,通过依赖git服务来实现。git可以非常方便的修改升级配置,而且可以审查变更记录。可以在你的配置服务(比如application.yml
文件)里面添加spring.cloud.config.server.git.uri
配置指定git资源。你也可以直接使用file:
前缀来配置一个本地资源,来快速开始你的服务。为了提高配置服务的高可用性和扩展性,你需要有指向同一个版本库服务器的所有实例,所以只有一个共享文件系统是可行的。即使在这种情况下,最好是使用ssh:
协议共享文件系统存储库,以便服务器可以克隆它,并使用本地工作副本作为高速缓存。
这个资源的实现通过映射HTTP资源的{label}参数为git label(提交id,分支名称或tag)。如果git分支或tag的名称包含一个斜杠 (“/”),HTTP URL中的label需要使用特殊字符串”(_)”来替代(为了避免与URL的其他的参数路径混淆)。如果使用了命令行客户端如 curl,请谨慎处理URL中的括号(例如:在shell下请使用引号”来转义他们)。
Git URI占位符
Spring Cloud配置服务支持git资源的url使用 {application}
、 {profile}
和 {label}
占位符。这的label指的是git的label。所以,你可以很容易的为每一个应用配置资源:
spring:
cloud:
config:
server:
git:
uri: https://github.com/myorg/{application}
或者,每一个资源一个{profile}
的策略。
模式匹配和多个资源库
它还支持更复杂的规则使用application
,profile
来做模式匹配。这个模式的格式,试音逗号分隔的 {application}/{profile}
列表作为通配符。
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
repos:
simple: https://github.com/simple/config-repo
special:
pattern: special*/dev*,*special*/dev*
uri: https://github.com/special/config-repo
local:
pattern: local*
uri: file:/home/configsvc/config-repo
如果{application}/{profile}
没有匹配到任何参数,它将默认使用的spring.cloud.config.server.git.uri
定义的uri。在上面的例子中,simple
资源匹配simple/*
(匹配应用名字为simple
的所有profile
)。local
资源匹配应用名称为local/*
的所有的profile
。
注意,在上述”simple”的例子中,只使用一行来设置属性的便捷方式, 如果你需要设置其他属性(如credentials, pattern, etc.),你需要使用完整的格式才能表示清楚。
在配置里面的pattern
属性实际上是一个数组,你可以使用YAML
数组(属性文件里面使用[0]、[1])来绑定多个参数。你可能需要使用它,如果你用多个profiles来运行应用。
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
repos:
development:
pattern:
- */development
- */staging
uri: https://github.com/development/config-repo
staging:
pattern:
- */qa
- */production
uri: https://github.com/staging/config-repo
如果你的模式匹配参数不是以*
结尾,又没有包含profile,Spring Cloud会推测匹配所有的profiles,比如*/staging
是["*/staging", "*/staging,*"]
的简化写法。通常,在本地开发环境运行development
的profile,在远程环境运行cloud
的profile。
每个资源也可以选择在子目录存储配置文件,通过关键字searchPaths
来查询定义的目录。例如:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
searchPaths: foo,bar*
在这个例子里面,服务会从foo/目录和以bar开头的目录查询配置文件。
默认情况下,当第一次请求的时候,服务clone远程资源。你也可以配置在启动的时候clone。
spring:
cloud:
config:
server:
git:
uri: https://git/common/config-repo.git
repos:
team-a:
pattern: team-a-*
cloneOnStart: true
uri: http://git/team-a/config-repo.git
team-b:
pattern: team-b-*
cloneOnStart: false
uri: http://git/team-b/config-repo.git
team-c:
pattern: team-c-*
uri: http://git/team-a/config-repo.git
在这个例子里面,服务启动的时候会clone team-a
的配置,它是在接受到请求之前就进行的。其它资源则在资源第一次请求的时候clone。
远程配置的基础身份认证通过添加username
和password
属性,例如:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
username: trolley
password: strongpassword
如果你没有使用https和用户认证,也可以便捷的使用SSH,只需要将keys存储在默认的目录(~/.ssh),uri指向SSH地址(git@github.com:configuration/cloud-configuration)。服务使用JGit来访问你需要的任何配置文件。可以在~/.git/config
下配置https代理,也可以使用JVM系统属性-Dhttps.proxyHost
和-Dhttps.proxyPort
来配置。
如果你清楚你的~/.git
目录,你可以使用git config --global
来配置。比如:git config --global http.sslVerify false
。
查询占位符
Spring Cloud配置服务也支持查询路径使用 {application}
和{profile}
(如果需要{label}
)占位符。比如:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
searchPaths: '{application}'
在与application
相同名字的路径中查找配置库中的文件。在这里,通配符同样有效。
版本控制系统后端文件的使用
后面发现已经有翻译版本了:附上
- Spring Cloud Config
- http://www.xyuu.cn/spring-cloud-config-zhcn.html
- Spring Cloud Netflix
- http://www.xyuu.cn/spring-cloud-netflix-zhcn.html