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

其中服务端也成为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;

而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。

Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。

由于Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,

并且可以通过Git等客户端工具来方便地管理和访问配置内容。当然它也提供了对其他存储方式的支持,比如SVN仓库、本地化文件系统。

接下来,我们从一个简单的入门示例开始学习Spring Cloud Config服务端以及客户端的详细构建与使用方法

 

1.首先搭建spring cloud config 服务端

微服务读取配置的方式 微服务config_微服务读取配置的方式

就像搭建普通的springBoot项目一样,依赖选择spring cloud config server

需要的依赖:

<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</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>

然后启动类上加元注解:

@SpringBootApplication
@EnableConfigServer
public class ConfigserverApplication {}

然后就是配置文件

spring cloud config全局配置有三种方式,我们分别说一下

1.加载远程 git方式

微服务读取配置的方式 微服务config_spring cloud_02

其中Git等配置信息分别表示如下内容:

    ▪️spring.cloud.config.server.git.uri:配置Git仓库位置

    ▪️spring.cloud.config.server.git.searchPaths:配置仓库路径下单相对搜索位置,可以配置多个

    ▪️spring.cloud.config.server.git.username:访问Git仓库的用户名

    ▪️spring.cloud.config.server.git.password:访问Git仓库的用户密码

    ▪️spring.cloud.config.label:git仓库分支名称

    到这里,使用一个通过Spring Cloud Config实现,并使用Git管理内容等分布式配置中心就完成了。我们可以将该应用先启动起来,确保没有错误产生,然后进入下面等地学习内容。

为了验证上面完全的分布式配置中心config-server,根据git配置信息中指定的仓库位置,在https://github.com/erghjmncq6643981/demo/tree/master下创建respo目录作为配置仓库,并根据不同环境新建下面4个配置文件:

    ▪️didispace.properties

    ▪️didispace-dev.properties

    ▪️didispace-test.properties

    ▪️didispace-prod.properties

微服务读取配置的方式 微服务config_服务端_03

                                                                                                                                      githup中的文件

 

 

在这4个配置文件中均设置了一个from属性,并为每个配置文件分别设置了不同的值,如下所示:

    ▪️from=git-default-1.0

    ▪️from=git-dev-1.0

    ▪️from=git-test-1.0

    ▪️from=git-prod-1.0

微服务读取配置的方式 微服务config_微服务架构_04

 

为了测试版本控制,在该Git仓库的master分支中,我们为from属性加入1.0的后缀,同时创建一个config-label-test分支,并将各配置文件中的值用2.0作为后缀。

    完成了这些准备工作之后,我们就可以通过浏览器、POSTMAN或CURL等工具直接来访问我们的配置内容了。访问配置信息的URL与配置文件的映射关系如下所示:

    ▪️/{application}/{profile}[/{label}]

    ▪️/{application}-{profile}.yml

    ▪️/{application}-{profile}.properties

    ▪️/{label}/{application}-{profile}.properties

    上面的url会映射{application}-{profile}.properties对应的配置文件,其中{label}对应Git上不同的分支,默认为master。我们可以尝试构造不同的url来访问不同的配置内容,比如要访问kyle分支,didispace应用的prod不同的配置内容,比如,要访问kyle分支,didispace应用的prod环境,就可以访问这个url:http://localhost:8888/didispace/prod/kyle,并获得如下返回信息。

微服务读取配置的方式 微服务config_服务端_05

 

我们可以看到该JSON中返回了应用名didispace,环境名prod,分支名kyle,以及默认default环境和prod环境的配置内容。另外,之前没有提到过的version,从下图我们可以观察到,它对应的是在Git上的commit号。

微服务读取配置的方式 微服务config_微服务架构_06

同时,我们可以看到config-server的控制台中还输出了下面的内容,配置服务器在从Git中获取配置信息后,会存储一份在config-server的文件系统中,实质上config-sever是通过git clone的文件系统中,实质上config-server是通过git clone命令将配置内容复制了一份在本地存储,然后读取这些内容并返回给微服务应用进行加载。

微服务读取配置的方式 微服务config_微服务读取配置的方式_07

config-server通过Git在本地仓库暂存,可以有效防止当Git仓库出现故障而引起无法加载配置信息的情况。我们可以通过断开网络,再次发起http://localhost:8888/didispace/prod/kyle请求,在控制台中可输出Could not pull remote for kyle,但是它依然会为该请求返回配置内容,这些内容源于之前访问时存于config-server本地文件系统中的配置内容。

微服务读取配置的方式 微服务config_微服务读取配置的方式_08

2.加载 本地物理环境

application.properties中改为

#指定服务注册中心的位置 eureka.client.serviceUrl.defaultZone=http://root:abcd1234!@localhost:9001/eureka/ eureka.instance.prefer-ip-address=true # 告诉服务端,如果我20s之内没有给你发心跳,就代表我"死"了,将我踢出掉。 eureka.instance.lease-expiration-duration-in-seconds=4 # 每间隔10s,向服务端发送一次心跳,证明自己依然"存活" eureka.instance.lease-renewal-interval-in-seconds=2 spring.profiles.active=native spring.cloud.config.server.native.searchLocations= D:/config-file

微服务读取配置的方式 微服务config_服务端_09

这样就可以去读取D盘这个目录下某个文件的配置了

微服务读取配置的方式 微服务config_spring cloud_10

运行测试一下:

微服务读取配置的方式 微服务config_微服务架构_11

3.加载本地开发环境

#指定服务注册中心的位置 eureka.client.serviceUrl.defaultZone=http://root:abcd1234!@localhost:9001/eureka/ eureka.instance.prefer-ip-address=true # 告诉服务端,如果我20s之内没有给你发心跳,就代表我"死"了,将我踢出掉。 eureka.instance.lease-expiration-duration-in-seconds=4 # 每间隔10s,向服务端发送一次心跳,证明自己依然"存活" eureka.instance.lease-renewal-interval-in-seconds=2 

spring.profiles.active=native
spring.cloud.config.server.native.searchLocations=classpath:/config/

微服务读取配置的方式 微服务config_微服务读取配置的方式_12

 

运行测试一下:

微服务读取配置的方式 微服务config_微服务读取配置的方式_13

2.然后搭建 spring cloud config 客户端

 

微服务读取配置的方式 微服务config_微服务读取配置的方式_14

就像搭建普通的springBoot项目一样,依赖选择spring cloud config client

需要的依赖:

<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</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> 

我们这里客户端只测试一种方式的,比较简单,就是本地开发方式 resource/config/XXXX,,就是最后一种方式

客户端配置文件:

#微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问。spring.application.name=config-client #tomcat的端口号 server.port=8213 #指定服务注册中心的位置 eureka.client.serviceUrl.defaultZone=http://root:abcd1234!@localhost:9001/eureka/ eureka.instance.prefer-ip-address=true # 告诉服务端,如果我20s之内没有给你发心跳,就代表我"死"了,将我踢出掉。 eureka.instance.lease-expiration-duration-in-seconds=4 # 每间隔10s,向服务端发送一次心跳,证明自己依然"存活" eureka.instance.lease-renewal-interval-in-seconds=2 # 开启健康检查(需要spring-boot-starter-actuator依赖) eureka.client.healthcheck.enabled=true spring.cloud.config.uri=http://127.0.0.1:8888 #spring.cloud.config.fail-fast=true spring.cloud.config.name=configtest spring.cloud.config.profile=dev

解释一下:

 spring.cloud.config.uri  ---------config服务端地址

 spring.cloud.config.name  ---------服务端配置文件的名字

 spring.cloud.config.profile ---------服务端配置文件名字的后缀  如configtest-dev  dev就是后缀,又叫版本。(由于这里我配置的后缀是 dev ,所以读取的是 configtest-dev.properties 文件的数据,想要获取其他的配置,修改spring.cloud.config.profile配置即可)

启动类不用加其他东西,初始的就行

微服务读取配置的方式 微服务config_微服务读取配置的方式_15

下面我们写个测试类

 

微服务读取配置的方式 微服务config_微服务架构_16

 

微服务读取配置的方式 微服务config_服务端_17

 

这是那个配置文件:

微服务读取配置的方式 微服务config_微服务架构_18

最后:

               1.初始化时,注入在static代码块之后,故静态代码块无法获取远程配置信息。

               2.对spring了解浅。不懂内部原理,bug调试过程中比较费劲。

               3.对spring中的注解不了解。

个人感觉spring cloud config这个模块  不是那么的方便,不太好用,不如每个微服务都有自己的配置文件。个人感觉,个人感觉