springcloud官方文档

为什么要统一管理配置?

1、集中管理

2、不同环境不同配置

3、运行期间动态调整配置

4、自动刷新

Spring Cloud简介

为了解决上面的4个问题,spring cloud提供了spring cloud config组件。

Spring Cloud Config为分布式系统外部化配置提供了服务器端和客户端的支持,它包括Config Server和Config Client两部分。由于Config Server和Config Cleint都实现了对Spring Environment和PropertySource抽象的映射,因此,Spring Cloud非常适合Spring应用程序,当然也可与任何其他语言编写的应用程序配合使用。

Config Server是一个可横向扩展、集中式的配置服务器,它用于集中管理应用程序各个环境下的配置,默认使用Git存储配置内容(也可使用Subversion、本地文件系统或Vault存储配置),因此可以方便的实现对配置的版本控制与内容审计。

Config Client 是Config Server的客户端,用于操作存储在Config Server中的配置属性。

springcloud架构图

下面是从网上弄的一张架构图

.

每个微服务有一个Spring Cloud Client,从Spring Cloud Config Server获取配置信息,Spring Cloud Config Server从Git仓库拉取配置。

Spring Cloud Config Server基础使用

1.maven依赖

1
2
3
4
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

2.Spring Boot主类增加@EnableConfigServer注解

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableConfigServer
public class App
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class, args);
    }
}

3.application.yml配置

1
2
server.port=8888
spring.cloud.config.server.git.uri=https://gitee.com/tommy88/springcloud-demos.git

spring.cloud.config.server.git.uri配置Git仓库地址。

spring cloud config server提供了下面的映射规则:

1
2
3
4
5
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

{application}会被spring.config.name注入,{profile}是环境信息,比如dev/test/product。{label}是一个可选的git标签,默认是master。

如果查找aaa项目的application-dev.yml,输入匹配路径/aaa/dev。如果application-dev.yml存在,则返回;如果不存在,则会返回application.yml的内容。

Git仓库配置详解

Spring Cloud Config支持Git/SVN/文件系统等,默认使用的是Git。这里介绍Git在Spring Cloud Config Server中的一些配置。

1.Git uri中的通配符

Spring Cloud Config Server支持带有{application}和{profile}(和{label}的占位符的git存储库URL(如果需要),但请记住,无论如何都要将标签应用为git标签)。

所以,你可以一个应用一个仓库,比如:

1
2
3
4
5
6
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/myorg/{application}

比如有2个Git Repo,分别为aaa和bbb。比如获取aaa的dev环境的配置,通过上面的配置可以通过/aaa/dev,同理bbb的dev环境的配置则为/bbb/dev。

你也可以配置{profile}通配符,比如:

1
2
3
4
5
6
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/myorg/{application}-{profile}

2.模式匹配

通过{application}和{profile}的模式匹配,可以支持更复杂的需求。模式格式是带有{application}/{profile}通配符的使用逗号分隔的列表。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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*/test*
              uri: https://github.com/special/config-repo
            local:
              pattern: local*
              uri: file:/home/configsvc/config-repo

如果没有指定模式,则会使用/*,即匹配所有模式。

spring.cloud.config.server.git.uri是默认的git uri,如果{application}/{profile}没有匹配到任何模式,则会使用默认的git uri。

在上面的例子中,simple/模式只匹配simple应用的所有环境。special则匹配special开头的dev和test环境的配置。`local/`匹配任何以local开头任意profile的配置。

在上面的例子中,/special/dev会匹配到special-dev.yml,/special/default则会匹配到默认的application.yml。即上面说的,如果没有匹配到,会使用默认的git uri。

上面的配置中,repos其实是一个数组。所以如果使用yml也可以下面这样配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

3.搜索路径

每个Git repo还可以选择将配置文件存储在子目录中,搜索这些目录的模式可以指定为searchPaths。

1
2
3
4
5
6
7
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          searchPaths: foo,bar*

在这个例子中,Spring Cloud Config Server将会在/config-repo,/config-repo/foo和/config-repo/bar*开头的位置查找。

4.clondOnStart

默认情况下,Spring Cloud Config Server会在第一次请求配置时克隆远程仓库。可以配置在应用启动时就克隆远程仓库,这样首次请求配置就会快一些响应。

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

在上面的配置中,team-a的配置在应用启动时就会从远程仓库克隆。其他的仓库在首次请求配置时从远程仓库克隆。

上面的cloneOnStart也可以配置为全局,即在spring.cloud.config.server.git.cloneOnStart=true。配置了全局的cloneOnStart,则子repo没有配置时使用全局配置,如果子repo配置了,则使用子repo的配置。

设置cloneOnStart为true有助于在Spring Cloud Config Server启动时快速识别配资源的错误,比如仓库URI错误。这样就不至于在首次请求配置时才去检查到配置错误。

5.配置Git仓库的用户名和密码

如果git仓库时私有的,那么就需要用户名和密码才能访问。在配置git仓库URI时指定username和password即可。

1
2
3
4
5
6
7
8
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          username: trolley
          password: strongpassword

6.搜索路径中的通配符

Spring Cloud Config Server还支持带有{application}和{profile}(以及{label}的占位符的搜索路径。

例如:

1
2
3
4
5
6
7
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          searchPaths: '{application}'

在仓库中搜索与目录同名的文件(包括顶级目录/)。通配符在带占位符的搜索路径中也有效(搜索中包含任何匹配的目录)。

7.强制从Git仓库拉取更新

如前所述,Spring Cloud Config Server会克隆远程git存储库,并且如果本地副本变得脏了(例如,OS进程更改了文件夹内容),那么Spring Cloud Config Server无法从远程存储库更新本地副本。

为了解决这个问题,有一个强制拉动属性,如果本地副本很脏,它将使Spring Cloud Config Server从远程存储库强行拉取。 例:

1
2
3
4
5
6
7
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          force-pull: true

如果您有多个存储库配置,则可以为每个存储库配置force-pull属性。 例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring:
  cloud:
    config:
      server:
        git:
          uri: https://git/common/config-repo.git
          force-pull: true
          repos:
            team-a:
                pattern: team-a-*
                uri: http://git/team-a/config-repo.git
                force-pull: true
            team-b:
                pattern: team-b-*
                uri: http://git/team-b/config-repo.git
                force-pull: true
            team-c:
                pattern: team-c-*
                uri: http://git/team-a/config-repo.git

force-pull默认值是false。

8.删除Git存储库中未跟踪的分支

由于Spring Cloud Config Server在签出分支到本地存储库后具有远程git存储库的克隆(例如,通过标签获取属性),它将永久保留此分支或直到下一个服务器重新启动(这将创建新的本地存储库)。 因此可能存在删除远程分支但仍然可以获取其本地副本的情况。 如果Spring Cloud Config Server客户端服务以–spring.cloud.config.label = deletedRemoteBranch启动,那么它将从deletedRemoteBranch本地分支获取属性,但不从master获取属性。

为了保持本地存储库分支的清洁和远程 - 可以设置deleteUntrackedBranches属性。 它将使Spring Cloud Config Server强制从本地存储库中删除未跟踪的分支。 例:

1
2
3
4
5
6
7
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          deleteUntrackedBranches: true

`deleteUntrackedBranches `默认值为false。

Spring Cloud Config Client基础使用

可以参考springcloud系列13——实现分布式配置管理一节有使用的demo。

1.maven依赖

1
2
3
4
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>

2.bootstrap.properties

1
2
3
spring.cloud.config.uri=http://127.0.0.1:${config.port:8888}
spring.cloud.config.name=cloud-config
spring.cloud.config.profile=${config.profile:dev}

指定spring cloud config server的地址,应用名称和环境。

然后就可以使用配置属性了。如果是配置文件中使用,使用${配置项name}即可,比如:

1
2
3
4
5
#DB Configuration:
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = ${mysqldb.datasource.url}
spring.datasource.username = ${mysqldb.datasource.username}
spring.datasource.password = ${mysqldb.datasource.password}

如果是在java属性中,使用@Value(“${配置项那么}”)即可。

注意:config server的uri的配置必须配置在bootstrap文件中,否则会出错。比如你config server应用端口为8080,你config server的uri配置为http://localhsot:8080,实际启动时会发现是8888端口。

这是因为bootstrap文件也有一个端口,默认为8888,在应用启动时会先读取bootstrap的配置。