SpringCloud实战---第十六篇:微服务配置中心Config
系列文章目录
SpringCloud快速入门到精通各组件原理
专栏传送门
@TOC
前言
我们学习的知识框架图
说起来容易做起来难,一步一步都干完!!!
学习一定要自己动手搞一搞,不能只眼会。
学习笔记是跟着尚硅谷的视频学的:https://www.bilibili.com/video/BV18E411x7eT?p=1
先构建好基础工程(一篇一篇看过来的不用重新构建)
构建基础父工程:构建基础父工程
Rest风格微服务:Rest风格微服务
传统分布式方法:传统分布式方法
改造工程,抽取公共模块:改造工程,抽取公共模块
使用Eureka:使用Eureka
Eureka集群: Eureka集群
想偷懒的请下载;gitee上我上传的代码:
https://gitee.com/xiaoZ1712/cloud2021
基础工程构建完成的目录结构:
启动所有模块,访问
localhost:7001
显示如下,代表基础工程没问题
话不多说,立马开干
一、关于服务配置中心SpringCloud Config
- 随着微服务模块的增多,我们的配置文件需要被管理,否则多个分布式模块配置修改和管理起来很不方便,所以需要配置中心来统一管理配置。
- 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件的管理…/(ㄒoㄒ)/~~
- 是什么 SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
- 动态的配置切换,开发环境、测试环境、生产环境…
- 公共的配置如数据库连接等等可以统一的放在配置中心,私用的再放在自己的模块(高内聚)
- 集中管理配置文件
- 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
- 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
- 将配置信息以REST接口的形式暴露
- 与GitHub整合配置:由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持SVN和本地文件),但最推荐的还是Git,而且使用的是http/https访问的形式
- 官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.1.RELEASE/reference/html/
二、Config服务端的配置与测试
1. 建立git仓库
创建一个git仓库,配置中心服务端(Config基于git来实现)
springcloud-config
2. 将创建的配置中心clone到本地
创建一个文件夹
在空文件夹右键,打开git命令行
输入clone命令,将刚才的git仓库克隆到本地
git clone https://gitee.com/xiaoZ1712/springcloud-config.git
git基本的命令
在master分支上新建一个config-dev.yml
config:
test: 1234
三、新建cloud-config-center-3344
新建Module模块,它即为Cloud的配置中心模块cloudConfig Center
模块名
cloud-config-center-3344
pom.xml
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.yml,我们将前面创建的git项目的地址配置上去
server:
port: 3344
spring:
application:
name: cloud-config-center #注册进Eureka服务器的微服务名
cloud:
config:
server:
git:
uri: https://gitee.com/xiaoZ1712/springcloud-config.git #GitHub上面的git仓库名字
####搜索目录
search-paths:
- springcloud-config
####读取分支
label: master
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
基础包
com.atguigu.springcloud
主启动类ConfigCenterMain3344
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
/**
* @Author: Daisen.Z
* @Date: 2022/1/4 13:43
* @Version: 1.0
* @Description:
*/
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class, args);
}
}
windows下修改hosts文件,增加映射
127.0.0.1 config-3344.com
四、测试通过Config微服务是否可以从GitHub上获取配置内容
1. 将EurekaServer7001工程改成单节点
2. 启动测试
启动7001、3344工程模块
通过3344工程获取git上的配置文件信息
有多种格式可以读取到,我们推荐两种
ip:端口/{分支}/{application}-{profile}.yml
ip:端口/{application}-{profile}.yml
第二种会默认去找3344工程配置文件中配的分支,没有配置则找master分支
http://config-3344.com:3344/master/config-dev.yml
http://config-3344.com:3344/config-dev.yml
成功获取,证明从3344配置中心可以成功获取到git仓库中的配置信息了
五、客户端3355访问配置中心
1. 新建cloud-config-client-3355
模块名
cloud-config-client-3355
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud2021</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-config-client-3355</artifactId>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
添加bootstrap.yml配置文件
applicaiton.yml是用户级的资源配置项,bootstrap.yml是系统级的,优先级更加高
bootstrap.yml会比application.yml要优先加载
bootstrap.yml
这个配置的意思是我从远端http://localhost:3344找到对应的配置文件,读取配置文件到本地
server:
port: 3355
spring:
application:
name: config-client
cloud:
#Config客户端配置
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
uri: http://localhost:3344 #配置中心地址k
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
基础包
com.atguigu.springcloud
主启动类
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @auther zzyy
* @create 2020-02-21 18:07
*/
@EnableEurekaClient
@SpringBootApplication
public class ConfigClientMain3355
{
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3355.class, args);
}
}
编写ConfigClientController,完成从注册中心上读取(系统启动会去注册中心加载配置到本地,我们的读取方式和本地一样就可以)
package com.atguigu.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @auther zzyy
* @create 2020-02-21 18:08
*/
@RestController
public class ConfigClientController
{
@Value("${config.test}")
private String configTest;
@GetMapping("/configInfo")
public String getConfigInfo()
{
return configTest;
}
}
2. 启动测试
启动7001、3344和3355,访问
http://localhost:3355/configInfo
可以看到,我们的3355工程已经成功的通过3344工程拿到了git上的远端配置
3. 配置手动挡动态加载
思考一个问题,当生产环境中我们的运维修改了git上的配置文件信息,我们的client端要怎么去知道运维修改了从而跟着重新获取配置呢?
难道每次重启客户端?这可是噩梦操作!!!
我们将工程改造成支持手动挡重新加载配置
给3355的pom中添加可视化监控依赖(我们的工程中已经添加过)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改3355的配置文件,配置暴漏一个监控点
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
在Controller上添加自动刷新的注解
@RefreshScope
这样,这个Controller就具备手动刷新的能力了,我们可以再测试一下
分别访问3344和3355
http://config-3344.com:3344/config-dev.yml
http://localhost:3355/configInfo
访问结果正常
接着修改下git上面的配置信息
再次访问两个接口,会发现3344上面的改变了,3355还是没有改变,这就说明3355还是木牛动态加载
????黑人问好?????
3344改变了是因为3344是直接做的git映射,每次访问时直接访问的是git上的文件,所以会随着改变
但是3355我们做了动态加载配置之后为什么还是不会改变呢?
Config Client端提供的是手动刷新,但是不需要重启服务,我们访问一个接口即可刷新缓存。
这个接口必须使用post方式进行请求,可以使用postman或者url进行请求来刷新配置信息。
http://localhost:3355/actuator/refresh
再次访问3355接口,获取配置信息
http://localhost:3355/configInfo
发现已经成功刷新
总结
- 随着微服务模块的增多,我们的配置文件需要被管理,否则多个分布式模块配置修改和管理起来很不方便,所以需要配置中心来统一管理配置。
- SpringCloudConfig的原理是访问git上发布的配置文件工程,类似于跳转访问获取文件内容,然后客户端微服务工程中可以通过SpringCloudConfig配置中心来访问加载读取指定的配置文件。
- Config Client端使用bootstrap.yml加载配置文件,bootstrap.yml配置文件比application.yml配置文件优先级要高,会优先加载,所以会优先加载远端配置中心的配置,然后再加载我们本地的application.yml配置信息,因此本地的会将先加载的远端的相同配置覆盖掉,这点大家可以自己测试一下。
- Config客户端可以开启手动刷新,使用POST访问http://localhost:3355/actuator/refresh接口即可告知客户端更新配置信息。
- 留下一个思考题,虽然手动挡的去刷新微服务可行,我们也不用重启微服务了,但是大量的微服务一个个手动刷新显然也不太可取,有没有更好的方式让我们全局的去推送消息,通知相关的微服务更新配置呢?敬请期待下篇。
- 点赞
- 收藏
- 关注作者
评论(0)