目录
分布式配置中心概述
1、为什么需要分布式配置中心?
2、配置中心的作用:
Spring Cloud Config简介
新建项目springcloud-config-server
1、引入配置中心config-server的依赖
2、在github/gitee上新建一个远程仓库作为config的远程配置中心
3、添加application.yml文件
4、添加启动类,在启动类上添加注解@EnableConfigServer
5、验证配置中心服务项目是否搭建成功
新建项目springcloud-config-client
1、引入config-client依赖
2、添加bootstrap.yml配置文件
3、添加启动类
4、添加Controller获取配置信息
5、启动config-client、config-server,将服务注册到统一个注册中心
6、配置无需重启获得修改后的配置信息
6.1、添加依赖
6.2、修改bootstrap.yml配置内容,添加如下内容
6.3、Controller类上加@RefreshScope注解
6.4、使用postman手动发送一个post请求,主动刷新client端项目
6.5、手动刷新client端项目后,重新访问localhost:9022/getConfig即可看到更新后的配置信息
分布式配置中心概述
1、为什么需要分布式配置中心?
1.1、配置文件无法统一管理,如数据库连接、redis连接、第三方账号信息等等
1.2、无法实时更新
2、配置中心的作用:
2.1统一管理配置信息
使用配置中心管理各个项目的配置信息,而不需要写到每个项目的jar包的resource里,这样修改项目的配置更加方便,否则如果每个项目各自维护自己的配置信息,那么在项目很多的情况下,维护配置信息将是一件令人奔溃的事情
2.2一处修改处处更新
修改完后,会在项目中自动更新配置信息,而不需要去每台服务器上重启服务
Spring Cloud Config简介
配置中心为了方便服务配置文件的统一管理,实时更新,所以需要分布式配置中心组件,它就是Spring Cloud Config。它支持配置信息放在配置服务的内存中(即本地),也支持放在远程git仓库。在Spring Cloud Config中分为三个角色,一是远程仓库,二是config server,三是config client。
- 远程仓库:负责存储配置文件信息
- Config server:负责拉取远程仓库上的配置文件信息
- Config client:负责从config server读取配置信息
架构图如下:
新建项目springcloud-config-server
1、引入配置中心config-server的依赖
<!--config server配置中心依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
2、在github/gitee上新建一个远程仓库作为config的远程配置中心
如:https://gitee.com/xxx/configuration.git
3、添加application.yml文件
server:
port: 9021
spring:
application:
name: config-server
cloud:
config:
server:
git:
#git的仓库地址
uri: https://gitee.com/xxx/configuration.git
#文件路径
search-paths: config
#username
#password
#如果仓库是公开仓库,则可以不配置用户名和密码
eureka:
instance:
# 使用ip地址作为host,而不是机器号/电脑名称
prefer-ip-address: true
# Eureka客户端向注册中心发送心跳的时间间隔是1s,默认是30s
lease-renewal-interval-in-seconds: 1
# Eureka服务端在收到一次心跳后等待时间上限是2s,默认是90s
# 超时将剔出该微服务,也可以在Eureka服务端进行设置
lease-expiration-duration-in-seconds: 2
client:
service-url:
defaultZone: http://localhost:8060/eureka/
4、添加启动类,在启动类上添加注解@EnableConfigServer
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer//表示配置中心的服务端
public class ConfigApp {
public static void main( String[] args ) {
SpringApplication.run(ConfigApp.class,args);
}
}
5、验证配置中心服务项目是否搭建成功
启动springcloud-config-server后,访问:http://localhost:9021/application-dev.yml
http://localhost:9021/application-test.yml
前提是对应的git仓库上有对应的文件
springcloud config的url与配置文件的映射关系如下:
/{application}/{profile}[/{label}]
读取yaml文件
/{application}-{profile}.yml #常用
/{label}/{application}-{profile}.yml #常用
读取properties文件
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中label表示分支,不写默认从master分支上读取数据
可以看到已经config-server搭建成功,从远程仓库拿到了对应的配置文件信息
新建项目springcloud-config-client
1、引入config-client依赖
<!-- 引入config-client依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2、添加bootstrap.yml配置文件
server:
port: 9022
spring:
application:
name: config-client
cloud:
config:
#分支,默认master
label: master
#配置文件名称
name: application
#文件名后缀(application-dev.yml)
profile: dev
discovery:
#开启从注册中心获取服务
enabled: true
#指定配置中心的服务名称
service-id: config-server
eureka:
instance:
# 使用ip地址作为host,而不是机器号/电脑名称
prefer-ip-address: true
# Eureka客户端向注册中心发送心跳的时间间隔是1s,默认是30s
lease-renewal-interval-in-seconds: 1
# Eureka服务端在收到一次心跳后等待时间上限是2s,默认是90s
# 超时将剔出该微服务,也可以在Eureka服务端进行设置
lease-expiration-duration-in-seconds: 2
client:
service-url:
defaultZone: http://localhost:8060/eureka/
配置yml时,注意,config-client中需要用的是bootstrap.yml,bootstrap.yml优先级要对于application.yml
因为bootstrap(系统级)在容器一启动时就会去加载,而application(应用级)在容器启动过程中加载。由于我们需要在容器启动时就去拉取config-server里的配置信息,所以当前的配置文件优先级要更高。
3、添加启动类
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientApp {
public static void main( String[] args ) {
SpringApplication.run(ConfigClientApp.class,args);
}
}
4、添加Controller获取配置信息
@RestController
public class ConfigController {
@Value("${config.name}")
private String config;
@Value("${server.port}")
private String port;
@GetMapping("/getConfig")
public String getConfig(){
return "content:" + config + ",port:" + port;
}
}
config.name是配置在远程仓库的内容
5、启动config-client、config-server,将服务注册到统一个注册中心
访问localhost:9022/getConfig
可以看到远程仓库的内容已经被读取出来了
6、配置无需重启获得修改后的配置信息
但是此时在git上修改config.name的内容后,手动刷新/getConfig接口,数据并没有发生变化(未重启config-client),如果不想重启服务就让修改的配置信息生效,此时需要对config-client项目进行改造
6.1、添加依赖
<!--引入spring监控组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
6.2、修改bootstrap.yml配置内容,添加如下内容
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
6.3、Controller类上加@RefreshScope注解
@RestController
@RefreshScope
public class ConfigController {
@Value("${config.name}")
private String config;
@Value("${server.port}")
private String port;
@GetMapping("/getConfig")
public String getConfig(){
return "content:" + config + ",port:" + port;
}
}
6.4、使用postman手动发送一个post请求,主动刷新client端项目
http://localhost:9022/actuator/refresh