在使用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系列(六):配置中心的更多相关文章

  1. spring cloud学习(六) 配置中心-自动更新

    上一篇学习了spring cloud config的基本使用,但发现有个问题,就是每次更改配置后,都需要重启服务才能更新配置,这样肯定是不行的.在上网查资料了解后,spring cloud支持通过AM ...

  2. 跟我学SpringCloud | 第六篇:Spring Cloud Config Github配置中心

    SpringCloud系列教程 | 第六篇:Spring Cloud Config Github配置中心 Springboot: 2.1.6.RELEASE SpringCloud: Greenwic ...

  3. Spring Cloud Config 实现配置中心,看这一篇就够了

    Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,虽然后来又发布了 Consul 可以代替配置中心功能,但是 Config 依然适用于 Spring Clou ...

  4. Spring Cloud Config的配置中心获取不到最新配置信息的问题

    Spring Cloud Config的配置中心获取不到最新配置信息的问题 http://blog.didispace.com/spring-cloud-tips-config-tmp-clear/

  5. Spring Cloud Config(配置中心)

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一.简介 Spring Cloud Config为分布式系统中的外部配置提供服务器和客 ...

  6. Spring Cloud Config 分布式配置中心使用教程

    一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config ...

  7. Spring Cloud 2-Config 分布式配置中心(七)

    Spring Cloud  Config  1.github配置 2.服务端配置 pom.xml application.xml Application.java 3.配置和命名 1. 配置加载顺序 ...

  8. Spring Cloud Config 分布式配置中心【Finchley 版】

    一. 介绍 1,为什么需要配置中心? 当服务部署的越来越多,规模越来越大,对应的机器数量也越来越庞大,靠人工来管理和维护服务的配置信息,变得困难,容易出错. 因此,需要一个能够动态注册和获取服务信息的 ...

  9. Spring Cloud Consul使用——配置中心

    1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  10. spring cloud学习(五) 配置中心

    Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持.配置服务中心采用Git的方式存储配置文件,因此我们很容易部署修改,有助于对环境配置进行版本管理. 一.配置中心 ...

随机推荐

  1. hdu5040 不错的广搜

    题意:       给你一个地图,让你从起点走到终点,然后图上有空地,墙,还有摄像头,摄像头有初始方向,每一秒摄像头都会顺时针旋转90度,每个摄像头有自己的观察范围,它所在的点,和当前它面向的那个点, ...

  2. POJ1722二维spfa+优先队列优化

    题意:      给你一个有向图,然后求从起点到终点的最短,但是还有一个限制,就是总花费不能超过k,也就是说每条边上有两个权值,一个是长度,一个是花费,求满足花费的最短长度. 思路:       一开 ...

  3. UVA11462年龄排序

    题意:       给你200w个人的年龄,年龄的范围是1-100,然后让你从小到大排序输出所有人的年龄,题目还特意强调输入文件限制25MB,题目内存限制2MB. 思路:      比较经典又简单的一 ...

  4. Docker网络配置进阶

    Docker启动会默认创建docker0虚拟网桥,是Linux的一个bridge,可以理解成一个软件交换机.它会在挂载到它的网口之间进行转发. 之后所有容器都是在172.17.0.x的网段上,并且可以 ...

  5. Python练习2-基本聊天程序-虚拟茶会话

    基本聊天程序 先来个基本的测试例子: Main.py from asyncore import dispatcher import socket,asyncore PORT = 11223 class ...

  6. 初探MFC

    MFC MFC(Microsoft Foundation Classes) 是微软基础类库,也就是用c++类将win32API封装起来. 应用程序对象 MFC程序都是以应用程序对象为核心,且程序中只有 ...

  7. JAVA8 lambda表达式权威教程!

    Java 8新特性----Stream流 jdk8是Java 语言开发的一个主要版本,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等等.今天就重点介 ...

  8. 动态类型转换dynamic_cast

    C++Primer第十九章的动态类型转换部分讲的不是很清楚,于是自己查cpp的官方手册总结一下. dynamic_cast < new-type > ( expression ) 动态类型 ...

  9. google 谷歌Python语言规范

    Python语言规范 https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_lan ...

  10. 007.Ansible变量Fact,魔法变量和lookup生成变量

    一 fact变量 1.1  fact简介 ansible有一个模块叫setup,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用.而setup模块获取这些信息的方法就是 ...