基于kafka实现Spring Cloud Bus消息总线

目录
  • 一、什么是消息总线
  • 二、整合消息总线实现配置自动刷新
    • 2.1 面向客户端基本架构
    • 2.2 面向服务端的架构
  • 三、利用kafka实现消息总线
    • 3.1 Spring Boot 整合kafka
    • 3.2 实现动态 刷新
    • 3.3 指定刷新范围

一、什么是消息总线

相信大多数读者之前都使用过各种各样的消息队列,例如RabbitMQ、kafka等等,消息总线和他的概念差不多,在微服务系统的架构中,我们通常会使用轻量级的消息代理来 构建一个共用的消息主题让系统中所有的微服务都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以 我们称他们为消息总线。在总线上的各个实例都可以方便的广播一些需要让其他连接到该主题上的实例都知道的消息,例如配置的变更或者其他一些管理操作等。

二、整合消息总线实现配置自动刷新

在上一篇博客中spring cloud config 中我们实现了微服务架构中的分布式配置中心,但是存在一个问题就是,当我们在git上修改了配置以后,需要我们手动通知每一个服务实例,这样的操作在实例较多的项目中是会死人的,这样的问题sping cloud 家族肯定也是会考虑到并且给出解决方案的,下面我们就来搞一下。

2.1 面向客户端基本架构

当我们系统按照上图启动以后,图中的 serviceA的三个实例会请求Config Server以获取配置,Config Server根据应用配置的规则从Git仓库中获取配置信息并返回。

此时,如果我们想要修改serviceA的配置。首先,去git服务器上修改对应的参数值,但是这样并不会触发serviceA实例的属性更新。此时我们向实例3发送post请求,此时,实例3就会将刷新请求发送到消息总线中,该消息事件会被serviceA的实例1和实例2从总线中获取到,并重新从config server中获取他们的配置信息,从而实现配置信息的动态更新。

2.2 面向服务端的架构

在之前的架构中,服务的配置更新需要通过具体服务中的某个实例发送请求,再触发对整个服务集群的配置更新。虽然能 伤心啊功能,但是 这样的结果是,我们指定的应用实例会不同于集群中的其他应用 实例,这样会增加集群内容的复杂度,不利于将来的运维工作。

三、利用kafka实现消息总线

3.1 Spring Boot 整合kafka

可以参考这篇文章

如果 spring boot 版本采用 2.2.5,则kafka版本使用2.4.0.RELEASE。

3.2 实现动态 刷新

我们利用上一篇博客中的config 的两个工程来进行改造。

3.2.1 服务端改造

增加依赖:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-kafka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-kafka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-bus</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

增加配置:

spring.kafka.bootstrap-servers=211.159.167.180:9092
spring.kafka.consumer.group-id=test-consumer-group
spring.cloud.bus.enabled=true
management.endpoints.web.exposure.include= *

关于management.endpoints.web.exposure.include= * 的配置需要注意

注意:

  • __如果是yum的话 ‘’ 需要加 ‘ ’ 单引号*
  • include: ‘*’ http://localhost:8769/actuator/bus-refresh 刷新所有微服务
  • include: ‘refresh’ http://localhost:8769/actuator/bus-refresh 不能访问

3.2.2 客户端改造

增加依赖:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-kafka</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-bus</artifactId>
        </dependency>

增加配置:

management.endpoints.web.exposure.include= *
spring.kafka.bootstrap-servers=211.159.167.180:9092
spring.cloud.bus.enabled=true

这样就ok 了,启动项目以后,当配置修改以后,我们 给服务端发发送POST请求:http://localhost:7071/actuator/bus-refresh

就可以实现动态刷新:

完整项目地址:https://github.com/zhenghaoxiao/spring-cloud-in-action/tree/bus bus 分支

3.3 指定刷新范围

在上面的例子中,我们通过向服务端请求/actuator/bus-refresh接口,从而触发总线上所有服务实例刷新,但是在一些特殊场景下,我们希望可以刷新服务中某个具体实例的配置,Spring Cloud Bus 对这种场景也有很好的支持,/actuator/bus-refreshdestination=customers:9000 提供了一个destination参数,用来定位具体要刷新的应用程序。当我们调用带有destination参数的 接口时,此时总线上的个应用实例会根据destination属性的值来判断是否为自己的实例名,若符合才进行配置刷新,若不符合就忽略该 消息。

到此这篇关于基于kafka实现Spring Cloud Bus消息总线的文章就介绍到这了,更多相关kafka消息总线Spring Cloud Bus内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringCloud消息总线Bus配置中心实现过程解析

    介绍和使用场景 1)什么是消息 一个事件,需要广播或者单独传递给某个接口 2)为什么使用这个 配置更新了,但是其他系统不知道是否更新 SpringCloud配置中心可参考: https://www.jb51.net/article/182888.htm 1.安装RabbitMQ 下载地址: http://erlang.org/download/ Erlang版本:Erlang OTP 21:10.0.1 下载地址: https://www.rabbitmq.com/install-windows

  • SpringCloud Bus消息总线的实现

    好了现在我们接着上一篇的随笔,继续来讲.上一篇我们讲到,我们如果要去更新所有微服务的配置,在不重启的情况下去更新配置,只能依靠spring cloud config了,但是,是我们要一个服务一个服务的发送post请求, 我们能受的了吗?这比之前的没配置中心好多了,那么我们如何继续避免挨个挨个的向服务发送Post请求来告知服务,你的配置信息改变了,需要及时修改内存中的配置信息. 这时候我们就不要忘记消息队列的发布订阅模型.让所有为服务来订阅这个事件,当这个事件发生改变了,就可以通知所有微服务去更新

  • SpringCloud Bus 消息总线的具体使用

    什么是消息总线 1. 概念 在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例, 它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线 2. SpringCloud Bus SpringCloud中也有对应的解决方案,SpringCloud Bus 将分布式的节点用轻量的消息代理连接起来, 可以很容易搭建消息总线,配合SpringCloud config 实现微服务应用配置信息的动态更新. 3. 其他 消息代理属于中间件.设计代理的目的就是为了能

  • SpringCloud之消息总线Spring Cloud Bus实例代码

    一.简介 在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以我们称它为消息总线. 二.消息代理 消息代理(Message Broker)是一种消息验证.传输.路由的架构模式.它在应用程序之间起到通信调度并最小化应用之间的依赖的作用,使得应用程序可以高效地解耦通信过程.消息代理是一个中间件产品,它的核心是一个消息的路由程序,用来实现接收和分发消息, 并根据设定好的消息处理流来转发给正确的应

  • 基于kafka实现Spring Cloud Bus消息总线

    目录 一.什么是消息总线 二.整合消息总线实现配置自动刷新 2.1 面向客户端基本架构 2.2 面向服务端的架构 三.利用kafka实现消息总线 3.1 Spring Boot 整合kafka 3.2 实现动态 刷新 3.3 指定刷新范围 一.什么是消息总线 相信大多数读者之前都使用过各种各样的消息队列,例如RabbitMQ.kafka等等,消息总线和他的概念差不多,在微服务系统的架构中,我们通常会使用轻量级的消息代理来 构建一个共用的消息主题让系统中所有的微服务都连接上来,由于该主题中产生的消

  • 解析Spring Cloud Bus消息总线

    概念 我们使用配置中心时,当配置中心的配置发生了变化,我们就要发送一个post请求给客户端,让它重新去拉取新的的配置.当客户端有很多时,并且还是使用同一份配置文件,这样当配置中心的配置发生改变,我们就得逐个发送post请求通知,这样无疑是很浪费人力物力的. Bus消息总线组件就帮我们解决了这个问题.他的工作流程是这样的,当配置中心的配置发生了变化时,我们给其中一个客户端发送post请求,然后client将请求的信息发送到rabbitmq队列中,然后消息队列将消息发送给别的队列. 使用 准备工作

  • Springcloud Bus消息总线原理是实现详解

    目录 springcloud Bus 什么是springcloud Bus 什么是消息总线 Bus实现自动刷新的原理 RabbitMQ的下载配置 Erlang RabbitMQ Bus动态刷新 全局广播通知代码实现 定点通知代码实现 springcloud Bus 什么是springcloud Bus   上一章的springcloud Bus是对分布式微服务的远程配置,但是有一个遗留的问题就是,Config客户端对远程配置的刷新需要手动使用post请求来完成,这就使得Config客户端动态刷新

  • Spring Cloud Stream消息驱动组件使用方法介绍

    目录 1.Stream解决的痛点问题 2.Stream重要概念 3.传统MQ模型与Stream消息驱动模型 4.Stream消息通信方式及编程模型 4.1.Stream消息通信方式 4.2.Stream编程注解 4.3.Stream消息驱动之开发生产者端 4.4.Stream消息驱动之开发消费者端 5.Stream高级之自定义消息通道 6.Stream高级之消息分组 MQ:消息队列/消息中间件/消息代理,产品有很多,ActiveMQ RabbitMQ RocketMQ Kafka 1.Strea

  • 基于Nacos实现Spring Cloud Gateway实现动态路由的方法

    简介 该文档主要介绍以Nacos为配置中心,实现Spring Cloud GateWay 实现动态路由的功能.Spring Cloud Gateway启动时候,就将路由配置和规则加载到内存里,无法做到不重启网关就可以动态的对应路由的配置和规则进行增加,修改和删除.通过nacos的配置下发的功能可以实现在不重启网关的情况下,实现动态路由. 集成 Spring Cloud GateWay集成 spring-cloud-starter-gateway:路由转发.请求过滤(权限校验.限流以及监控等) s

  • Java Spring Cloud Bus 实现配置实时更新详解

    目录 背景 实现原理 ConfigServer改造 1. pom.xml增加以下依赖 2. 配置文件中配置暴露接口 Service改造 1. pom.xml增加以下依赖 2. 通过@RefreshScope声明配置刷新时需要重新注入 测试 总结 背景 使用Spring Cloud Config Server,启动Service时会从配置中心取配置文件,并注入到应用中,如果在Service运行过程中想更新配置,需要使用Spring Cloud Bus配合实现实时更新. 实现原理 需要借助Rabbi

  • Spring Cloud 动态刷新配置信息教程详解

    有时候在配置中心有些参数是需要修改的,这时候如何不重启而达到实时生效的效果呢? 添加依赖 <dependencies> ... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ... </dependencies>

随机推荐