一、实现原理

1、ConfigServer(配置中心服务端)从远端git拉取配置文件并在本地git一份,ConfigClient(微服务)从ConfigServer端获取自己对应 配置文件;

2、当远端git仓库配置文件发生改变,ConfigServer如何通知到ConfigClient端,即ConfigClient如何感知到配置发生更新?

Spring Cloud Bus会向外提供一个http接口,即图中的/bus/refresh。我们将这个接口配置到远程的git的webhook上,当git上的文件内容发生变动时,就会自动调用/bus-refresh接口。Bus就会通知config-server,config-server会发布更新消息到消息总线的消息队列中,其他服务订阅到该消息就会信息刷新,从而实现整个微服务进行自动刷新。

二:实现方式

实现方式一:某个微服务承担配置刷新的职责

1、提交配置触发post调用客户端A的bus/refresh接口

2、客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus总线

3、Spring Cloud bus接到消息并通知给其它连接在总线上的客户端,所有总线上的客户端均能收到消息

4、其它客户端接收到通知,请求Server端获取最新配置

5、全部客户端均获取到最新的配置

存在问题:

1、打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。2、破坏了微服务各节点的对等性。3、有一定的局限性。WebHook的配置随着承担刷新配置的微服务节点发生改变。

改进如下方式二:配置中心Server端承担起配置刷新的职责,原理图如下:

1、提交配置触发post请求给server端的bus/refresh接口

2、server端接收到请求并发送给Spring Cloud Bus总线

3、Spring Cloud bus接到消息并通知给其它连接到总线的客户端

4、其它客户端接收到通知,请求Server端获取最新配置

5、全部客户端均获取到最新的配置

第一种配置:

启动rabbitmq

rabbitmq: docker run -d -p 5672:5672 -p 15672:15672 rabbitmq:management
  • product-service

    • pom.xml

                     <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>

      <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bus-amqp</artifactId>
      </dependency>
    • bootstrap.yml

      spring:
      rabbitmq:
      host: 192.168.180.112
      port: 5672
      username: guest
      password: guest #暴露全部的监控信息
      management:
      endpoints:
      web:
      exposure:
      include: "*"
    • web层

      @RestController
      @RequestScope
      @RequestMapping("/api/v1/product")
      public class ProductController {



      @Value("${server.port}")
      private String port;

      @Autowired
      private ProductService productService;

      /**
      * 获取所有商品列表
      * @return
      */
      @RequestMapping("list")
      public Object list(){
      return productService.listProduct();
      }


      /**
      * 根据id查找商品详情
      * @param id
      * @return
      */
      @RequestMapping("find")
      public Object findById(int id){

      // try {
      // TimeUnit.SECONDS.sleep(2);
      // } catch (InterruptedException e) {
      // e.printStackTrace();
      // }
      Product product = productService.findById(id);

      Product result = new Product();
      BeanUtils.copyProperties(product,result);
      result.setName( result.getName() + " data from port="+port );
      return result;
      }

      }
    • 测试,要手动发送POST http://localhost:8773/actuator/bus-refresh

      就会发现控制台会重新加载配置信息

第二种配置:

其实也是把config-server连到Bus和mq中,然后去请求它,其他服务才进行重新加载。

  • config-server

    • pom.xml

        <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>

      <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bus-amqp</artifactId>
      </dependency>
      <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-config-server</artifactId>
      </dependency>
    • application.yml

      #服务名称
      spring:
      application:
      name: config-server
      cloud:
      config:
      server:
      git:
      uri: http://192.168.180.112/root/test.git
      username: root
      password: ***********
      default-label: master
      rabbitmq:
      host: 192.168.180.112
      username: guest
      password: guest
      port: 5672
      management:
      endpoints:
      web:
      exposure:
      include: "*"


      #服务的端口号
      server:
      port: 9100


      #指定注册中心地址
      eureka:
      client:
      serviceUrl:
      defaultZone: http://localhost:8761/eureka/

都会加进队列中。

SpringCloud Config(配置中心)实现配置自动刷新(十六)的更多相关文章

  1. spring cloud 系列第8篇 —— config+bus 分布式配置中心与配置热刷新 (F版本)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.config 简介 spring cloud config 分为服务端 ...

  2. Webpack 2 视频教程 007 - 配置 WDS 进行浏览器自动刷新

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  3. .Net Core 自定义配置源从配置中心读取配置

    配置,几乎所有的应用程序都离不开它..Net Framework时代我们使用App.config.Web.config,到了.Net Core的时代我们使用appsettings.json,这些我们再 ...

  4. Spring Cloud学习笔记【十】配置中心(消息驱动刷新配置)

    上一篇中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用 Webhook 的机制每次提交代码发送请求来刷新客户端,当客户端越来越多的时候,需要每个客户端都执行一遍,这种方案 ...

  5. springcloud eureka注册中心分布式配置

    最近在学习springcloud,做下笔记以及记下遇到的坑. 1.建立maven工程,结构很简单,一个启动类和一个配置文件,结构如下图所示 2.启动类代码如下,需要添加注册中心注解:EnableEur ...

  6. springcloud配置中心客户端配置遇到的坑

    1. 出错信息如下: 在启动配置中心的客户端时,报以下错误信息: Caused by: java.lang.IllegalArgumentException: Could not resolve pl ...

  7. Consul作为配置中心,配置Asp.Net Core应用程序

    前言 最近项目逐步转向基于.Net Core,目前dotnet core 虽然已出3.0了但还没有特别成熟的框架,要实现微服务,必须要解决配置中心的问题 .不管是不是微服务,节点多了配置文件一个个更改 ...

  8. 微服务从nacos配置中心获得配置信息

    一,安装nacos, 略 二,创建父工程和微服务工程 service1, service2,以idea为例 1, new -> project -> Maven -> 填写group ...

  9. SpringBoot整合nacos实现配置中心(配置动态更新)

    官方教程:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html Linux使用docker部署nacos:https://www.cnblo ...

随机推荐

  1. 基于操作系统原理的Linux的内存管理

    一.实验目的 1.理解虚拟内存.磁盘缓存的概念. 2.掌握基本的内存管理知识. 3.掌握查看实时查看内存.内存回收的方法 二.实验内容 1. 监控内存使用情况 2. 检查和回收内容 三.实验平台 1. ...

  2. 手把手创建gulp

    这几天安装gulp踩了不少坑,现在讲解一个入门的案例解析: ==首先大家要确保node.npm.npx.gulp安装是否成功 == 这些安装都是傻瓜式安装,大家可以找到相应的教材. 创建一个自己的文件 ...

  3. Python邮件发送功能

    import smtplibfrom email.mime.text import MIMEText_user = "1147016115@qq.com"#发件人_pwd = &q ...

  4. MongoDB的全文索引

    ​ Table of Contents 背景 如何使用 准备工作:插入数据 建立全局索引 查询结果 使用中存在哪些问题? 英文存在停止词 中文无法采用全文索引 前面了解了多种索引方式,比如单键索引,多 ...

  5. .net core 3.0 Signalr - 09 待改进&交流

    ## 个人心得 写博客真的比写代码累,膜拜那些坚持写博客的大佬! 有时候零散的片段比较多,没写之前感觉有千千万万要写的东西,实际写的时候发现, 好像这个没啥说的,然后就帖了个图,或者一笔带过了 ## ...

  6. Centos6 日常使用小结

    网络配置目录 1./etc/sysconfig/network-script/ifcfg-eth0 2.netstat -rn Kernel IP routing table Destination ...

  7. IDEA 学习笔记之 Console显示日志大小

    Console显示日志大小: IntelliJ IDEA默认的Output输出缓存区大小只有1024KB,超过大小限制的就会被清除,而且还会显示[too much output to process] ...

  8. ELK 学习笔记之 elasticsearch 版本控制

    版本控制: elasticsearch 版本控制: 内部版本控制 外部版本控制 内部版本控制: 内部版本会检查你提供的版本值和文档的版本值是否一致,如果不一致就报错,一致则可以更新. curl -XP ...

  9. 快学Scala 第二十课 (trait的构造顺序)

    trait的构造顺序: 首先调用超类构造器 特质构造器在超类构造器之后,类构造器之前执行 特质从左向右被构造 每个特质当中,父特质先被构造 如果多个特质共有一个父特质,而那个父特质已经被构造,则不会被 ...

  10. 什么是Cookie?——每日一题20190623

    什么是Cookie? Cookie实际上是一小段的文本信息,客户端请求服务器,如果服务器需要记录该用户状态,就使用 response 向客户端浏览器颁发一个Cookie.客户端会把Cookie存起来, ...