在使用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. POJ1258简单最小生成树

    #include<stdio.h> #include<algorithm> #define N (100 + 10) using namespace std; typedef ...

  2. MySQL数据库及注入方法

    目录 MySQL数据库 mysql中比较常用的一些函数: 判断MySQL数据库是否存在SQL注入 MySQL数据库文件结构 MySQL数据库密码破解 MySQL UDF提权 MySQL数据库 MySQ ...

  3. php 获取某年后的日期

    比如两年后:date('Y-m-d',strtotime('+2 year')) 月份year改成month

  4. K8s Scheduler 在调度 pod 过程中遗漏部分节点的问题排查

    问题现象 在TKE控制台上新建版本为v1.18.4(详细版本号 < v1.18.4-tke.5)的独立集群,其中,集群的节点信息如下: 有3个master node和1个worker node, ...

  5. VBO、VAO和EBO

    Vertex Buffer Object 对于经历过fixed pipeline的我来讲,VBO的出现对于渲染性能提升让人记忆深刻.完了,暴露年龄了~ //immediate mode glBegin ...

  6. Git 系列教程(8)- 远程仓库的使用

    查看远程仓库 如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令,它会列出你指定的每一个远程服务器的名称 如果是刚 clone 下来的自己的库,能看到 origin,这是 Gi ...

  7. 02、SpringBoot2入门

    1.系统要求 Java 8 & 兼容java14 . Maven 3.3+ idea 2019.1.2 1.1.maven设置 <mirrors> <mirror> & ...

  8. [Java] 数据分析 -- 回归分析

    线性回归 需求:从文件读取数据对,计算回归函数及系数 实现1:commons.math的SimpleRegression,定义函数getData从文件读取数据返回SimpleRegression类 1 ...

  9. [DB] ElasticSearch

    安装 root用户解压,修改配置文件 创建新用户es 修改文件权限:chown -R es:es /kkb/install/elasticsearch-6.7.0/ 用es用户启动ElasticSea ...

  10. 【转载】让KVM虚机能使用音箱与麦克风(vnc及ac97)

    让KVM虚机能使用音箱与麦克风(vnc及ac97) 原 tantexian 发布于 2016/02/29 16:32 字数 462 阅读 164 收藏 0 点赞 1 评论 0 为什么80%的码农都做不 ...