您的位置:首页 > 编程语言 > Java开发

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 专注于提供良好开箱即用的典型方案和可扩展方式。

分布式/版本化配置

服务注册/服务发现

路由

服务间调用

负载均衡

断路器

全局锁

领导选取和集群状态监控

分布式消息

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
观察到这些值被改变,会触发这些事情:

重新绑定
@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
更多信息请查看:

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.properties

server.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.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}[/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] 
在这个例子里面,服务启动的时候会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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息