19.Spring Cloud之分布式配置中心Spring Cloud Config

        Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。由于Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容。当然它也提供了对其他存储方式的支持,比如:SVN仓库、本地化文件系统。

                                                                                             -----引用之点击打开链接

Spring Cloud Config为分布式系统中的外部配置提供了服务器和客户端支持。通过配置服务器,您可以在所有环境中管理应用程序的外部属性。客户端和服务器映射上的概念与Spring环境和PropertySource抽象完全一致,因此它们非常适合Spring应用程序,但可以用于任何语言中运行的任何应用程序。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序在迁移时拥有运行所需的一切。服务器存储后端的默认实现使用git,因此它可以轻松地支持带标签的配置环境版本,并且可以访问各种工具来管理内容。很容易添加替代实现并将它们与Spring配置插入。

                                                                                            ---------spring cloud官网

特性

  • Spring Cloud Config Server特性:

用于外部配置的HTTP、基于资源的API(名称-值对,或等效的YAML内容)
加密和解密属性值(对称或非对称)
可以使用@EnableConfigServer在Spring引导应用程序中轻松嵌入

  • Config Client feature(配置客户端特性(用于Spring应用程序)):

绑定到配置服务器并使用远程属性源初始化Spring环境
加密和解密属性值(对称或非对称)

初探 分布式配置中心Config Server

  • pom.xml
<project xmlns="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.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>2.spring-cloud-service-provide</groupId>
<artifactId>service-provide</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud Maven Webapp</name>
<url>http://maven.apache.org</url>
<!--springboot采用1.5.x 对应springcloud版本为 Dalston -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath />
</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.RELEASE</spring-cloud.version>
</properties>


<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</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>
<!-- 这样变成可执行的jar -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
  • 启动类

 


package com.niugang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
/**
 * config server配置
 * @author niugang
 *
 */
@SpringBootApplication
@EnableConfigServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

 

  • 配置文件

#指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问
spring.application.name=config-server
server.port=8779
# git仓库配置 主分支路径
spring.cloud.config.server.git.uri=https://gitee.com/niugangxy/springcloud
#很多场景下,可能把配置文件放在git仓库子目录下,可通过searchPaths配置,searchPaths也支持占位符
#如下配置,Config server会在git目录spring-cloud-config-respo,及其子目录下查找配置文件
spring.cloud.config.server.git.searchPaths=spring-cloud-config-respo
#git用户名
spring.cloud.config.server.git.username=xxxx
#git用户密码
spring.cloud.config.server.git.password=xxxxxx

 

https://gitee.com/niugangxy/springcloud 下新建一个 spring-cloud-config-respo文件夹,新建四个不同环境的配置文件、

niugang-dev.application配置内容为 from=git-dev-1.0

niugang-prod.application配置内容为 from=git-prod-1.0

niugang-test.application配置内容为 from=git-test-1.0

niugang.application配置内容为 from=git-default-1.0

完成了这些准备工作之后,我们就可以通过浏览器、POSTMAN或CURL等工具直接来访问到我们的配置内容了。访问配置信息的URL与配置文件的映射关系如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

 

  • 启动工程

访问http://localhost:8779/niugang/dev,返回如下数据

 



{
  "name": "niugang",//对应{application}
  "profiles": [     //对应{profile}  
    "dev"
  ],
  "label": null,   //分支名称
  "version": null, //对应git提交的commit
  "state": null,
  "propertySources": [  //dev环境配置内容
    {
      "name": "https://gitee.com/niugangxy/springcloud/spring-cloud-config-respo/niugang-dev.properties",
      "source": {
        "from": "git-dev-1.0"
      }
    },
    {    //defualt环境配置内容
      "name": "https://gitee.com/niugangxy/springcloud/spring-cloud-config-respo/niugang.properties",
      "source": {
        "from": "git-default-1.0"
      }
    }
  ]
}

 

控制台打印如下数据:


2018-06-10 12:54:30.789  INFO 5416 --- [nio-8779-exec-8] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/C:/Users/ADMINI~1/AppData/Local/Temp/config-repo-5737283323982406211/spring-cloud-config-respo/niugang-dev.properties
2018-06-10 12:54:30.789  INFO 5416 --- [nio-8779-exec-8] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/C:/Users/ADMINI~1/AppData/Local/Temp/config-repo-5737283323982406211/spring-cloud-config-respo/niugang.properties

 

先从远程加载到本地仓库,这个本地仓库是在执行时,自动建的。

每次请求Config Server,都会请求远程的Git仓库,然后存储在本地的git仓库上,这些文件会默认存储于以conig-repo为前缀的临时目录。由于其随机性以及临时目录的特征,可能会有不可预知的后果,为了避免可能会出现的问题,最好的办法就是指定一个固定的位置来存储这些重要的信息。

git配置:spring.cloud.config.server.git.basedir

svn配置:spring.cloud.config.server.svn.basedir

配置Config Client 

 客户端主要是从Config Server获取自己想要的配置。

 

  • pom.xml
<project xmlns="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.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>2.spring-cloud-service-provide</groupId>
<artifactId>service-provide</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud Maven Webapp</name>
<url>http://maven.apache.org</url>
<!--springboot采用1.5.x 对应springcloud版本为 Dalston -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath />
</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.RELEASE</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>
</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>
<!-- 这样变成可执行的jar -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>


</project>

 

  • 启动类
package com.niugang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author niugang
 *
 */
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

 

  • application.properties
#配置端口
server.port=8780

 

  • bootstrap.properties
#对应 config server所获取的配置文件的{application}
spring.application.name=niugang
#对应config server所获取的配置文件的{profile}
spring.cloud.config.profile=dev
#指定git仓库的分支,对应config server所获取的配置文件的{label}
spring.cloud.config.label=master
#指定config server地址,即配置Config Server地址,默认为http://localhost:8888 
spring.cloud.config.uri=http://localhost:8779

bootstrap.properties解释:

为什么要把从Config Server获取配置信息的配置放在bootstrap.properties中。这源于Spring Boot对配置文件的加载顺序,对于本应用jar包之外的配置文件加载会优先于应用jar包内的配置内容,而通过bootstrap.properties对Config Server的配置,使得该应用会从Config Server中获取一些额外的配置,这些信息的配置的优先级高于于本地内容配置。

boostrap.properties对应“引导上下文/父上下文”,父上下文加载优先级高。

 

  •  测试Controller
package com.niugang.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigClientController {
/**
* 从niugang-dev.properties中获取配置的from值
*/
@Value("${from}")
private String from;
@RequestMapping("/profile")
public String profile() {
return this.from;
}
}

 

显示内容为niugang-dev.application中配置的内容

 

 

  • 错误穿插(重要)

   config客户端的项目里不能有spring-cloud-config-server这个jar的依赖 否则不管怎么改bootstrap.properties都会出现Could not resolve placeholder 'from' in value ${from}。

图解上面运行机制

 

客户端从配置管理中获取配置信息流程

#1.主要为应用启动时,向Config server 获取配置信息
#2.Conifg server根据自己维护的git地址和Config client传来的配置定位信息查找配置信息
#3.通过git clone命令将找到的配置信息下载到Config Server的文件系统中
#4.Config Server创建Springde ApplicationContext实例,并从git本地仓库中加载配置文件,最后将配置文件读取返回给客户端应用
#5.客户端应用在获得外部配置文件后加载到客户端的ApplicationContext实例,该配置内容的优先级高于客户端Jar包内部的配置内容,所以Jar包中重复的内容将不再加载

             

 微信公众号

 

 

posted @ 2020-01-14 17:00  盲目的拾荒者  阅读(334)  评论(0编辑  收藏  举报