【spring开发】Spring Cloud Bus快速入门Demo

news/2024/11/5 0:26:12/文章来源:https://www.cnblogs.com/o-O-oO/p/18527010
一、什么是Spring Cloud Bus?二、环境搭建三、代码工程四、测试五、引用

原创 Harries HBLOG

一、什么是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的服务就能得到通知,然后去更新自身的配置

二、环境搭建

rabbiitmq:


version: '3'
services:rabbitmq:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/rabbitmq:3.7.8-managementcontainer_name: rabbitmqhostname: my-rabbitrestart: unless-stoppedenvironment:TZ: Asia/ShanghaiLANG: en_US.UTF-8RABBITMQ_DEFAULT_VHOST: my_vhostRABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: adminvolumes:- "./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

三、代码工程

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

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-clientname: config-clientprofile: devrabbitmq:host: 127.0.0.1port: 5672virtual-host: my_vhostusername: adminpassword: admin
management:endpoints:web:exposure:include: "*"

bus-app2配置文件


server:port: 8082
spring:cloud:config:uri: http://127.0.0.1:8888/#name: crm,config-clientname: config-clientprofile: devrabbitmq:host: 127.0.0.1port: 5672virtual-host: my_vhostusername: adminpassword: admin
management:endpoints:web:exposure:include: "*"

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

代码仓库

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

四、测试

启动上节课讲的Config-Server应用([Spring Cloud Config快速入门Demo](http://mp.weixin.qq.com/s?__biz=MzAxMjY5NDU2Ng==&mid=2651869889&idx=1&sn=d4866d08da9e92132241dc039be80830&chksm=80491788b73e9e9e555c0891be66e8d4d2a8efec0613a73c64f534b45d67182bc288cd381bf6&scene=21#wechat_redirect))启动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 ,值也是变成新修改的值

五、引用

https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/
https://www.liuhaihua.cn/archives/711639.html

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型-训练推理 模型大小与硬件GPU 选取的大致关系-05

目录0. 计算公式1. 市面上常见的显卡2. 训练2. 推理 0. 计算公式 重点:显存大小 = 模型参数占用 + 梯度占用 + 优化器占用 + CUDA kernel占用 + 中间计算结果 每个神经元节点 不仅仅有自身的权重值 在进行反向传播的时候还有梯度的累计值 1. 市面上常见的显卡 英伟达GPU 3060 …

MSSprinkler:一款针对MS账号的密码喷射安全测试工具

原创 Alpha_h4ck FreeBuf关于MSSprinkler MSSprinkler是一款功能强大的密码喷射安全测试工具,可以帮助广大研究人员从外部角度测试其 Microsoft Online 帐户的安全性。 MSSprinkler 是用 PowerShell 编写的,可以直接作为模块导入,并且没有其他依赖项。MSSprinkler 依靠 Micr…

Unbound数据结构分析

mesh结构msg_cache + rr_cache缓存数据 msg_cache里的entry是msgreply_entry,rr_cache里的entry是ub_packed_rrset_key。 ub_packed_rrset_key的rrset_id_type通过alloc_get_id方法获取。 ub_packed_rrset_key通过alloc_special_obtain方法从env->alloc分配。

开发中常用到的10个数据结构

开发中常用到的10个数据结构 ▪️列表(List):用于存储有序集合,如Twitter动态流🐦。 ▪️数组(Array):连续存储的元素集合,适用于数学运算和大数据集📊。 ▪️栈(Stack):后进先出(LIFO)的数据结构,常用于撤销/重做功能🔄。 ▪️队列(Queue):先进先出(F…

【JavaScript安全】JS沙箱隔离

原创 码中仙一、什么是沙箱环境 在计算机安全中,沙箱(Sandbox)是一种用于隔离正在运行程序的安全机制,通常用于执行未经测试或不受信任的程序或代码,它会为待执行的程序创建一个独立的执行环境,内部程序的执行不会影响到外部程序的运行。 其实在前端世界里,沙箱环境无处…

Unbound启动流程分析

unbound入口在run_daemon方法。 daemon_init方法,分配struct daemon结构体,设置信号处理方法,初始化openssl库,设置时区,设置daemon->need_to_exit为0,初始化模块栈(modstack_init方法)设置deamon->mods结构体(struct module_stack)的num为0、mod为NULL,为dae…

如何给 GoPro 拍摄的视频添加时间水印 All In One

如何给 GoPro 拍摄的视频添加时间水印 All In One 执法记录仪 时间水印是指在拍摄的照片或视频上添加一个显示时间的标识。 这个标识通常以数字的形式出现在画面的一个角落,它显示了拍摄的具体日期和时间。 时间水印的目的是为了记录下拍摄的时间,以便用户可以更好地回顾和分…

《使用Gin框架构建分布式应用》读后感

1.为什么选择这本书? 因为工作中有一个项目使用了Go进行开发,项目用到了MySQL, Redis,GORM,Rabbitmq,Zap等组件进行开发,没有使用到Web框架,因为本人是Web开发方向,所以就想了解下Web框架在Go开发中的应用,看看别人是怎么用的。国外的Go Web框架有:Echo, Gin, Iris, …

计算机组成原理基础知识(一)

来源:早期的冯诺依曼计算机以运算器为中心,现代计算机以存储器为中心; 现代计算器的结构:计算机硬件的基本组成:计算机系统的层次结构:计算机的性能指标:小练习:进制转换:

《图解设计模式》 第四部分 分开考虑

第九章 Bridge模式//使用代码 public class Main(){public static void main(String[] args){Display d1 = new Display(new StringDisPlayImpl("Hello, China."));Display d2 = new CountDisplay(new StringDisPlayImpl("Hello, World."));CountDisplay d…