git pull 配置免密_SpringCloud系列之分布式配置中心学习

1、分布式配置中心简介

在实际的项目开发中,配置文件是使用比较多的,很多项目有测试环境(TEST)、开发环境(DEV)、规范的项目还有集成环境(UAT)、生产环境(PROD),每个环境就一个配置文件。

e27afa97711e54b6a968e45f3152898f.png

这个在单体应用的项目里是没什么问题,如果是分布式微服务项目,就会有很多的模块,比如微服务A、微服务B等等,每个工程都有一套配置文件,随着业务增长,肯定会有很多配置,分散管理,不能实现统一的管理,所以就有了微服务的配置文件统一管理组件,比如spring cloud官方的spring cloud config、携程的 Apollo,还有最近比较火的阿里 nacos,每款产品各有自己的特点,不过本博客只介绍spring cloud config

作为一款分布式的配置中心,其基本的功能应该有统一的配置文件管理,至于怎么存储可以自行设计,客户端可以从配置中心下拉配置数据,还有一个重要功能就是推送,有了推送功能,才能做到将数据统一发给客户端及时更新,总不能让客户端自己pull,如果在客户端很多的情况,这种肯定是不合理的,简单画图表示:

9aebd095124fc690532900890cffdeb2.png

2、什么是SpringCloud Config?

ok,前面简单介绍了分布式配置中心的基本概念,现在看看spring cloud提供的这块分布式配置中心spring cloud config是怎么设计?简单归纳其特点:

  • 文件存储:默认Git仓库(github、gitlab等等)
  • 版本关联:默认Git
  • 权限控制:需要Git支持
  • 多环境(profile):配置文件指定
  • 动态更新:需要基于Springcloud config bus
  • 定时更新:需要自行拓展
  • 管理后台:默认不带

所以有一个明显的特点,springcloud config默认就是基于git仓库来实现配置文件统一管理的,所以很明显其有如下角色:

  • 配置仓库:git仓库
  • 配置服务端:config server,负责从git仓库下拉配置文件到本地,然后可以统一推送给客户端
  • 配置客户端:各微服务业务客户端,可以从配置服务端pull配置数据

ok,简单画图表示其架构,如图所示:

f279f099967dcce86efdb045fd17846a.png

3、例子实验环境准备

环境准备:

  • JDK 1.8
  • SpringBoot2.2.3
  • SpringCloud(Hoxton.SR7)
  • Maven 3.2+
  • 开发工具IntelliJ IDEAsmartGit

github远程仓库创建,可以在github上创建一个springCloudExamples项目,然后新建一个文件夹,命名为config-repository

4、Config Server代码实现

创建一个SpringBoot Initialize项目,详情可以参考我之前博客:SpringBoot系列之快速创建项目教程

如图:选择config Server

32660a78d86fb330e35b3df910535ddf.png


也可以自行在maven引入如下配置:

org.springframework.cloud    spring-cloud-config-server

使用注解@EnableConfigServer表示这个config服务端工程

package com.example.springcloud.server;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.config.server.EnableConfigServer;@SpringBootApplication@EnableConfigServerpublic class SpringcloudConfigServerApplication {    public static void main(String[] args) {        SpringApplication.run(SpringcloudConfigServerApplication.class, args);    }}

新建bootstrap.yml配置文件,指定github仓库的地址:

server:  port: 8761spring:  application:    name: springcloud-config-server  cloud:    config:      server:        git:          uri: https://github.com/your_github_account/springCloudExamples          username: your_github_account          password: your_github_password          search-paths: config-repository

5、Config Client代码实现

同样新建SpringBoot Initialize项目,快速创建

3ea6c5d3e67fe76355c5557e073a5ff5.png


pom配置文件:

org.springframework.boot            spring-boot-starter-web        org.springframework.cloud            spring-cloud-starter-config        

yaml配置,uri指定为config server的地址,profile是环境变量,可以指定为dev(开发环境),label表示分支,master是指github的主干分支

server:  port: 8082spring:  application:    name: springcloud-config-client  cloud:    config:      uri: http://127.0.0.1:8761/      profile: dev      label: master

然后,我们要在github仓库新建配置文件:命名规范必须是客户端的spring. application.name加上profile

1cf3339e28a7960d9a00059717ca6812.png


在配置文件,随便写点:

config.client.profile=springcloud-config-client-dev

测试:要先启动config server,然后再启动config client,写个例子测试,要加上@RefreshScope实现刷新功能

@RestController@RefreshScopepublic class ConnfigClientController {    @Value("${config.client.profile}")    private String profile;    @GetMapping(value = "/test")    public String test() {        return this.profile;    }}

启动SpringBoot项目,测试:

aa2d3f4e11e453f27f8dce2077b22206.png


在config server启动过程,可以看到config server从github下拉配置文件到本地缓存,具体是C盘AppData目录

8e479ac3afecc0ff8cdddca841652f1e.png

6、客户端pull刷新实现

客户端要实现下拉配置数据,怎么实现?可以集成spring-boot-starter-actuator来实现:

pom配置:

org.springframework.boot            spring-boot-starter-actuator        

spring-boot-starter-actuator配置:include加上rehresh配置

management:  endpoints:    web:    # 前缀名,默认也是actuator      base-path: /actuator      # 默认只开放info,health的方式访问,加上refresh      exposure:        include: info,health,refresh  endpoint:    health:      show-details: always    refresh:      enabled: true

访问客户端的链接,注意要用post方式,http://localhost:8082/actuator/refresh

github配置文件没更新的情况:

901cbd2222639e1679272617ec638943.png


修改配置文件,commit和push到github

ee39c1ad1319af0cd30833a843796fc9.png


调用接口时候,可以看到config client从config server获取数据:

4c5a1b0208534f228deb41fb8aa9bd93.png

7、消息总线Spring Cloud Bus

  • 什么是总线?
    在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都链接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。
  • 什么是Spring Cloud Bus?

Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能
Spring Cloud Bus能管理和传播分布式消息间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道

看了理论,貌似不理解?所以还是从前面学习说起,前面介绍说明作为一个分布式的配置中心,至少应该有推送消息的功能,所以这个配置中心的角色可以由config server充当,实现的效果是config server(配置中心)一刷新数据,客户端都能同步更新,画图进行说明:

eb2eee7885cbcb3be4e5dd4443911079.png
  • 1、配置中心(config server)执行bus-refresh,spring cloud bus提供的刷新接口,配置中心就从git仓库下拉数据到本地git仓库
  • 2、执行bus-refresh之后,将消息发给spring cloud bus(消息总线),消息总线将消息写到消息队列(rabbitMQ)的topic中
  • 3、只要订阅这个消息队列topic的都能监听到spring cloud bus的消息(基于rabbitmq)
  • 4、监听到之后,config client从config server pull更新配置数据

其实简而言之,Config Client实例都监听RabbitMQ中同一个topic,当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置,当然这个刷新操作不一定要放在config server,也可以放在某个客户端触发,只要将消息发送给消息总线就可以

8、Docker安装部署RabbitMQ

主要介绍一下Docker版本,常用的docker镜像操作:

96d428f654fb567317ef9fd3f313ba09.png

查询rabbitMQ镜像:

management版本,不指定默认为最新版本latest

 docker search rabbitmq:management
a5530c5be99c7c83eaa9f5b9764ef501.png


拉取镜像:

docker pull rabbitmq:management

查看docker镜像列表:

docker images

Docker容器操作:
ok,上面命令执行后,镜像就已经拉取到本地仓库了,然后可以进行容器操作,启动rabbitMQ

简单版

docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management1
  • -d 后台运行
  • -p 隐射端口
  • –name 指定rabbitMQ名称

复杂版(设置账户密码,hostname)

docker run -d -p 15672:15672  -p  5672:5672  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq --hostname=rabbitmqhostone  rabbitmq:management1
  • -d 后台运行
  • -p 隐射端口
  • –name 指定rabbitMQ名称
  • RABBITMQ_DEFAULT_USER 指定用户账号
  • RABBITMQ_DEFAULT_PASS 指定账号密码

执行如上命令后访问:http://ip:15672/

默认账号密码:guest/guest

51cabae1a29fe5c068b9ef35b43fd37a.png
cb3677159cffe82989adda033cd36d6d.png


其它常用容器命令:

查看运行中的容器

# 查看所有的容器用命令docker ps -adocker ps

启动容器

# eg: docker start 9781cb2e64bddocker start CONTAINERID[容器ID]

stop容器

docker stop CONTAINERID[容器ID]

删除一个容器

 docker rm CONTAINERID[容器ID]

查看Docker容器日志

# eg:docker logs 9781cb2e64bddocker logs container‐name[容器名]/container‐id[容器ID]

9、Spring Cloud Bus动态刷新

有了前面的学习,接着进行代码例子实践,config server pom配置:

org.springframework.boot    spring-boot-starter-actuatororg.springframework.cloud    spring-cloud-starter-bus-amqp

yaml配置:开放bus-refresh

management:  endpoints:    web:      base-path: /actuator      exposure:        include: info,health,refresh,bus-refresh  endpoint:    health:      show-details: always    refresh:      enabled: true

加上rabbitmq配置

  # RabbitMQ配置  rabbitmq:    host: 192.168.6.155    port: 5672    username: guest    password: guest

Config Client代码例子改造,pom配置:

org.springframework.cloud      spring-cloud-starter-bus-amqp  

也要加上rabbitMQ配置,这样才能订阅更新:

 # RabbitMQ配置  rabbitmq:    host: 192.168.6.155    port: 5672    username: guest    password: guest    virtual-host: /

客户端必须修改,refresh、enabled都要改为true,trace是进行跟踪的,可以根据需要开启

spring:  cloud:    bus:      enabled: true      refresh:        enabled: true      trace:        enabled: true

注意点:为了实时更新,必须加上@RefreshScope

配置中心进行bus refresh

84315d2e3debe3ab551d89e4edbbbcb4.png


订阅的客户端都进行实时更新:

5c91b360b7779e3af5bc60e1e1e6ffc9.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值