Spring Cloud Bus快速入门Demo

1.什么是Spring Cloud Bus?

Spring Cloud Bus 是一个用于将分布式系统的节点连接起来的框架,它使用了轻量级消息代理来实现节点之间的通信。Spring Cloud Bus 可以将配置变更事件、状态变更事件和其他管理事件广播到系统中的所有节点,以便于各个节点可以及时响应。 Spring Cloud Bus 主要由两部分组成:消息代理和事件总线。消息代理是一个可插拔的组件,它可以使用 RabbitMQ、Kafka 等流行的消息中间件实现。事件总线则是在消息代理之上构建的一个抽象层,它提供了向所有节点广播事件的机制,并且对消息的序列化、反序列化、发送和接收进行了封装,让开发者可以专注于业务逻辑的实现。 Spring Cloud Bus 主要的使用场景是在分布式系统中对配置的管理。它可以将配置的变更事件广播到所有节点,从而让节点实时获取最新的配置。此外,Spring Cloud Bus 还可以用于状态的管理和监控,例如在节点启动、停止、重启等状态变更事件发生时,将事件广播到系统中的所有节点,以便于节点可以做出相应的响应。

基本原理

ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置

11

 

2.环境搭建

rabbiitmq

version: '3'
services:
  rabbitmq:
    image: registry.cn-hangzhou.aliyuncs.com/zhengqing/rabbitmq:3.7.8-management
    container_name: rabbitmq
    hostname: my-rabbit
    restart: unless-stopped
    environment:
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
      RABBITMQ_DEFAULT_VHOST: my_vhost
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: admin
    volumes:
      - "./rabbitmq/data:/var/lib/rabbitmq"
    ports:
      - "5672:5672"
      - "15672:15672"

启动

docker-compose -f docker-compose-rabbitmq.yml -p rabbitmq up -d

web manager:http://127.0.0.1:15672 user/password:admin/admin

9

3.代码工程

 实验目的

实验各个应用更新自身配置

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud-bus</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>bus-app1</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <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>
    </dependencies>
</project>

controller

package com.et.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author liuhaihua
 * @version 1.0
 * @ClassName DemoController
 * @Description todo
 * @date 2024/11/01/ 13:47
 */
@RestController
@RefreshScope
public class DemoController {
    @Value("${example.property}")
    private String exampleProperty;

    @GetMapping("/property")
    public String getProperty() {
        return exampleProperty;
    }
}

@RefreshScope主要就是基于@Scope注解的作用域代理的基础上进行扩展实现的,加了@RefreshScope注解的类,在被Bean工厂创建后会加入自己的refresh scope 这个Bean缓存中,后续会优先从Bean缓存中获取,当配置中心发生了变更,会把变更的配置更新到spring容器的Environment中,并且同事bean缓存就会被清空,从而就会从bean工厂中创建bean实例了,而这次创建bean实例的时候就会继续经历这个bean的生命周期,使得@Value属性值能够从Environment中获取到最新的属性值,这样整个过程就达到了动态刷新配置的效果。

启动类

package com.et;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Bus1Application {



    public static void main(String[] args) {
        SpringApplication.run(Bus1Application.class, args);
    }


}

配置文件 bus-app1配置文件

server:
  port: 8081
spring:
  cloud:
    config:
      uri: http://127.0.0.1:8888/
      #name: crm,config-client
      name: config-client
      profile: dev
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    virtual-host: my_vhost
    username: admin
    password: admin
management:
  endpoints:
    web:
      exposure:
        include: "*"

bus-app2配置文件

server:
  port: 8082
spring:
  cloud:
    config:
      uri: http://127.0.0.1:8888/
      #name: crm,config-client
      name: config-client
      profile: dev
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    virtual-host: my_vhost
    username: admin
    password: admin
management:
  endpoints:
    web:
      exposure:
        include: "*"

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springcloud-demo(spring cloud bus)

4.测试

  • 启动上节课讲的Config-Server应用(Spring Cloud Config快速入门Demo)
  • 启动bus-app1应用
  • 启动bus-app2应用
  • 访问http://127.0.0.1:8082/property ,返回config-client-dev.yml文件里面配置值
  • 修改config-client-dev.yml文件里面的值,然后post请求http://127.0.0.1:8082/actuator/busrefresh刷新客户端配置,
  • 再次访问http://127.0.0.1:8082/property ,值变成新修改的值
  • 访问http://127.0.0.1:8081/property ,值也是变成新修改的值

5.引用

  • Spring Cloud Bus
  • Spring Cloud Bus快速入门Demo | Harries Blog™

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/908751.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过Wireshark抓包分析,体验HTTP请求的一次完整交互过程

目录 一、关于Wireshark 1.1、 什么是Wireshark 1.2、下载及安装 二、HTTP介绍 2.1、HTTP请求过程介绍 2.2 、TCP协议基础知识 2.2.1、概念介绍 2.2.2、TCP协议的工作原理 2.2.3、三次握手建立连接 2.3.4、四次挥手断开连接 2.3、Wireshark抓包分析过程 2.3.1、三次握…

聚观早报 | 比亚迪腾势D9登陆泰国;苹果 iOS 18.2 将发布

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 11月5日消息 比亚迪腾势D9登陆泰国 苹果 iOS 18.2 将发布 真我GT7 Pro防尘防水细节 小米15 Ultra最快明年登场 …

tomcat 开启远程debug模式

1.修改位置 CATALINA_OPTS"-Xdebug -Xrunjdwp:transportdt_socket,address*:8000,servery,suspendn"2.修改环境变量的方式 apache-tomcat-9.0.86/bin/setenv.sh export JAVA_HOME/opt/jdk1.8.0_171 export CATALINA_HOME/opt/apache-tomcat-9.0.86 export JAVA_OP…

【工具变量】中国制造2025试点城市数据集(2000-2023年)

数据简介&#xff1a;《中国制造2025》是中国ZF于2015年5月8日印发的一项战略规划&#xff0c;旨在加快制造业的转型升级&#xff0c;提升制造业的质量和效益&#xff0c;实现从制造大国向制造强国的转变。该规划是中国实施制造强国战略的第一个十年行动纲领&#xff0c;明确提…

VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)

以最简单的以原子的跑马灯为例&#xff1a; 1、点击CtrlShiftP&#xff0c;输入setting&#xff0c;然后回车 2、输入Browse 3、点击下面C_Cpp > Default > Browse:Path里面添加你的工程路径 然后就可以愉快地跳转定义啦~ 希望对你有帮助&#xff0c;如果还不可以的话&a…

java常用框架介绍

1. Spring Boot 特点&#xff1a;Spring Boot是Spring家族中的一个新成员&#xff0c;它基于Spring 4.0设计&#xff0c;提供了默认配置、简化依赖管理以及内嵌式容器等特性&#xff0c;使得开发者能够快速创建独立的、生产级别的Spring应用。 用途&#xff1a;Spring Boot特别…

Leetcode328奇偶链表,Leetcode21合并两个有序链表,Leetcode206反转链表 三者综合题

题目描述 思路分析 这题的思路就和我们的标题所述一样&#xff0c;可以看作是这3个题的合并&#xff0c;但是稍微还有一点点区别 比如&#xff1a;奇偶链表这道题主要是偶数链在了奇数后面&#xff0c;字节这个的话是奇偶链表分离了 所以字节这题的大概思路就是&#xff1a; …

自监督学习:机器学习的未来新方向

引言 自监督学习&#xff08;Self-Supervised Learning, SSL&#xff09;是近年来机器学习领域的一个重要发展方向&#xff0c;迅速成为许多研究和应用的热点。与传统的监督学习不同&#xff0c;自监督学习利用未标注数据&#xff0c;通过设计自我生成标签的任务&#xff0c;帮…

【算法】Prim最小生成树算法

目录 一、思想 二、代码 在阅读本文前推荐优先食用&#xff1a; 【算法】Kruskal最小生成树算法-CSDN博客https://blog.csdn.net/Eristic0618/article/details/143312482?spm1001.2014.3001.5501 一、思想 Kruskal算法基于边的选择&#xff0c;因此更适用于稀疏图。而对于…

CPU用户时间百分比

在计算机系统中&#xff0c;"CPU用户时间百分比&#xff08;CPU User Time&#xff09;"是一个性能监控指标&#xff0c;它描述了CPU在用户模式下执行的累积时间与总的CPU时间的比例。这个指标可以帮助我们了解系统在执行用户态程序时的负载情况。下面是一些关于CPU用…

java-智能识别车牌号_基于spring ai和开源国产大模型_qwen vl

用大模型做车牌号识别&#xff0c;最简单高效 在Java场景中&#xff0c;java识别车牌号的需求非常普遍。过去&#xff0c;我们主要依赖OCR等传统方法来实现java识别车牌号&#xff0c;但这些方法的效果往往不稳定。随着技术的发展&#xff0c;现在有了更先进的解决方案——大模…

IoTDB时序数据库使用

简介 Apache IoTDB 是一款低成本、高性能的物联网原生时序数据库。它可以解决企业组建物联网大数据平台管理时序数据时所遇到的应用场景复杂、数据体量大、采样频率高、数据乱序多、数据处理耗时长、分析需求多样、存储与运维成本高等多种问题。 IoTDB官网 1. 连接数据库 官方…

Android camera2

一、序言 为了对阶段性的知识积累、方便以后调查问题&#xff0c;特做此文档&#xff01; 将以camera app 使用camera2 api进行分析。 (1)、打开相机 openCamera (2)、创建会话 createCaptureSession (3)、开始预览 setRepeatingRequest (4)、停止预览 stopRepeating (5)、关闭…

【设计模式系列】组合模式(十二)

目录 一、什么是组合模式 二、组合模式的角色 三、组合模式的典型应用 四、组合模式在Mybatis SqlNode中的应用 4.1 XML映射文件案例 4.2 Java代码使用案例 一、什么是组合模式 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;其核…

【Linux 27】HTTP 协议中的 cookie 和 session

文章目录 &#x1f308;一、Cookie 的相关概念⭐ 1. Cookie 的概念⭐ 2. Cookie 的工作原理⭐ 3. Cookie 的分类⭐ 4. Cookie 的用途⭐ 5. Cookie 设置的基本格式⭐ 6. Cookie 设置时的注意事项⭐ 7. Cookie 的生命周期⭐ 8. Cookie 的安全性问题 &#x1f308; 二、Session 的…

flask小白注意了!当我们通过IP:5000的形式无法访问服务时,大概率问题出在这里!!!

我们在使用Flask开发应用时&#xff0c;通过127.0.0.1:5000 或者localhost:5000访问应用正常&#xff0c;但是当使用本机ip 访问时却出现了 无法访问此网站的错误&#xff0c;如下图&#xff1a; 按照图中的提示&#xff0c;检查了代理服务器和防火墙&#xff08;包括关闭了电脑…

Excel:vba实现批量插入图片

实现的效果&#xff1a; 实现的代码&#xff1a; Sub InsertImageNamesAndPictures()Dim PicPath As StringDim PicName As StringDim PicFullPath As StringDim RowNum As IntegerDim Pic As ObjectDim Name As String 防止表格里面有脏数据Cells.Clear 遍历工作表中的每个图…

余承东放话,华为最强旗舰马上就来,国产系统迎来关键一战

Mate 70系列要来了&#xff01; 10月&#xff0c;OPPO、小米、vivo、荣耀等一众手机厂商都抛出了年度旗舰手机&#xff0c;机圈大战闹得沸沸扬扬。那边厢&#xff0c;低调的华为也终于传来了激动人心的消息&#xff1a;Mate 70系列要来了&#xff01;余承东在微博发文称Mate 7…

Linux之实战命令65:hostnamectl应用实例(九十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

电力电子计算部分

1.瞬时功率 任何装置、设备的瞬时功率都是通过加在其上的电压及其流过的电流计算的&#xff0c;表达式为&#xff1a; 瞬时功率表达式适用于任何装置、设备或电路。瞬时功率是一个时变的量。 2.能量 能量或功&#xff0c;是对瞬时功率在时间上的积分。在时间t1到t2内所有吸收…