Spring Cloud Config 是一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,他分为服务端和客户端两个部分。服务端也称为分布式配置中心,是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密、解密信息等访问接口;而客户端则是为微服务架构中的各个微服务应用,通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。服务端与客户端的结构图如下:

 
 

 
 

Spring Cloud 程序在进行初始化时会先建立一个 Bootstrap Context(引导上下文),然后再创建主应用的上下文,主应用程序上下文读取的时 application.yml (或 properties)文件,而引导上下文则会读取 bootstrap.yml(或 properties)文件。因为,applicatyon.yml 的配置会在 bootstrap.yml 后加载,如果存在两份配置文件同时存在,且存在相同 key 的配置,则 application.yml 的配置会覆盖 bootstrap.yml 的配置。下面是 Spring Boot 对配置文件读取的优先级:

  • 命令行中传入的参数
  • SPRING_APPLICATION_JSON中的属性,SPRING_APPLICATION_JSON 是以JSON格式配置在系统环境变量中的内容
  • java:comp/env 中的 JNDI 属性
  • java 的系统属性,可以通过System.getProperties()获取的内容
  • 操作系统的环境变量
  • 通过 random.* 配置的随机属性
  • 位于当前应用 Jar 包之外,针对不同{profile}环境的配置文件内容
  • 位于当前应用 Jar 包之内,针对不同{profile}环境的配置文件内容
  • 位于当前应用 Jar 包之外的 application.properties 配置内容
  • 位于当前应用 Jar 包之内的 application.properties 配置内容
  • 在 @Configuration 注解修改的类,通过 @PropertySource 注解定义的属性
  • 应用默认属性,使用 SpringApplication.setDefaultProperties 定义的内容

可以看到其中 7 和 9 步骤都是从应用Jar包之外读取配置文件,所以,实现外部化配置的原理就是从此切入,为其指定外部配置文件的加载位置来取代 Jar 包之内的配置内容。

 
 

集群配置中心示例

  • 分布式配置中心
    • 创建项目

      创建 Spring Cloud 项目,增加 spring-cloud-config-server 依赖,由于使用 SVN 仓库,还需要增加svnkit 依赖,POM.xml 文件内容如下:

      <?xmlversion="1.0"encoding="UTF-8"?>

      <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

      <modelVersion>4.0.0</modelVersion>

       
       

      <groupId>org.lixue.config</groupId>

      <artifactId>spring-cloud-config</artifactId>

      <version>0.0.1-SNAPSHOT</version>

      <packaging>jar</packaging>

       
       

      <name>spring-cloud-config</name>

      <description></description>

       
       

      <parent>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-parent</artifactId>

      <version>1.5.12.RELEASE</version>

      <relativePath/><!--lookupparentfromrepository-->

      </parent>

       
       

      <properties>

      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

      <java.version>1.8</java.version>

      <spring-cloud.version>Dalston.SR5</spring-cloud.version>

      </properties>

       
       

      <dependencies>

      <dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-config-server</artifactId>

      </dependency>

      <dependency>

      <groupId>org.tmatesoft.svnkit</groupId>

      <artifactId>svnkit</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>${spring-cloud.version}</version>

      <type>pom</type>

      <scope>import</scope>

      </dependency>

      </dependencies>

      </dependencyManagement>

       
       

      <build>

      <plugins>

      <plugin>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-maven-plugin</artifactId>

      </plugin>

      </plugins>

      </build>

      </project>

       
       

    • 增加配置

      在 src/main/resources 目录中创建 application.yml 配置文件,增加基本配置和SVN仓库相关配置,如下:

      #配置应用名称

      spring:

      application:

      name:spring-cloud-config

      #配置使用subversion仓库读取配置,相关配置还有git、native(本地文件)、vault

      profiles:

      active:subversion

      cloud:

      config:

      server:

      #配置svn仓库地址和账户

      svn:

      uri:http://192.168.2.210/svn/config

      username:lixue

      password:liyong

      #配置默认分支,默认值为trunk

      default-label:trunk

      #设置本地文件存储目录

      basedir:e:\temp\config

       
       

      #服务端口

      server:

       
       

      配置是通过 spring.profiles.active 的值来决定使用那种仓库读取配置文件,主要有以下四种:

      • git:默认值,表示从 Git 仓库读取配置文件
      • subversion:表示从 SVN 仓库读取配置文件
      • native:表示从本地文件系统读取配置文件,本地文件默认是在 /src/main/resources目录下读取文件,也可以使用 spring.cloud.config.server.native.searchLocations 属性来指定具体的配置文件位置
      • vault:表示从 vault 读取配置文件,Vault 是一款资源控制工具,可对资源实现安全访问

       
       

    • 启动类

      在启动类使用注解 @EnableConfigServer 来标注,启动配置服务器的功能,如下:

      package org.lixue.config;

       
       

      import org.springframework.boot.SpringApplication;

      import org.springframework.boot.autoconfigure.SpringBootApplication;

      import org.springframework.cloud.config.server.EnableConfigServer;

       
       

      @EnableConfigServer

      @SpringBootApplication

      public class SpringCloudConfigApplication{

       
       

      public static void main(String[]args){

      SpringApplication.run(SpringCloudConfigApplication.class,args);

      }

      }

       
       

    • SVN仓库

      我们创建一个 SVN 仓库,必须要支持使用 http 或 https 来访问仓库内容,配置方式参考"用 Apache 和 Subversion 搭建安全的版本控制环境",其目录结构如下:

       
       

  • 配置客户端
    • 创建项目

      创建 Spring Cloud 项目,增加 spring-cloud-config 依赖,POM.xml 文件内容如下:

      <?xmlversion="1.0"encoding="UTF-8"?>

      <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

      <modelVersion>4.0.0</modelVersion>

       
       

      <groupId>org.lixue.config</groupId>

      <artifactId>spring-cloud-config-client</artifactId>

      <version>0.0.1-SNAPSHOT</version>

      <packaging>jar</packaging>

       
       

      <name>spring-cloud-config-client</name>

       
       

      <parent>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-parent</artifactId>

      <version>1.5.12.RELEASE</version>

      <relativePath/><!--lookupparentfromrepository-->

      </parent>

       
       

      <properties>

      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

      <java.version>1.8</java.version>

      <spring-cloud.version>Dalston.SR5</spring-cloud.version>

      </properties>

       
       

      <dependencies>

      <dependency>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-web</artifactId>

      </dependency>

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

       
       

      <dependencyManagement>

      <dependencies>

      <dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-dependencies</artifactId>

      <version>${spring-cloud.version}</version>

      <type>pom</type>

      <scope>import</scope>

      </dependency>

      </dependencies>

      </dependencyManagement>

       
       

      <build>

      <plugins>

      <plugin>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-maven-plugin</artifactId>

      </plugin>

      </plugins>

      </build>

      </project>

       
       

    • 启动类

      配置客户端的启动类,不需要额外处理,这里我们增加了一个 REST 服务,用来验证配置获取,如下:

      package org.lixue.config;

       
       

      import org.springframework.beans.factory.annotation.Autowired;

      import org.springframework.boot.SpringApplication;

      import org.springframework.boot.autoconfigure.SpringBootApplication;

      import org.springframework.core.env.Environment;

      import org.springframework.web.bind.annotation.RequestMapping;

      import org.springframework.web.bind.annotation.RequestMethod;

      import org.springframework.web.bind.annotation.RestController;

       
       

      @RestController

      @SpringBootApplication

      public class SpringCloudConfigClientApplication{

       
       

      public static void main(String[]args){

      SpringApplication.run(SpringCloudConfigClientApplication.class,args);

      }

       
       

      @Autowired

      private Environment environment;

       
       

      @RequestMapping(path="/",method=RequestMethod.GET)

      public String getApplicationName(){

      return environment.getProperty("spring.application.name");

      }

      }

       
       

    • 增加配置

      客户端要在引导程序中读取配置服务器的配置,因此要 src/main/resources 目录下创建 bootstrap.yml 配置,并增加配置中心的相关配置项:

      #配置应用名称

      spring:

      application:

      name:spring-cloud-config-client

      #配置分布式配置中心地址和相关配置

      cloud:

      config:

      uri:http://localhost:8080

      #表示分支,客户端配置后,会替换到分布式配置中心的default-lable配置

      label:test

      #表示配置文件名称,如果不配置则使用spring.application.name配置项

      name:spring-cloud-config-client

      #表示配置文件的profile,实际获取文件为${spring.cloud.config.name}-${spring.cloud.config.profile}.yml

      profile:dev

       
       

      以上配置表示要获取的地址为 http://localhost:8080/test/spring-cloud-config-client-dev.yml ,地址的解析如下:

      ${config.uri}/${config.label}/$(config.name}-${config.profile}.(yml 或 properties)

      其中,spring.cloud.config.name 如果不存在,则会使用 spring.application.name ,如果都不存在,则会使用 "application";在实际环境中,可能存在多个配置文件,例如专门针对 zuul 的,专门针对 hystrix 的,可以在spring.cloud.config.profile 配置项配置多个,以逗号分隔,这样就会去读取多个配置文件。

  • 测试验证

    测试验证需要依赖 SVN 和分布式配置中心,首先启动 SVN 和 spring-cloud-config 项目,然后启动 spring-cloud-config-client 项目,在 SVN 的 test 分支下创建文件 spring-cloud-config-client-dev.yml 并提交,文件内容如下:

    spring:

    application:

    name:spring-cloud-config-client-test-branch-dev

    server:

    访问地址 http://localhost:8012/ 可以看到如下返回,表示从 SVN 获取到的配置文件已经生效:

    spring-cloud-config-client-test-branch-dev

     
     

     
     

 
 

Spring Cloud(Dalston.SR5)--Config 集群配置中心的更多相关文章

  1. Spring Cloud(Dalston.SR5)--Config 集群配置中心-刷新配置

    远程 SVN 服务器上面的配置修改后,需要通知客户端来改变配置,需要增加 spring-boot-starter-actuator 依赖并将 management.security.enabled 设 ...

  2. Spring Cloud(Dalston.SR5)--Config 集群配置中心-加解密

    实际应用中会涉及很多敏感的数据,这些数据会被加密保存到 SVN 仓库中,最常见的就是数据库密码.Spring Cloud Config 为这类敏感数据提供了加密和解密的功能,加密后的密文在传输给客户端 ...

  3. Spring Cloud(Dalston.SR5)--Zuul 网关-路由配置

    Spring Cloud 在 Zuul 的 routing 阶段实现了几个过滤器,这些过滤器决定如何进行路由工作. 简单路由(SimpleHostRoutingFilter) 该过滤器运行后,会将 H ...

  4. spring boot 2.0.3+spring cloud (Finchley)6、配置中心Spring Cloud Config

    https://www.cnblogs.com/cralor/p/9239976.html Spring Cloud Config 是用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持, ...

  5. Spring Cloud(Dalston.SR5)--Eureka 服务提供者

    要使微服务应用向注册中心发布自己,首先需要在 pom.xml 配置文件中增加对 spring-boot-starter-eureka 的依赖,然后在主类中增加 @EnableDiscoveryClie ...

  6. Spring Cloud(Dalston.SR5)--Eureka 注册中心搭建

    基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务治理可以说是微服务架构中最为核心和基础的模块,他主要用来实现各个微服务实例的自动化注册与发现 服务注册:在 ...

  7. Spring+quartz 实现定时任务job集群配置

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

  8. Spring+quartz 实现定时任务job集群配置【原】

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

  9. Spring Cloud学习笔记【九】配置中心Spring Cloud Config

    Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端 ...

随机推荐

  1. EL条件判断用法<c:choose>

    EL表达式一般不直接用==,!=,>,<,>=,<=之类的表示相等.不等于.大于.小于.大于等于以及小于等于,而是使用字母表示,如下: ==     eq   等于 !=   ...

  2. 『TensorFlow』使用集合collection控制variables

    Variable Tensorflow使用Variable类表达.更新.存储模型参数. Variable是在可变更的,具有保持性的内存句柄,存储着Tensor 在整个session运行之前,图中的全部 ...

  3. django-celery的配置及使用

    Celery简介 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理 celery的应用 异步调用:那些用户不关心的但是又存在在我们API里面的操作 ...

  4. requestAnimationFrame 兼容不同浏览器

    简单兼容: window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitReq ...

  5. C++将数组的元素顺序随机打乱

    参考: https://blog.csdn.net/cordova/article/details/52884399 https://zhidao.baidu.com/question/1604258 ...

  6. 禁用cookie后的方法

    保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给 服务器.一般这个cookie的名字都是类似于SEEESIONID.但cookie可以被人为 ...

  7. 【Java集合系列三】Vector-Stack解析

    2017-07-29 12:59:14 一.简介 1.Vector继承关系 2.Vector类扩容 Vector类的实现和ArrayList极其相似,都使用数组存储元素,但是扩容策略不一样,Array ...

  8. centos7源码安装Python3的前提条件

    centos7源码安装Python3的前提条件: # yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline- ...

  9. 用记事本编写helloworld文件但是javac时报错

    刚开始编写第一个java文件时遇到的错误: javac HelloWorld.java HelloWorld.java:1: 错误: 写入HelloWorld时出错: HelloWorld.class ...

  10. Python基础02_基本数据类型_以及while

    基本数据类型: 字符串: 字符串可以相加, 表示连接; 可以将字符串乘以某个数,表示将此字符串复制多少次. 数: 数的加减乘除取余等. 需要注意的是两个乘号**和两个除号/ / python2中的除法 ...