Spring Cloud中文文档
2016-08-29 20:17
281 查看
Spring Cloud 为开发人员提供了一系列的工具来快速构建分布式系统的通用模型 。例如:配置管理、服务发现、断路由、智能路由、微代理、控制总线、一次性Token、全局锁、决策竞选、分布式session、集群状态等等。分布式系统的协助需要一大堆的模型,使用Spring Cloud开发者能快速的建立支持实现这些模式的服务和应用程序。他们将适用于任何分布式环境,无论是开发者的个人电脑还是生产环境,还是云平台。
版本:Brixton.SR3
作者:链上研发-欧阳
(注:阅读前置技能树 Spring 以及Spring的 Property Source、Environment、Profile 和 Spring Boot ,原始文档有些没头没尾的,适当添加了些内容。)
Spring 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遇到
更多信息请查看:
Java 6 JCE
Java 7 JCE
Java 8 JCE
提取文件到JDK/jre/lib/security文件夹(无论你使用的那个版本的JRE/JDK x64/x86)
注意:
Spring Cloud是基于非限制性的Apache 2.0 license发布的。如果你发现文档有问题,或只是想提高它们的质量,请到github上参与进来。
`Bootstrap context`和`Application Context`有着不同的约定,所以新增了一个`bootstrap.yml`文件,而不是使用`application.yml` (或者`application.properties`)。保证`Bootstrap Context`和`Application Context`配置的分离。下面是一个例子:
**bootstrap.yml**
推荐在`bootstrap.yml` or `application.yml`里面配置`spring.application.name`.
你可以通过设置`spring.cloud.bootstrap.enabled=false`来禁用`bootstrap`。
“bootstrap” : 如果在
“applicationConfig: [classpath:bootstrap.yml]” (如果有
由于优先级规则,
你可以很容易的扩展任何你建立的上下文层次,可以使用它提供的接口,或者使用
注意
-
-
源文件见
警告
小心,你添加的自定义
下面是一个自定义的例子:
如果你建立了一个jar包,里面添加了一个
那么,”customProperty“的
重新绑定
根据
默认情况下,Config Client不轮询
修改
注意
@RefreshScope注解在一个
如果使用Sun的JDK遇到`Illegal key size`异常,需要安装JCE
更多信息请查看:
Java 6 JCE
Java 7 JCE
Java 8 JCE
提取文件到JDK/jre/lib/security文件夹(无论你使用的那个版本的JRE/JDK x64/x86)。
POST to /env 更新
/refresh 重新初始化添加了
/restart 重启初始化ApplicationContext,重启 (默认是禁用的)
/pause and /resume 调用ApplicationContext生命周期的方法
警告
这里的URI需要使用虚拟主机名,比如服务名称,而不是Host名称。Ribbon客户端用它来建立一个完整的物理地址。可以查看`RibbonAutoConfiguration`的详细去设置`RestTemplate`。
提示
如果你遇到了
application.yml
这是一个 Spring Boot应用,你可以在IDE里面通过
可以看看效果:
默认通过git资源加载配置属性(使用
这些请求的Http资源下面这些
application 根据
profile 激活的剖面,比如
label git资源的label 默认是master
必须提供一个git资源,Spring Cloud Config Server才能从远程git服务pull资源来配置,例如:
版本: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
更多信息请查看:
Java 6 JCE
Java 7 JCE
Java 8 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观察到这些值被改变,会触发这些事情:
重新绑定
@ConfigurationPropertiesbean到上下文
根据
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,在使用它初始化的时候是延迟代理的。通过
RefreshEndpointBean来控制。或者
/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
更多信息请查看:
Java 6 JCE
Java 7 JCE
Java 8 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和use
@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[/code]客户端用法
配置服务一般作为单独的服务部署,各个需要的应用会添加一个客户来从配置服务获取配置。而配置服务的配置,依赖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[/code]
启动加载的属性可以通过/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.propertiesserver.port: 8888 spring.cloud.config.server.git.uri: file://${user.home}/config-repo${user.home}/config-repo是一个git资源包含YAML文件和属性文件。
在Windows系统里面,如果文件URL是绝对路径,前面有驱动符号,你需要多增加个’/’符号, e.g. 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.ymlspring: 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}[/code]
或者,每一个资源一个{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[/code]
如果你的模式匹配参数不是以*结尾,又没有包含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[/code]
在这个例子里面,服务启动的时候会cloneteam-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
相关文章推荐
- Spring Cloud Netflix中文文档翻译笔记
- SpringLDAP-Reference (中文文档一)
- SpringLDAP-Reference (中文文档三)
- Spring_Security_3.0.1 中文参考文档chapter 6 核心服务
- spring boot官方中文文档
- 参与 Spring 4 中文文档翻译
- 【spring+hibernate学习文档】---中文参数查询
- springboot中文文档笔记
- Spring Mina 中文文档 用户手册
- Spring_Security_3.0.1中文参考文档 2 Security命名空间配置
- spring-data-jpa 中文文档(2)
- SpringLDAP-Reference (中文文档四)
- 各位大虾,帮帮忙.求spring3.0的中文文档
- SpringLDAP-Reference(中文文档)(五)
- spring_security_3.0.1中文参考文档PartII结构和实现
- SpringLDAP-Reference (中文文档二)
- SpringLDAP-Reference(中文文档)(三)
- spring 开发必备中文文档
- Spring_Security_3.0.1中文参考文档 Chapter 8.核心安全过滤器
- Spring中文文档在线版 2.5.2