Spring Cloud Config 分布式配置中心与动态刷新

分布式配置中心

    在微服务系统中,由于服务众多,在更新配置文件的时候如果一个一个的去修改无疑大大的浪费时间,降低效率,降低系统的可用性。所以这里就需要一个统一的配置文件中心,所有的服务都可以从中读取、更新配置文件。在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克隆到本地配置文件 

 

 

 感谢各路大神的分享教程,如有错误,请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值