Cloud Config服务端以及客户端的详细构建与使用方

2019-10-05 18:22栏目:美高梅开户送58元官网
TAG:

本篇源于Spring Cloud Config的一个问题,但这个问题并非所有人都会遇到。如果您遇到了,那必须得看看这篇,如果没有遇到您也应该看看,防患于未然!

Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持。配置服务器为各应用的所有环境提供了一个中心化的外部配置。它实现了对服务端和客户端对Spring Environment和PropertySource抽象的映射,所以它除了适用于Spring构建的应用程序,也可以在任何其他语言运行的应用程序中使用。作为一个应用可以通过部署管道来进行测试或者投入生产,我们可以分别为这些环境创建配置,并且在需要迁移环境的时候获取对应环境的配置来运行。

美高梅网上游戏 ,前言

问题描述

之前有朋友提出Spring Cloud Config的配置中心在运行一段时间之后,发现修改了配置信息,但是微服务应用并拿不到新的配置内容。同时,发现配置中心存储配置的目录/tmp 的配置内容被清空了。

配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。当然他也提供本地化文件系统的存储方式,下面从这两方面介绍如何使用分布式配置来存储微服务应用多环境的配置内容。

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

原因与解决

首先,分析一下上面的问题,其实已经有一定的线索。表面现象是微服务从配置中心获取配置信息的时候获取不到最新的配置,而其根本原因就是在/tmp目录下的缓存仓库已经被清空了,所以导致无法正常的通过Git获取到最新配置,那么自然各个微服务应用就无法获取最新配置了。

其实该问题在Spring Cloud的官方文档中也有对应的说明,原文如下:

With VCS based backends files are checked out or cloned to the local filesystem. By default they are put in the system temporary directory with a prefix of config-repo-. On linux, for example it could be /tmp/config-repo-<randomid>. Some operating systems routinely clean out temporary directories. This can lead to unexpected behaviour such as missing properties. To avoid this problem, change the directory Config Server uses, by setting spring.cloud.config.server.git.basedir or spring.cloud.config.server.svn.basedir to a directory that does not reside in the system temp structure.

根据上面的内容,我们可以知道在某些系统中,对于/tmp目录进行周期性的清理,所以也就有了上面所说的问题。

从文档中我们也已经知道如果去解决该问题,无非就是通过spring.cloud.config.server.git.basedirspring.cloud.config.server.svn.basedir参数来指定一个不会被定期清理的目录。比如,我们可以设置:

spring.cloud.config.server.git.basedir=config-repo

通过Spring Cloud构建一个Config Server,非常简单,只需要三步:

快速入门

其他问题

这里需要注意一下,该参数的设置依然有一定的问题。按理解,如上配置的话,应该是在配置中心程序所在的目录下创建一个config-repo目录来进行存储。但是,在测试了Dalston SR1和SR2版本之后,发现该配置只会将内容存储到配置中心程序的同一级目录下,并不会创建一个config-repo目录。

但是,如果我们这样设置,就可以将配置的缓存内容存储在配置中心所在目录下的config-repo目录中了:

spring.cloud.config.server.git.basedir=config-repo/config-repo
  • pom.xml中引入spring-cloud-config-server依赖,完整依赖配置如下:

    在本节中,我们将演示如何构建基于Git存储的分布式配置中心,同时对配置的详细规则进行讲解,并在客户端中演示如何通过配置指定微服务应用的所属配置中心,并让其能够从配置中心获取配置信息并绑定到代码中的整个过程。

推荐阅读

  • Spring Boot基础教程
  • Spring Cloud基础教程
  • Eureka注册中心
  • Spring Boot 1.4中文文档

更多Spring Boot/Cloud干货请持续关注我的博客、公众号(搜索:程序猿DD或didispace),想深入探讨的朋友可以加入我的知识星球。

本文首发于我的博客:

构建配置中心

 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <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>Brixton.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

通过Spring Cloud Config构建一个分布式配置中心非常简单,只需要以下三步。

  • 创建Spring Boot的程序主类,并添加@EnableConfigServer注解,开启Config Server

    ▪️创建一个基础的Spring Boot工程,命名为config-server,并在pom.xml中引入下面的依赖:

美高梅网上游戏 1

@EnableConfigServer@SpringBootApplicationpublic class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web.run; }}

pom.xml

  • application.properties中配置服务信息以及git信息,例如:

    ▪️创建Spring Boot的程序主类,并添加@EnableConfigServer注解,开启Spring Cloud Config的服务端功能。

美高梅网上游戏 2

spring.application.name=config-serverserver.port=7001# git管理配置spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/SpringBoot-Learning/spring.cloud.config.server.git.searchPaths=Chapter9-1-4/config-repospring.cloud.config.server.git.username=usernamespring.cloud.config.server.git.password=password

主启动类

  • 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仓库的用户密码

    ▪️在application.properties中添加配置服务的基本信息以及Git仓库的相关信息,如下所示:

到这里,使用一个通过Spring Cloud Config实现,并使用git管理内容的配置中心已经完成了,启动该应用,成功后开始下面的内容。

美高梅网上游戏 3

Spring Cloud Config也提供本地存储配置的方式。我们只需要设置属性spring.profiles.active=native,Config Server会默认从应用的src/main/resource目录下检索配置文件。也可以通过spring.cloud.config.server.native.searchLocations=file:F:/properties/属性来指定配置文件的位置。虽然Spring Cloud Config提供了这样的功能,但是为了支持更好的管理内容和版本控制的功能,还是推荐使用git的方式。

properties

为了验证上面完成的配置服务器,在 下创建了一个config-repo目录作为配置仓库,并根据不同环境新建了下面四个配置文件:

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

  • didispace.properties
  • didispace-dev.properties
  • didispace-test.properties
  • didispace-prod.properties

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

其中设置了一个from属性,为每个配置文件分别设置了不同的值,如:

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

  • from=git-default-1.0
  • from=git-dev-1.0
  • from=git-test-1.0
  • from=git-prod-1.0

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

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

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

完成了这些准备工作之后,我们就可以通过浏览器或POSTMAN等工具直接来访问到我们的配置内容了。

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

URL与配置文件的映射关系如下:

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

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

配置规则详解

上面的url会映射{application}-{profile}.properties对应的配置文件,{label}对应git上不同的分支,默认为master。

    为了验证上面完全的分布式配置中心config-server,根据git配置信息中指定的仓库位置,在

我们可以尝试构造不同的url来访问不同的配置内容,比如:要访问config-label-test分支,didispace应用的prod环境,可以通过这个url:

    ▪️didispace.properties

{ "name": "didispace", "profiles": [ "prod" ], "label": "config-label-test", "version": "19de8a25575a7054a34230f74a22aa7f5575a9d1", "propertySources": [ { "name": "http://git.oschina.net/didispace/SpringBoot-Learning/Chapter9-1-4/config-repo/didispace-prod.properties", "source": { "from": "git-prod-2.0" } }, { "name": "http://git.oschina.net/didispace/SpringBoot-Learning/Chapter9-1-4/config-repo/didispace.properties", "source": { "from": "git-default-2.0" } } ]}

    ▪️didispace-dev.properties

在完成并验证了配置服务中心之后,下面看看我们如何在微服务应用中获取配置信息。

    ▪️didispace-test.properties

  • 创建一个Spring Boot应用,在pom.xml中引入spring-cloud-starter-config依赖,完整依赖关系如下:

    ▪️didispace-prod.properties

美高梅网上游戏 4

 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <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-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>Brixton.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

github中的文件

  • 创建最基本的Spring Boot启动主类

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

    ▪️from=git-default-1.0

@SpringBootApplicationpublic class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web.run; }}

    ▪️from=git-dev-1.0

  • 创建bootstrap.properties配置,来指定config server,例如:

    ▪️from=git-test-1.0

    ▪️from=git-prod-1.0

spring.application.name=didispacespring.cloud.config.profile=devspring.cloud.config.label=masterspring.cloud.config.uri=http://localhost:7001/server.port=7002

美高梅网上游戏 5

  • spring.application.name:对应前配置文件中的{application}部分
  • spring.cloud.config.profile:对应前配置文件中的{profile}部分
  • spring.cloud.config.label:对应前配置文件的git分支
  • spring.cloud.config.uri:配置中心的地址

访问测试

这里需要格外注意:上面这些属性必须配置在bootstrap.properties中,config部分内容才能被正确加载。因为config的相关配置会先于application.properties,而bootstrap.properties的加载也是先于application.properties

美高梅网上游戏 6

  • 创建一个Rest Api来返回配置中心的from属性,具体如下:

访问测试

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

@RefreshScope@RestControllerclass TestController { @Value("${from}") private String from; @RequestMapping public String from() { return this.from; }}

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

通过@Value("${from}")绑定配置服务中配置的from属性。

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

启动该应用,并访问: ,我们就可以根据配置内容输出对应环境的from内容了。

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

完整示例:Chapter9-1-4

    ▪️/{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,并获得如下返回信息。

美高梅网上游戏 7

访问测试

美高梅网上游戏 8

访问测试

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

美高梅网上游戏 9

git上的commit号

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

美高梅网上游戏 10

本地保存的地址

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

美高梅网上游戏 11

无法连接github场景测试

基础架构

    在动手实践了上面关于Spring Cloud Config的基础入门内容之后,在这里我们深入理解一些它是如何运作起来的。下面所示的是上一节我们构建案例的基本结构。

    其中,主要包含下面几个要素。

    ▪️远程Git仓库:用来存储配置文件的地方,上例中我们用来存储针对应用名为didispace的多环境配置文件:didispace-{profile}.properties。

    ▪️Config Server:这是我们上面构建的分布式配置中心,config-server工程,在该工程中指定了所要连接的Git仓库位置以及账户、密码等连接信息。

    ▪️本地Git仓库:在Config Server的文件系统中,每次客户端请求获取配置信息时,Config Server从Git仓库中获取最新配置到本地,然后客户端请求获取配置信息时,Config Server从Git仓库中获取最新配置到本地,然后在本地Git仓库中读取并返回。当远程仓库无法获取时,直接将本地内容返回。

版权声明:本文由美高梅开户送58元官网发布于美高梅开户送58元官网,转载请注明出处:Cloud Config服务端以及客户端的详细构建与使用方