返回介绍

快速入门

发布于 2024-08-18 11:12:34 字数 11375 浏览 0 评论 0 收藏 0

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

构建配置中心

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

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

<parent>

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

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

<version>1.3.7.RELEASE</version>

<relativePath/> <!--lookup parent from repository-->

</parent>

<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>Brixton.SR5</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

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

@EnableConfigServer

@SpringBootApplication

public class Application {

public static void main(String[]args){

new SpringApplicationBuilder(Application.class).web(true).run(args);

}

}

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

spring.application.name=config-server

server.port=7001

spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/SpringCloud-Learning/

spring.cloud.config.server.git.searchPaths=spring_cloud_in_action/config-repo

spring.cloud.config.server.git.username=username

spring.cloud.config.server.git.password=password

其中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实现,并使用Git管理配置内容的分布式配置中心就完成了。我们可以将该应用先启动起来,确保没有错误产生,然后进入下面的学习内容。

配置规则详解

为了验证上面完成的分布式配置中心 config-server,根据 Git 配置信息中指定的仓库位置,在http://git.oschina.net/didispace/SpringCloud-Learning/spring_cloud_in_action/下创建了一个 config-repo 目录作为配置仓库,并根据不同环境新建下面4个配置文件:

- didispace.properties

- didispace-dev.properties

- didispace-test.properties

- didispace-prod.properties

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

- from=git-default-1.0

- from=git-dev-1.0

- from=git-test-1.0

- from=git-prod-1.0

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

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

- /{application}/{profile}[/{label}]

- /{application}-{profile}.yml

- /{label}/{application}-{profile}.yml

- /{application}-{profile}.properties

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

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

{

"name": "didispace",

"profiles":[

"prod"

],

"label": "config-label-test",

"version": "4c4f3909b0499b8518aba1f76e8a90b0dbad535d",

"propertySources":[

{

"name": "http://git.oschina.net/didispace/SpringCloud-Learning/spring_cloud_in_action/config-repo/didispace-prod.properties",

"source": {

"from": "git-prod-2.0"

}

},

{

"name": "http://git.oschina.net/didispace/SpringCloud-Learning/spring_cloud_in_action/config-repo/didispace.properties",

"source": {

"from": "git-default-2.0"

}

}

]

}

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

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

s.c.a.AnnotationConfigApplicationContext : Refreshing

org.springframework.context.annotation.AnnotationConfigApplicationContext@7d09c9:

startup date[Fri Sep 16 21:56:43 CST 2016]; root of context hierarchy

o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source:

file:/C:/Users/ADMINI~1/AppData/Local/Temp/config-repo-914347082723810766/spring_cl

oud_in_action/config-repo/didispace-prod.properties

o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source:

file:/C:/Users/ADMINI~1/AppData/Local/Temp/config-repo-914347082723810766/spring_cl

oud_in_action/config-repo/didispace.properties

s.c.a.AnnotationConfigApplicationContext : Closing

org.springframework.context.annotation.AnnotationConfigApplicationContext@7d09c9:

startup date[Fri Sep 16 21:56:43 CST 2016]; root of context hierarchy

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

.c.s.e.MultipleJGitEnvironmentRepository : Could not pull remote for config-label-test

(current ref=Ref[refs/heads/config-label-test=

4c4f3909b0499b8518aba1f76e8a90b0dbad535d]),remote:

http://git.oschina.net/didispace/SpringCloud-Learning

s.c.a.AnnotationConfigApplicationContext : Refreshing

org.springframework.context.annotation.AnnotationConfigApplicationContext@55c747ad:

startup date[Mon Sep 19 10:51:04 CST 2016]; root of context hierarchy

o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source:

file:/C:/Users/ADMINI~1/AppData/Local/Temp/config-repo-7514536618307405051/spring_c

loud_in_action/config-repo/didispace-prod.properties

o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source:

file:/C:/Users/ADMINI~1/AppData/Local/Temp/config-repo-7514536618307405051/spring_c

loud_in_action/config-repo/didispace.properties

s.c.a.AnnotationConfigApplicationContext : Closing

org.springframework.context.annotation.AnnotationConfigApplicationContext@55c747ad:

startup date[Mon Sep 19 10:51:04 CST 2016]; root of context hierarchy

客户端配置映射

在完成了上述验证之后,确定配置服务中心已经正常运作,下面我们尝试如何在微服务应用中获取上述配置信息。

- 创建一个Spring Boot应用,命名为config-client,并在pom.xml中引入下述依赖:

<parent>

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

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

<version>1.3.7.RELEASE</version>

<relativePath/> <!--lookup parent from repository-->

</parent>

<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>Brixton.SR5</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

- 创建Spring Boot的应用主类,具体如下:

@SpringBootApplication

public class Application {

public static void main(String[]args){

new SpringApplicationBuilder(Application.class).web(true).run(args);

}

}

- 创建 bootstrap.properties 配置,来指定获取配置文件的 config-server位置,例如:

spring.application.name=didispace

spring.cloud.config.profile=dev

spring.cloud.config.label=master

spring.cloud.config.uri=http://localhost:7001/

server.port=7002

上述配置参数与Git中存储的配置文件中各个部分的对应关系如下所示。

- spring.application.name:对应配置文件规则中的{application}部分。

- spring.cloud.config.profile:对应配置文件规则中的{profile}部分。

- spring.cloud.config.label:对应配置文件规则中的{label}部分。

- spring.cloud.config.uri:配置中心config-server的地址。

这里需要格外注意,上面这些属性必须配置在 bootstrap.properties 中,这样config-server中的配置信息才能被正确加载。在第2章中,我们详细说明了Spring Boot对配置文件的加载顺序,对于本应用jar包之外的配置文件加载会优先于应用jar包内的配置内容,而通过bootstrap.properties对config-server的配置,使得该应用会从config-server中获取一些外部配置信息,这些信息的优先级比本地的内容要高,从而实现了外部化配置。

- 创建一个RESTful接口来返回配置中心的from属性,通过@Value("${from}")绑定配置服务中配置的from属性,具体实现如下:

@RefreshScope

@RestController

public class TestController {

@Value("${from}")

private String from;

@RequestMapping("/from")

public String from(){

return this.from;

}

}

- 除了通过@Value注解绑定注入之外,也可以通过Environment对象来获取配置属性,比如:

@RefreshScope

@RestController

public class TestController {

@Autowired

private Environment env;

@RequestMapping("/from")

public String from(){

return env.getProperty("from","undefined");

}

}

启动config-client应用,并访问http://localhost:7002/from,我们就可以根据配置内容输出对应环境的from内容了。根据当前配置,我们可以获得如下返回内容:git-dev-1.0。可以继续通过修改bootstrap.properties中的配置内容获取不同的配置信息来熟悉配置服务中的配置规则。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文