文档章节

Spring Cloud Config 统一配置中心

TurboSanil
 TurboSanil
发布于 04/24 23:30
字数 1455
阅读 154
收藏 1

Spring Cloud Config 统一配置中心

一、统一配置中心

统一管理配置

通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如果需要多环境配置,可以设置多个 application-{profile}.yml,再通过 spring.profiles.active={profile} 来实现多环境的切换。这样的管理对于单体应用或者说划分的服务不多的情况下没什么问题,但如果是一个微服务架构的应用系统有着很多个微服务,集中管理配置就非常必要了

对于这样的配置管理,我们会希望它

  • 集中化管理配置
  • 多环境多配置
  • 可动态调整并自动更新

Spring Cloud Config 配置中心

Spring Cloud Config 为分布式系统外部化配置提供了服务器端和客户端的支持,分为 Config Server 和 Config Client

Config Server 是用来集中管理应用程序的各个环境下的配置,默认是使用 Git 来存储配置内容的,可以很方便的对配置实现版本管理(也支持 Subversion 和本地化文件系统存储)

Config Client 即用来获取 Config Server 中存储的配置内容

二、使用

创建 Config Server

创建一个 Spring Boot 工程,maven 添加 spring-cloud-config-server

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/>
</parent>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在程序启动类上添加注解 @EnableConfigServer ,开启配置服务器的功能

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

Config Server 默认是使用 Git 来存储配置内容的,下面来配置下 git 仓库的相关信息

application.yml

server:
  port: 8888

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          # git 仓库地址
          uri: https://github.com/Morgan412/weixin-order
          # 仓库下的搜索路径
          search-paths: conf
          # git仓库账号
          username:
          # git仓库密码
          password: 

如果是公开仓库可以不用账号和密码,在仓库的 conf/ 目录下建立如下的配置文件

  • product.yml
  • product-dev.yml
  • product-pro.yml

每个文件中分别填入如下配置内容

  • profile: default
  • profile: dev
  • profile: pro

Config Server 的端点

使用 Config Server 的端点可以获取配置文件的内容,请求地址与配置文件的映射如下:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

上面的地址都可以映射到 {application}-{profile}.properties/yml 配置文件,{label} 表示对应 Git 仓库的分支,默认是 master

启动上面的 config-server 项目,通过 url 访问远程 Git 仓库 master 分支下 conf 目录下的 product-dev.yml 配置文件内容

通过 http://localhost:8888/product/dev 访问,可以获得应用名称、profile、git label、git version、配置文件URL、配置内容等信息

{
    "name": "product", 
    "profiles": [
        "dev"
    ], 
    "label": null, 
    "version": "052661b72043aad390e6774666b5594d6e0ba116", 
    "state": null, 
    "propertySources": [
        {
            "name": "https://github.com/Morgan412/weixin-order/conf/product-dev.yml", 
            "source": {
                "profile": "dev"
            }
        }, 
        {
            "name": "https://github.com/Morgan412/weixin-order/conf/product.yml", 
            "source": {
                "profile": "default"
            }
        }
    ]
}

http://localhost:8888/product-dev.ymlhttp://localhost:8888/product-dev.properties 只会获取到配置文件中的属性,包括 {application}.yml/properties 中的属性

配置 Config Client

上面创建了一个 Config Server 来集中管理配置,那下面来配置 Config Client 让微服务获取配置信息

同样是创建一个 Spring Boot 工程,添加 Config Client 的依赖,这里省略了其他依赖

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

相关配置如下

server:
  port: 8082
spring:
  application:
  	# 对应 config server 所获取的配置文件 {application}
    name: product
  cloud:
    config:
      # 指定 config server 的地址,默认是 http://localhost:8888
      uri: http://localhost:8888
      # 对应配置文件的 {profile}
      profile: dev
      # 分支
      label: master

上面的配置可以从 /{application}/{profile}/{label} 获取对应 config server 中的配置文件中的属性,其中

  • application 对应 ${spring.application.name}
  • profile 对应 ${spring.profiles.active} (实际就是 Environment.getActiveProfiles())
  • label 是存储仓库的分支,默认是 master

另外这些都可以通过设置 spring.cloud.config.* (*nameprofilelabel) 来覆盖

如果这时就启动该服务,就可能会出现一些问题,因为上面关于 config client 的配置需要放到 bootstrap.yml 而不是 application.yml

我们来想一个问题,我们交给 config server 集中管理的配置内容是不是原本应该放在 application.yml 中在程序启动的时候被加载的,而现在我们把获取配置内容的 config client 相关配置放在了 application.yml 中,这样是不是就有点不对了,因为这里会出现一个先后顺序的问题。如果我们把配置放在了 application.yml 中,那么它会先去加载 bootstrap.yml 的配置属性(如果没有,会加载默认配置),假如我们在 application.yml 中配置的 uri 端口是 8080,那么它将不会被应用,还是默认的 8888 端口

Spring Cloud 有一个 引导上下文 的概念,它是主应用程序的父上下文,这个引导上下文负责从外部源(配置服务器,如Config Server)加载配置属性,及解密外部配置文件中的属性。主应用程序加载的是 application.(properties/yml) 中的属性,引导上下文加载 bootstrap.(properties/yml) 中的属性。这两个上下文共享一个Environment,但配置在 boostrap.* 中的属性有更高的优先级,因此默认情况下不能被本地配置覆盖。

设置 spring.cloud.bootstrap.enabled=false 可以禁用引导过程

可以来写个 Controller 来测试一下获取配置

@RestController
class ConfigClientController {

    @Value("${profile}")
    private String profile;

    @RequestMapping("/profile")
    public String getProfile() {
        return this.profile;
    }
}

© 著作权归作者所有

TurboSanil
粉丝 2
博文 46
码字总数 93143
作品 0
广州
程序员
私信 提问
Spring Cloud配置中心

Spring Cloud配置中心(Config) Spring Cloud是现在流行的分布式服务框架,它提供了很多有用的组件。比如:配置中心、Eureka服务发现、 消息总线、熔断机制等。 配置中心在Spring Cloud的众...

Java同学会
2018/06/21
0
0
SpringCloud(Finchley版)5 - Config-Server

一, 简介 在分布式系统中, 由于服务数量巨多, 为了方便服务配置文件统一管理, 实时更新, 所以需要分布式配置中心组件. 在 spring cloud 中, 有分布式配置中心组件spring cloud config, 它支持...

ge洋
01/11
23
0
白话SpringCloud | 第七章:分布式配置中心的使用

前言 介绍完服务的容错保护处理,接下来我们来了解下关于分布式配置中心的相关知识和使用。众所周知,随着项目的越来越多,日益庞大,每个子项目都会伴随着不同的配置项,于此也就多了很多的...

oKong
2018/10/10
772
1
Spring云源生应用-中心化配置

一切从配置开始 在微服务架构概念索引一文中介绍了整个云源生应用的搭建体系,后续的内容将会从Spring Cloud从技术架构,到基础设置再到团队协作方式一点一滴的记录搭建整个云服务的过程。现...

随风溜达的向日葵
04/11
168
0
java B2B2C 多租户电子商城系统-(六)分布式配置中心(Spring Cloud Config)

一、简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持...

01/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

DevOps是如何实现效率的提升?

随着企业业务对软件系统日益依赖,IT管理与研发模式也随之对“敏态”模式产生了需求,也就是今天时常提起的DevOps。提升效率,是DevOps实践的核心内容之一。就让我们来一起从软件生命周期的业...

嘉为科技
6分钟前
2
0
总结:linux目录之proc

我们系统大部分的基础数据采集,其实就是读取proc目录下的文件,并解析获取数据的过程。 1、如cpu利用率:直接cat /proc/cpuinfo命令,然后获取输出内容,并解析里面的数据,如cpu核数等; ...

浮躁的码农
8分钟前
2
0
比原Bapp红包应用

喜迎国庆期间,比原链在自己的移动端钱包Bycoin(下载地址)和google插件钱byone中推出了红包应用,在国庆期间深受大家好评。 那我们今天就来大概介绍一下比原红包,以及基于比原链开发dapp应用...

比原链Bytom
9分钟前
2
0
Linux中没有rc.local文件的解决方法

Linux中没有rc.local文件的解决方法是什么呢?这应该是很多工程师比较头疼的问题,下面就给大家例举几个解决办法。 比较新的Linux发行版已经没有rc.local文件了。因为已经将其服务化了。 解决...

xiangyunyan
9分钟前
2
0
数据中台在阿里巴巴集团内部的实践情况

作者:品鉴 数据中台门在阿里巴巴集团干什么的,由哪个部门掌管?数据中台在阿里巴巴的主要作用是什么呢?外面吹嘘这么神秘的数据中台在阿里实践的如何呢?今天小编正好要采访数据技术及产品...

阿里云官方博客
9分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部