认识Spring Cloud Config

Spring Cloud Config是最早的配置中心,虽然后面的之秀Nacos可以取代它, 但是Spring Cloud Config还是很多公司在用,比如我司。

那为什么我们需要一个配置中心呢?我们直接将配置写在本地的yml配置文件中不行吗?

一个新技术的出现,一定是因为它解决了某些痛点,我们来看看将配置信息直接写在本地yml配置文件存在哪些痛点:

  • 如果多个微服务可能使用相同的配置信息,假设有50个微服务,如果配置需要修改配置文件,就意味着我们需要修改50个微服务的yml文件,极其浪费时间。
  • 配置信息修改后,必须重启服务才能生效

而Spring Cloud Config解决了这俩个痛点:

  • 集中式管理。在开发中多个微服务可能使用相同的配置,假设有50个微服务,如果配置需要修改配置文件,就意味着我们需要修改50个微服务的yml文件。使用配置中心后,就可以做到一处修改,处处修改。
  • 动态修改配置。使用配置中心,配合actuator可以实现配置的动态修改,无需重启服务

Spring Cloud Config架构图


简单说明一下流程

  1. 把配置文件放在Git Repository中。
  2. Config Server从Git repository中读取配置信息。
  3. 其他客户端再从Config Server中加载配置文件

接下来,我们将根据这个架构图搭建一个案例。

快速入门Spring Cloud Config

项目中使用到的版本:

  • Spring Boot:2.2.2.RELEASE
  • Spring Cloud:Hoxton.SR1

版本不同的话可能会出现一点问题。

创建配置中心仓库

首先我们需要一个创建一个配置中心仓库。由于github的网速太慢,所以我使用码云创建配置中心仓库,当然你也可以使用github。

1、在码云创建springcloud-config仓库

2、在仓库中创建三个文件

文件命名规格:{项目名}-{配置环境版本}.yml。比如config-dev.yml,表示的是config项目的开发环境配置。

配置文件内容分别如下。

config-dev.yml:

user:name: "张三 dev"

config-prod.yml

user:name: "张三 prod"

config服务端搭建

1、 新建SpringBoot项目spring-cloud-config-server,并引入依赖

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><!-- spring cloud config 服务端包 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency>
</dependencies>

3.2 配置config相关配置

bootstrap.yml 文件

spring:application:name: config-server  # 应用名称cloud:config:server:git:# 配置中心仓库地址uri: https://gitee.com/F_promise/springcloud-config.git #配置文件所在仓库username: 码云用户名password: 码云密码default-label: master #配置文件分支
#          search-paths: config  #配置文件所在根目录

3、在 Application 启动类上增加相关注解 @EnableConfigServer

@SpringBootApplication
@EnableConfigServer
public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class,args);}
}

启动SpringBoot服务,测试一下。

Spring Cloud Config 有它的一套访问规则,我们通过这套规则在浏览器上直接访问就可以。

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
  • application:应用名,这里是config
  • profile:配置文件版本,比如dev、prod
  • label:git的分支,默认master

以第一条规则为例,访问config-dev.yml配置文件:

至此,配置中心服务端搭建完毕,接下来客户端(其他项目)需要从配置中心中获取配置信息。

config客户端搭建

1、新建SpringBoot项目spring-cloud-config-client,并引入依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- spring cloud config 客户端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency>
</dependencies>

注意,客户端和服务端引入的config依赖是不一样的。

2、编写bootstrap.yml配置文件

--- bootstrap.yml ---
spring:profiles:active: dev     #激活开发环境的配置文件---
spring:application:name: configcloud:config:uri: http://localhost:8080  #config服务端的地址label: master                  profile: dev                    #开发环境---
spring:application:name: configcloud:config:uri: http://localhost:8080  #config服务端的地址label: masterprofile: prod                 #生产环境

3、编写application.yml配置文件

server:port: 8888user:name: 小王           #配置默认值。配置中心有用配置中心的

4、创建UserController测试使用

@RestController
public class UserController {@Value("${user.name}")private String name;@GetMapping("info")public String info(){return name;}
}

5、启动服务,访问测试

可以看到,成功读取到了配置中心中的config-dev.yml配置文件。将bootstrap.yml中的active改成prod在进行测试:

实现自动刷新

Spring Cloud Config是在项目启动的时候加载的配置内容,导致了它存在一个缺陷,配置文件修改后,需要重启服务才能生效。这也是我们之前说的第二个痛点。

为了解决这个痛点,它提供了一个刷新机制,但是需要我们主动出发。那就是 @RefreshScope 注解并结合 actuator 。

actuator实现自动刷新

1、在spring-cloud-config-client加入actuator依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、在application.yml中添加如下actuator的配置

management:endpoint:shutdown:enabled: falseendpoints:web:exposure:include: "*"

3、在Controller上添加@RefreshScope注解

@RestController
@RefreshScope
public class UserController {@Value("${user.name}")private String name;@GetMapping("info")public String info(){return name;}
}

4、主动触发更新

在配置文件修改后,使用Postman发送一个post请求到http://localhost:8888/actuator/refresh 这个接口,触发主动更新。

Spring Cloud Bus

Spring Cloud Bus 将分布式系统的节点与轻量级消息代理链接。这可以用于广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是,Bus 就像一个扩展的 Spring Boot 应用程序的分布式执行器,但也可以用作应用程序之间的通信渠道。
—— Spring Cloud Bus 官方解释

如果每次配置文件修改后,都需要我们主动发送post请求触发更新,这明显有点不太方便。而且如何客户端比较多的话,一个一个的手动刷新也比较耗时。这个时候,我们可以借助Spring Cloud Bus的广播功能,让client端都订阅配置更新事件,当配置更新时,触发其中一个端的更新事件,Spring Cloud Bus就把此事件广播到其他订阅端,以此来达到批量更新。

1、Spring Cloud Bus 核心原理其实就是利用消息队列做广播,所以要先有个消息队列,目前官方支持 RabbitMQ 和 kafka。我们这里以RabbitMQ 为例。

2、在客户端spring-cloud-config-client中加入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>

3、在配置文件中增加 RabbitMQ 相关配置

spring: rabbitmq:host: 192.168.243.136port: 5672username: guestpassword: guest

4、启动俩个或多个客户端进行测试

我们可以拷贝一份配置

然后修改vm options添加-Dserver.port=8889就行了

所以最后的结构就是俩个客户端和一个配置中心服务端。

5、分别打开 http://localhost:8888/info和 http://localhost:8889/info,查看内容,然后修改码云上配置文件的内容并提交。再次访问这两个地址,数据没有变化。

6、访问其中一个的 actuator/bus-refresh 地址,注意还是要用 POST 方式访问。之后查看控制台输出,会看到这两个端都有一条这样的日志输出

o.s.cloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed

7、再次访问第 5 步的两个地址,会看到内容都已经更新为修改后的数据了。

结合 Eureka 使用 Spring Cloud Config

以上是Spring Cloud Config最基本的使用,在实际开发中,Spring Cloud Config可能会被注册在Eureka中,这样的话,可以Spring Cloud Config配置中心就可以搭建集群实现高可用。

此外引入Eureka后,config客户端就不再需要直接和config服务端直接打交道了,而是通过Eureka来发现Config服务端。

加入Eureka后的架构图如下:

简单说明一下流程

  1. 把配置文件放在Git Repository中。
  2. Config Server从Git repository中读取配置信息。
  3. Config Server将自己注册到Eureka中
  4. Client从Eureka中获取Config Server的信息
  5. Client访问Config Server,加载配置信息

搭建Eureka服务

首先搭建一个简单的Eureka。如果你没有学过Eureka的话,可以看看这篇文章Spring Cloud系列之Eureka入门使用。

1、导入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2、编写配置文件

spring:application:name: eureka-serverserver:port: 3000eureka:client:register-with-eureka: falsefetch-registry: falseservice-url.defaultZone: http://localhost:3000/eureka/

3、在启动类标记@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

将配置中心注册到Eureka中

1、给spring-cloud-config-server项目添加Eureka依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

2、在配置文件中添加Eureka相关配置

eureka:client:service-url:#注册到eureka服务端的地址defaultZone: http://localhost:3000/eureka/instance:#点击具体的微服务,右下角是否显示ipprefer-ip-address: true#显示微服务的名称instance-id: spring-cloud-config-server

3、给主启动类添加@EnableEurekaClient注解

启动配置中心后,访问Eureka

config客户端从Eureka中发现配置中心

1、给spring-cloud-config-client项目添加Eureka依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、修改配置文件,添加Eureka的相关配置,并指定配置中心的application.name

spring:profiles:active: dev      #激活开发环境的配置文件eureka:client:service-url:#注册到eureka服务端的地址defaultZone: http://localhost:3000/eureka/instance:#点击具体的微服务,右下角是否显示ipprefer-ip-address: true#显示微服务的名称instance-id: spring-cloud-config-client---
spring:application:name: configcloud:config:
#      uri: http://localhost:8080   #config服务端的地址,整合eureka后不需要填写label: masterprofile: dev                   #开发环境discovery:                    #从Eureka中发现配置中心enabled: trueservice-id: config-server   #指定配置中心的application.name---
spring:application:name: configcloud:config:
#      uri: http://localhost:8080   #config服务端的地址label: masterprofile: prod                 #生产环境discovery:                    #从Eureka中发现配置中心enabled: trueservice-id: config-server   #指定配置中心服务端的server-id

整合Eureka后,config客户端不再需要指定config服务端的地址,而是通过config服务端的application.name从Eureka中获取配置中心的信息。配置中心可以做集群高可用。

3、给主启动类添加@EnableEurekaClient注解

启动后,查看Eureka,访问http://localhost:8888/info进行测试。

参考文章:
https://cloud.tencent.com/developer/article/1474037

Spring Cloud系列之Spring Cloud Config相关推荐

  1. Spring Security系列之Spring Social实现微信社交登录(九)

    社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯微博.淘宝.豆瓣.MSN.Google等社会化媒体账号登录该网站. 前言 ...

  2. spring cloud系列一:Cloud Native Applications

    前言: Cloud Native是一种应用程序开发风格,鼓励在持续交付和价值驱动开发领域轻松采用最佳实践.一个相关的学科是构建12-factor Apps 应用程序,其中开发实践与交付和运行目标相一致 ...

  3. 【Spring BootSpring Cloud系列】Spring Boot初识

    项目代码地址:https://github.com/AndyFlower/Spring-Boot-Learn/tree/master/Spring-boot-helloworld 一.Spring B ...

  4. Spring Data 系列(二) Spring+JPA入门(集成Hibernate)

    通过[Spring Data 系列(一) 入门]的介绍,通过对比的方式认识到Spring提供的JdbcTemplate的强大功能.通过使用JdbcTemplate,操作数据库,不需要手动处理Conne ...

  5. Spring Boot系列六 Spring boot集成mybatis、分页插件pagehelper

    1. 概述 本文的内容包括如下内容: Spring Boot集成mybatis Spring Boot集成pagehelper分页插件,定义分页的相关类 实现工具类:model转dto,实现数据层和传 ...

  6. Spring核心系列之Spring中的事务

    Spring的事务,因为这个东西算是Spring 内部使用AOP最好的一个体现,体现了AOP思想@EnableTransactionManagement 表示开启事务!Spring事务其实就是Spri ...

  7. Spring Boot系列二 Spring @Async异步线程池用法总结

    转载 自 https://blog.csdn.net/hry2015/article/details/67640534 1. TaskExecutor Spring异步线程池的接口类,其实质是java ...

  8. Spring入门系列之Spring概述

    ​ Spring是一个开源框架, Spring为简化企业级开发而生,使用Spring,JavaBean就可以实现很多以前要靠EJB才能实现的功能.同样的功能,在EJB中要通过繁琐的配置和复杂的代码才能 ...

  9. Spring Boot系列四 Spring @Value 属性注入使用总结一

    @Value注入 不通过配置文件的注入属性的情况 通过@Value将外部的值动态注入到Bean中,使用的情况有: 注入普通字符串 注入操作系统属性 注入表达式结果 注入其他Bean属性:注入beanI ...

最新文章

  1. SDR、DDR、QDR存储器的比较
  2. Hangfire项目实践分享
  3. 小程序绘图工具painter-json文件绘制保存分享图-可点击任意元素触发函数
  4. 查看scala变量数据类型_Scala文字,变量和数据类型| Scala编程教程
  5. C#使用模板文件批量导出word文档
  6. java对excel经行读写
  7. 【英语学习】【Level 08】U04 What I love L1 What's on your playlist?
  8. Ajax到底是什么?
  9. 基于LD3320的嵌入式语音识别系统设计
  10. troublemaker中文谐音_trouble maker的中文音译歌词 希望准确的遵循原来的发音。。。不是中文歌词和韩语歌词!要的是音译啊 注意...
  11. 现代大学英语精读第二版(第六册)学习笔记(原文及全文翻译)——3 - What Is News?(新闻是什么?)
  12. 彩色图像和灰色图像的区别
  13. 【技巧】vscode快速生成html结构
  14. dsolve函数的功能_为什么Mathematica的DSolve函数会解不出显式解??
  15. 什么是悬空 Docker 镜像?
  16. 一文带你了解什么是云计算网络运维工程师,以及2023年的就业前景
  17. html大作业网页代码 ——2019凡客服装店铺商城(1页) HTML+CSS+JavaScript HTML+CSS大作业_ 服装店铺网页制作作业_购物网页设计...
  18. 生活学习常用软件介绍下载
  19. 防火墙——双机热备理论讲解
  20. 如何查看yandex文字搜索广告的搜索词?

热门文章

  1. 工作十三年回顾与感想
  2. 红人营销干货:不要让你的营销经费打水漂
  3. 中国广电已拥有最多的4G、5G基站,中国联通和中国电信瑟瑟发抖
  4. php在windows编译_在Windows上编译PHP
  5. 汉尼拔,刻画的真好!
  6. java docx4j动态生成表格,保存为word,并通过Libreoffice转PDF
  7. 关于支付宝小程序在 安卓机(米10) 倒计时问题
  8. windows 8 阅读器(Windows Reader)
  9. 用猿大师VLC播放程序在Chrome播放海康威视RTSP监控视频卡顿怎么办?
  10. Openacc多卡优化Floyd算法