欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springcloud系列24——SpringCloud配置管理

程序员文章站 2022-06-13 13:50:50
...

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架构图

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

springcloud系列24——SpringCloud配置管理.

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

Spring Cloud Config Server基础使用

1.maven依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

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

@SpringBootApplication
@EnableConfigServer
public class App
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class, args);
    }
}

3.application.yml配置

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提供了下面的映射规则:

/{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标签)。

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

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}通配符,比如:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/myorg/{application}-{profile}

2.模式匹配

通过{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*/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也可以下面这样配置:

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。

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会在第一次请求配置时克隆远程仓库。可以配置在应用启动时就克隆远程仓库,这样首次请求配置就会快一些响应。

比如:

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即可。

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}的占位符的搜索路径。

例如:

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从远程存储库强行拉取。 例:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          force-pull: true

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

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强制从本地存储库中删除未跟踪的分支。 例:

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依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>

2.bootstrap.properties

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}即可,比如:

#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的配置。

相关标签: springcloud