在使用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. Python中Selenium模块的使用

    目录 Selenium的介绍.配置和调用 Selenium的配置 Selenium的调用 Selenium的使用 定位 定位元素的使用 定位下拉标签元素 在iframe框架之间切换 上传文件 Webd ...

  2. Windows核心编程 第五章 作业(上)

    第5章 作 业 通常,必须将一组进程当作单个实体来处理.例如,当让 Microsoft Developer Studio为你创建一个应用程序项目时,它会生成 C l . e x e,C l . e x ...

  3. 神经网络与机器学习 笔记—卷积神经网络(CNN)

    卷积神经网络 之前的一些都是考虑多层感知器算法设计相关的问题,这次是说一个多层感知器结构布局相关的问题.来总结卷积神经网络.对于模式分类非常合适.网络的提出所隐含的思想收到了神经生物学的启发. 第一个 ...

  4. VS Code插件推荐-Settings Sync

    Settings Sync功能 将vscode的本地设置.插件保存至远端,方便保存 Usage 插件市场安装Setting Sync之后,⌘+P输入>sync,即可看到相关操作,选中点击之后官方 ...

  5. maven打war包

    测试/本地 mvn clean package -Dmaven.test.skip=true 生产服务器打包命令 mvn clean package -P prod -Dmaven.test.skip ...

  6. Sublime 快捷生成HTML 插件安装

    更多精彩关注公众号 1 安装 Package Control1.1 ctrl + ` 呼出控制台1.2 复制(不要带最外层的双引号,该代码仅适用于sublime text 3)"import ...

  7. java如何调用本地扬声器

    各位看官可以关注博主个人博客,了解更多信息. 作者:Surpasser 链接地址:https://surpass.org.cn 前言 博主的毕设系统在做一个餐厅的点餐管理系统,在记性移动端页面开发的时 ...

  8. HTML中的JavaScript

    HTML中的JavaScript 1.<script>元素 defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只对外部脚本文件有效. 脚本会被延迟到整个页面都解析完毕后再 ...

  9. DNS和BIND

    https://www.jianshu.com/p/296b2c7ea76f DNS和BIND 毛利卷卷发关注 0.482018.07.25 10:33:44字数 4,919阅读 4,909 DNS ...

  10. Centos7环境初始化

    最近在做公司的一个环境搭建的任务的时候,要用到三台Centos7服务器,在上面要预装java1.8,docker,zookeeper并且要在docker中跑一个mysql,还要部署其他的软件.由于不是 ...