Spring Cloud系列(六):配置中心
在使用Spring Boot的时候,我们往往会在application.properties配置文件中写一些值,供应用使用,这样做的好处是可以在代码中引用这些值,当这些值需要作出修改的时候,可以直接修改配置文件就重启生效了(如果你部署的是war格式)。但是在Spring Cloud这种大量微服务的架构中,这么做很容易出错,增加了运维的成本。
本篇要介绍的配置中心就是要把所有微服务需要使用的配置值放在同一个地方统一管理,可以分为不同的版本,不同的环境,当要修改某个配置值时,不管是哪个服务,都可以在同一个地方做出修改。
一、架构简介
Spring Cloud配置中心的架构大致如下:

repo可以是本地,可以是git仓库,可以是svn仓库,配置中心分为服务端和客户端,服务端从仓库中读取配置,客户端从服务端请求配置。
但是这种方法有两个问题,一是服务端只有一个,出问题了那么所有的客户端都用不了;二是假如服务端的地址变了,客户端还要跟着变,比较麻烦。在本系列一开始,我们就介绍了注册中心,这个时候,我们就可以把配置中心的服务端和客户端都注册到注册中心,在构架服务端的集群的时候,只需要直接添加多个节点就可以了,而客户端不再是直接去服务端请求配置,而是向注册中心请求。架构如下:

二、创建配置中心仓库
先在github或者别的git仓库(比如码云、私服等)创建一个仓库config-repo,然后在仓库创建一个目录config-client,接着在目录下创建一个client-config-dev.properties文件,在文件中添加foo=bar,下面的步骤我们会从这个文件中读取foo的值。如果是把仓库clone到本地再做修改的话,记得把内容push到github。
三、创建配置中心服务端
仍然在之前的项目上添加新的功能。新建一个module,名称为config-server,添加Eureka Discovery Client和Config Server两个依赖,如下
<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>
在启动类加上@EnableEurekaClient和@EnableConfigServer注解
在application.properties中添加以下配置
server.port=8000
spring.application.name=config-server
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
spring.cloud.config.server.git.uri=https://github.com/spareyaya/config-server
spring.cloud.config.server.git.search-paths=config-client
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=
spring.cloud.config.server.git.uri属性指定的就是git仓库的地址,spring.cloud.config.server.git.search-paths属性是该仓库下的相对路径,这个可以方便我们对不同的微服务做配置文件隔离管理,如果仓库是public的,username和password不用填,private的需要。
四、测试服务端
启动注册中心和config-server,访问http://localhost:8000/client-config-dev.properties,返回了
foo: bar
说明config-server确实是加载了远程仓库的配置文件。事实上,config-server已经把配置文件的内容转换为web的形式了:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
比如我们创建的client-config-dev.properties,application就是client-config,profile是dev,label是仓库的分支名,默认是master分支。
因此我们也可以通过访问http://localhost:8000/client-confi/dev来获取配置的值。
这时候我们在仓库的client-config-dev.properties中添加一个配置(如果是在本地仓库添加记得push到github)
foo1=bar1
不要重启,再次访问http://localhost:8000/client-config-dev.properties,结果返回
foo: bar
foo1: bar1
说明config-server会自动读取最新的内容。
五、创建配置中心客户端
5.1、新建客户端module
本来可以在之前消费者或者提供者服务上添加配置中心客户端的功能的,但是这里不准备这么做了,我们新建一个module,名称为config-client,选择Spring Web、Eureka Discovery Client和Config Client三个依赖,如下
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
5.2、修改配置
在启动类添加@EnableEurekaClient注解开启注册发现
在application.properties中添加以下配置
server.port=8001
spring.application.name=config-client
另外在resources目录下新建一个bootstrap.properties,加入以下配置
spring.cloud.config.name=client-config
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
解释一下这几个配置的含义:
- spring.cloud.config.name:配置文件application的名称,比如这里是client-config
- spring.cloud.config.profile:运行环境
- spring.cloud.config.label:仓库分支
- spring.cloud.config.discovery.enabled:开启config服务发现
- spring.cloud.config.discovery.service-id:config服务的id,就是config-server中spring.application.name的值
- eureka.client.serviceUrl.defaultZone:注册中心地址
5.3、创建测试的Controller
为了方便测试新建一个Controller如下
@RestController
public class ConfigClientController {
@Value("${foo}")
private String foo;
@RequestMapping("/getFoo")
public String getFoo() {
return foo;
}
}
5.4、测试
启动config-client,访问http://localhost:8001/getFoo

这时我们把远程仓库的foo值给改为barrrrr,然后再重新访问http://localhost:8001/getFoo,发现结果还是bar,这时再次访问http://localhost:8000/client-config-dev.properties却发现foo的值已经是barrrrr了。这是因为我们的客户端是在启动服务的时候就会把配置值读取好,如果远程配置值变了,客户端需要重启才能生效。这么看来,配置中心好像也没多大作用嘛,当然不是,Spring Cloud已经提供了某些机制来刷新配置了,这个下一篇再介绍。
六、总结
配置中心就介绍到这里,下一篇介绍消息总线。
源码已经上传到github:https://github.com/spareyaya/spring-cloud-demo/tree/master/chapter6
Spring Cloud系列(六):配置中心的更多相关文章
- spring cloud学习(六) 配置中心-自动更新
上一篇学习了spring cloud config的基本使用,但发现有个问题,就是每次更改配置后,都需要重启服务才能更新配置,这样肯定是不行的.在上网查资料了解后,spring cloud支持通过AM ...
- 跟我学SpringCloud | 第六篇:Spring Cloud Config Github配置中心
SpringCloud系列教程 | 第六篇:Spring Cloud Config Github配置中心 Springboot: 2.1.6.RELEASE SpringCloud: Greenwic ...
- Spring Cloud Config 实现配置中心,看这一篇就够了
Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,虽然后来又发布了 Consul 可以代替配置中心功能,但是 Config 依然适用于 Spring Clou ...
- Spring Cloud Config的配置中心获取不到最新配置信息的问题
Spring Cloud Config的配置中心获取不到最新配置信息的问题 http://blog.didispace.com/spring-cloud-tips-config-tmp-clear/
- Spring Cloud Config(配置中心)
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一.简介 Spring Cloud Config为分布式系统中的外部配置提供服务器和客 ...
- Spring Cloud Config 分布式配置中心使用教程
一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config ...
- Spring Cloud 2-Config 分布式配置中心(七)
Spring Cloud Config 1.github配置 2.服务端配置 pom.xml application.xml Application.java 3.配置和命名 1. 配置加载顺序 ...
- Spring Cloud Config 分布式配置中心【Finchley 版】
一. 介绍 1,为什么需要配置中心? 当服务部署的越来越多,规模越来越大,对应的机器数量也越来越庞大,靠人工来管理和维护服务的配置信息,变得困难,容易出错. 因此,需要一个能够动态注册和获取服务信息的 ...
- Spring Cloud Consul使用——配置中心
1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- spring cloud学习(五) 配置中心
Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持.配置服务中心采用Git的方式存储配置文件,因此我们很容易部署修改,有助于对环境配置进行版本管理. 一.配置中心 ...
随机推荐
- 什么?这么精髓的View的Measure流程源码全解析,你确定不看看?
前言 Android开发中我们平时接触最多的是各种View, View是一个比较大的体系,包含了绘制流程.事件分发.各种动画.自定义View 等等.前几天我写了一篇事件分发源码解析的文章, 今天我们来 ...
- Postman报文进行解密之RSA私钥解密
接口返回的数据也是加密的,需要对数据解密才能看到返回的数据是否正确,就需要用RSA解密. 返回数据的解析可以在postman的Tests进行后置处理,获取加密后的返回数据: var data = JS ...
- JavaScript实现减速返回顶部
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Nginx超详细常用功能演示,够用啦~~~
前言 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服 ...
- DOM 绑定事件
// 1.获取事件源 var oDiv = document.getElementById('box'); console.log(oDiv); //2.事件 (1)直接绑定匿名函数 oDiv.onc ...
- .Net 中的 string、String、StringBuffer 内存处理性能 和 应用场景
body { font-family: Segoe UI, SegoeUI, Helvetica Neue, Helvetica, Arial, sans-serif } code { color: ...
- [刷题] 1016 部分A+B (15分)
思路 以字符串形式接收 遍历字符串,组装数据,输出结果 #include <iostream> using namespace std; int main() { string a, b; ...
- [Python] RPC实现
单线程同步 使用socket传输数据 使用json序列化消息体 struct将消息编码为二进制字节串,进行网络传输 消息协议 1 // 输入 2 { 3 in: "ping", 4 ...
- WIN10 分区 C盘 至少250-300G E盘至少700G
win10 就2个分区 C盘 至少250-300G E盘至少700G
- mysql默认值
1.创建表时添加默认值 语法: <字段名><类型><默认值> 实例: MySQL [wordpress]> create table ly_content( ...