分布式配置中心
在微服务系统中,由于服务众多,在更新配置文件的时候如果一个一个的去修改无疑大大的浪费时间,降低效率,降低系统的可用性。所以这里就需要一个统一的配置文件中心,所有的服务都可以从中读取、更新配置文件。在Spring Cloud 中有分布式配置中心组件:spring cloud config,它支持将配置文件放在本地,也支持放在一个远程Git仓库中,它分为两个部分,一个是服务端(config server):负责将Git仓库中的配置文件克隆到本地,另一个是客户端(config server):负责读取克隆到本地的配置文件。
构建 config server
新建一个spring boot工程,再新建一个以config-server命名的spring boot项目模块,引入config server的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
配置文件 application.peoperties,如果你的Git仓库是私有的,需要你填入用户名和密码,如果是公开的可以不填。
# 项目名称
spring.application.name=config-server
# 使用端口
server.port=8888
# 配置git仓库地址
spring.cloud.config.server.git.uri=https://github.com/zhangHaoNiHao/springcloudconfig/
# 配置仓库路径
spring.cloud.config.server.git.searchPaths=config
# 配置仓库的分支
spring.cloud.config.label=master
# 访问git仓库的用户名
spring.cloud.config.server.git.username=
# 访问git仓库的用户密码
spring.cloud.config.server.git.password=
Git仓库
在GitHub中新建一个仓库,新建一个以客户端项目名-环境名.properties命名的文件,在该文件中写上你的配置信息。
配置文件命名方式
1、/项目名(application)/环境名(profile)/分支名(label)
2、/项目名(application)-环境名(profile).yml
3、/分支名(label)/项目名(application)-环境名(profile).yml
4、/项目名(application)-环境名(profile).properties
5、/分支名(label)/项目名(application)-环境名(profile)
在启动类中添加 @EnableConfigServer 注解开启配置中心功能,这样,一个配置中心服务就构建好了。
测试服务端
启动配置中心服务端,访问http://localhost:8888/username/dev/master(参数名/环境名/分支名),能够正常访问说明配置中心配置成功。
构建Config Client
新建一个以config-client命名的spring boot项目模块,并且引入config client 的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
配置文件 bootstrap.properties
spring.application.name=config-client
# 指明远程仓库的分支
spring.cloud.config.label=master
# dev开发环境配置文件 test测试环境 pro正式环境
spring.cloud.config.profile=dev
# 指明配置服务中心的网址
spring.cloud.config.uri= http://localhost:8888/
# 服务端口号
server.port=8882
# 从配置中心读取文件
spring.cloud.config.discovery.enabled=true
# 配置中心的服务Id(服务名)
spring.cloud.config.discovery.service-id=config-server
application.properties(yml)与bootstrap.properties(yml)配置文件的区别:
首先声明一点:以properties结尾和以yml结尾的配置文件功能是一样的,只是他们的书写格式不一样
bootstrap配置文件主要从额外的资源中加载配置信息,还可以在本地外部配置文件中解密属性,他是spring应用程序的外部属性来源,所以bootstrap里的属性会优先加载,application配置文件主要用于应用内部的自动化配置。
测试
在config-client中定义一个接口进行测试,依次启动 config-server、config-client服务
@RestController
public class TestController {
//读取配置中心参数
@Value("${username}")
String username;
//读取本地配置文件中的参数
@Value("${server.port}")
String port;
//读取配置中心参数
@Value("${client.message}")
String message;
@RequestMapping(value = "/hello")
public String hello(){
return username+" : "+port+" : "+message;
}
}
访问http://localhost:8882/hello,可以看到,这些参数成功读取了Git仓库中的配置参数。说明客户端构建成功
动态刷新
由于spring项目只会在项目启动的时候才会去加载配置文件,当Git仓库中的配置文件修改之后,需要一个个服务重新启动才能重新加载这些配置文件,所以为了能够让这些服务能够及时更新配置信息,还需要用到消息总线(Spring Cloud Bus)组件,去通知各个服务重新加载配置文件。
搭建消息队列环境
用到消息总线就需要搭建消息队列环境,常用的消息队列的框架有RabbitMQ,ActiveMQ,ZeroMQ,kafka和阿里开源的RocketMq等。在这里我使用了RabbitMQ。在Windows系统中安装RabbitMQ框架很简单,只是安装RabbitMQ之前要先安装Erlang,再安装RabbitMQ,安装一路next下去就行。注意:他们的安装目录不能有中文,电脑用户名也不能有中文。
安装完成之后,启动管理工具,直接双击RabbitMQ Command Prompt(sbin dir),输入命令:
rabbitmq-plugins enable rabbitmq_management
RabbitMQ的启动命令与关闭命令
停止命令:net stop RabbitMQ
启动命令:net start RabbitMQ
访问浏览器:http://localhost:15672 输入默认账号 guest 密码:guest 如果可以正常访问,则代表安装成功(我在尝试的时候先在搜狗浏览器访问,输入用户名密码登录不进去,控制台有报错,换在谷歌浏览器就可以)
改造config-client
引入Spring Cloud 消息总线的依赖和Spring Boot健康检查的依赖包actuator,它的依赖包里携带了刷新功能,只要在配置文件中设置刷新接口,就可以通过一个POST请求,触发该接口,实现Spring Cloud Config的自动刷新功能。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在配置文件bootstrap.properties中添加RabbitMQ的配置信息
spring.application.name=config-client
# 指明远程仓库的分支
spring.cloud.config.label=master
# dev开发环境配置文件 test测试环境 pro正式环境
spring.cloud.config.profile=dev
# 指明配置服务中心的网址
spring.cloud.config.uri= http://localhost:8888/
server.port=8882
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.cloud.bus.enabled=true
spring.cloud.bus.trace.enabled=true
# 开放健康检查的刷新接口
management.endpoints.web.exposure.include=bus-refresh
在使用了配置属性的类的上边添加 @RefreshScope注解(有个疑问,当配置文件中使用了配置中心的参数如果需要更新该怎么办,后来测试了一下,不需要在配置文件中添加类似RefreshScope注解的东西,配置文件中的配置信息可以直接更新生效。)
@RestController
@RefreshScope
public class TestController {
@Value("${username}")
String username;
@Value("${server.port}") //读取本地配置文件中的内容
String port;
@Value("${client.message}")
String message;
@RequestMapping(value = "/hello")
public String hi(){
return username+" : "+port+" : "+message;
}
}
测试
依次启动 config-server ,config-client,访问http://localhost:8882/hello
修改Git仓库配置文件
重新访问:http://localhost:8882/hello 之后内容没有改变,使用postman插件,发送一个post请求http://localhost:8882/actuator/bus-refresh 重新访问,可以看到,数据直接刷新成刚更新的内容。
config-client 重新读取config-server克隆到本地配置文件
感谢各路大神的分享教程,如有错误,请指正。