- 推荐序一
- 推荐序二
- 推荐序三
- 推荐语
- 前言
- 第1章 基础知识
- 第2章 微服务构建:Spring Boot
- 第3章 服务治理:Spring Cloud Eureka
- 第4章 客户端负载均衡:Spring Cloud Ribbon
- 第5章 服务容错保护:Spring Cloud Hystrix
- 第6章 声明式服务调用:Spring Cloud Feign
- 第7章 API网关服务:Spring Cloud Zuul
- 第8章 分布式配置中心:Spring Cloud Config
- 第9章 消息总线:Spring Cloud Bus
- 第10章 消息驱动的微服务:Spring Cloud Stream
- 附录 A Starter POMs
- 后记
快速入门
在本节中,我们将演示如何构建一个基于 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论