【微服务】Spring Cloud Bus的注意事项和常用案例

news2024/11/15 8:00:25

文章目录

      • 强烈推荐
      • 引言
      • 关键方面
      • 注意事项
        • 1. 消息代理选择
        • 2. 消息队列配置
        • 3. 消息持久化
        • 4. 幂等性
        • 5. 安全性
        • 6. 消息大小
        • 7. 性能监控
        • 8. 错误处理
        • 9. 版本兼容性
        • 10. 测试
        • 11. 配置同步
        • 12. 日志记录
      • 常用示例
        • 示例 1: 配置同步
          • 配置服务器 (`config-server`)
          • 客户端服务 (`client-service`)
          • 触发配置刷新
        • 示例 2: 事件广播
        • 示例 3: Spring Cloud Bus 整合 RabbitMQ
      • 总结
      • 强烈推荐
      • 专栏集锦
      • 写在最后

579a429daf314744b995f37351b46548

强烈推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能

b004071ozy_05_amzn


引言

Spring Cloud Bus 是 Spring Cloud 框架中的一个强大功能,它通过轻量级消息代理(如 RabbitMQ 或 Kafka)连接分布式系统(通常是微服务)。它有助于在微服务架构的不同部分之间进行通信,并有助于跨集群传播状态变化。


关键方面

以下是 Spring Cloud Bus 的一些关键方面:

  1. 事件传播

    它使用消息代理来传播配置更改和其他状态更改,确保在不同的微服务实例之间保持一致性。

  2. 集中配置管理

    结合 Spring Cloud Config,Spring Cloud Bus 可以在不重启应用程序的情况下刷新多个应用程序实例的配置。例如,当在集中配置库中更新配置属性时,Spring Cloud Bus 可以将更改广播到所有相关服务。

  3. 可扩展性

    通过利用消息代理,Spring Cloud Bus 允许在分布式系统中进行可扩展的通信。这在大规模系统中尤为有用,因为服务之间的直接通信可能效率不高。

  4. 实现

    要实现 Spring Cloud Bus,通常需要在 Spring Boot 应用程序中包含相关依赖项,配置消息代理,并使用注解标记需要传播的配置更改或事件。


注意事项

在使用 Spring Cloud Bus 时,需要注意以下几点:

1. 消息代理选择

Spring Cloud Bus 支持多种消息代理(如 RabbitMQ、Kafka),选择适合的消息代理非常重要。需要根据系统的需求和性能要求来决定使用哪一种。

2. 消息队列配置

确保消息队列的配置正确,包括连接信息、队列名称、主题等。如果配置不当,可能会导致消息无法正常传递或丢失。

3. 消息持久化

确保消息代理配置了持久化策略,以避免在服务重启或崩溃时丢失消息。

4. 幂等性

由于网络的不确定性,消息可能会被多次接收和处理。因此,服务处理消息时需要保证幂等性,避免因重复处理消息导致的数据不一致。

5. 安全性

考虑到消息中可能包含敏感信息,需配置合适的安全措施,如消息加密、认证授权等,防止消息被非法访问或篡改。

6. 消息大小

消息的大小会影响传输性能和系统稳定性。尽量保持消息体积小,如果需要传递大数据,考虑将数据放在共享存储中,仅在消息中传递数据引用或标识符。

7. 性能监控

监控消息代理和消息传递的性能,及时发现和解决性能瓶颈。可以使用消息代理提供的监控工具或第三方监控系统。

8. 错误处理

建立健全的错误处理机制,确保在消息处理失败时有相应的补救措施,如重试机制、死信队列等。

9. 版本兼容性

确保 Spring Cloud Bus 和所使用的消息代理版本之间的兼容性。关注依赖库的更新日志,避免因版本不兼容导致的问题。

10. 测试

在生产环境部署前,充分测试消息传递机制,确保在各种情况下消息都能正确传递和处理。

11. 配置同步

使用 Spring Cloud Bus 来同步配置时,确保配置中心与各服务实例的同步机制可靠,避免因配置不同步导致的服务异常。

12. 日志记录

记录消息的传递和处理日志,方便问题排查和系统维护。


常用示例

下面是几个常用的 Spring Cloud Bus 示例,展示了如何在微服务架构中使用 Spring Cloud Bus 来实现配置同步和事件广播。

示例 1: 配置同步

假设我们有两个服务 config-serverclient-service。我们将使用 Spring Cloud Bus 来同步配置。

配置服务器 (config-server)
  1. 添加依赖

    config-serverpom.xml 中添加以下依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
    
  2. 配置文件

    application.yml 中配置 RabbitMQ:

    spring:
      cloud:
        config:
          server:
            git:
              uri: https://github.com/your/repo
      rabbitmq:
        host: localhost
        port: 5672
        username: guest
        password: guest
    
  3. 主应用类

    ConfigServerApplication.java 中启用配置服务器:

    @SpringBootApplication
    @EnableConfigServer
    public class ConfigServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConfigServerApplication.class, args);
        }
    }
    
客户端服务 (client-service)
  1. 添加依赖

    client-servicepom.xml 中添加以下依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
    
  2. 配置文件

    bootstrap.yml 中配置:

    spring:
      application:
        name: client-service
      cloud:
        config:
          uri: http://localhost:8888
      rabbitmq:
        host: localhost
        port: 5672
        username: guest
        password: guest
    
  3. 刷新端点

    application.yml 中启用 Actuator 端点:

    management:
      endpoints:
        web:
          exposure:
            include: bus-refresh
    
  4. 主应用类

    ClientServiceApplication.java 中启动客户端服务:

    @SpringBootApplication
    public class ClientServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(ClientServiceApplication.class, args);
        }
    }
    
触发配置刷新

当你在配置仓库中更改配置文件时,可以通过以下方式触发配置刷新:

发送 POST 请求到配置服务器的 /actuator/bus-refresh 端点:

curl -X POST http://localhost:8888/actuator/bus-refresh
示例 2: 事件广播

使用 Spring Cloud Bus 还可以在多个服务之间广播自定义事件。下面是一个简单的示例。

  1. 定义事件

    创建一个自定义事件类:

    public class CustomEvent extends RemoteApplicationEvent {
        private String message;
    
        // 必须的默认构造函数
        public CustomEvent() {}
    
        public CustomEvent(Object source, String originService, String destinationService, String message) {
            super(source, originService, destinationService);
            this.message = message;
        }
    
        public String getMessage() {
            return message;
        }
    }
    
  2. 发布事件

    在一个服务中发布事件:

    @RestController
    public class EventController {
        @Autowired
        private ApplicationEventPublisher publisher;
    
        @PostMapping("/publish")
        public void publishEvent(@RequestParam String message) {
            CustomEvent event = new CustomEvent(this, "origin-service", "destination-service", message);
            publisher.publishEvent(event);
        }
    }
    
  3. 接收事件

    在另一个服务中接收事件:

    @Component
    public class CustomEventListener implements ApplicationListener<CustomEvent> {
        @Override
        public void onApplicationEvent(CustomEvent event) {
            System.out.println("Received event with message: " + event.getMessage());
        }
    }
    
示例 3: Spring Cloud Bus 整合 RabbitMQ

以下是如何使用 Spring Cloud Bus 和 RabbitMQ 的一个简单示例:

  1. 添加依赖

    pom.xmlbuild.gradle 文件中添加必要的依赖项。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
    
  2. 配置消息代理

    application.propertiesapplication.yml 文件中配置消息代理设置。

    spring.rabbitmq.host=localhost
    spring.rabbitmq.port=5672
    
  3. 启用 Bus 刷新

    使用 @RefreshScope 注解表示当收到事件时,bean 应该刷新其配置。

    @RestController
    @RefreshScope
    public class MyController {
        @Value("${my.config.property}")
        private String myConfigProperty;
        
        @GetMapping("/property")
        public String getProperty() {
            return myConfigProperty;
        }
    }
    
  4. 触发刷新

    触发刷新事件(例如,通过 HTTP 端点)来传播配置更改。

    @RestController
    public class RefreshController {
        @Autowired
        private ApplicationContext applicationContext;
        
        @PostMapping("/refresh")
        public void refresh() {
            applicationContext.publishEvent(new RefreshRemoteApplicationEvent(this, "configServer", null));
        }
    }
    

Spring Cloud Bus 是在分布式系统中维护一致性和管理状态的强大工具。它简化了跨多个微服务实例处理配置更改和其他状态更改的过程。


总结

Spring Cloud Bus 是一个强大的工具,能够在分布式系统中实现配置同步和事件广播,有效提高系统的灵活性和可维护性。

通过选择合适的消息代理、配置持久化和安全措施、保证消息处理的幂等性、建立健全的错误处理机制,并进行充分的测试和日志记录,可以确保 Spring Cloud Bus 的高效运行。

无论是实现配置的动态同步,还是在服务之间广播事件,Spring Cloud Bus 都能显著提升微服务架构的可靠性和可扩展性。


强烈推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能

b004071ozy_05_amzn


专栏集锦

大佬们可以收藏以备不时之需:

Spring Boot 专栏:http://t.csdnimg.cn/peKde

ChatGPT 专栏:http://t.csdnimg.cn/cU0na

Java 专栏:http://t.csdnimg.cn/YUz5e

Go 专栏:http://t.csdnimg.cn/Jfryo

Netty 专栏:http://t.csdnimg.cn/0Mp1H

Redis 专栏:http://t.csdnimg.cn/JuTue

Mysql 专栏:http://t.csdnimg.cn/p1zU9

架构之路 专栏:http://t.csdnimg.cn/bXAPS


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!

如果有项目或者毕设合作,请V:fengyelin8866,备注项目合作

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库的事务隔离级别有哪些?

并行事务会引发什么问题&#xff1f; 同时处理多个事务的时候&#xff0c;就可能出现脏读&#xff08;dirty read&#xff09;、不可重复读&#xff08;non-repeatable read&#xff09;、幻读&#xff08;phantom read&#xff09;的问题。脏读: 如果一个事务「读到」了另一个…

MQ消息队列+Lua 脚本实现异步处理下单流程,将同步下单改为异步下单

回顾一下下单流程&#xff1a; 用户发起请求 会先请求Nginx,Nginx反向代理到Tomcat&#xff0c;而Tomcat中的程序&#xff0c;会进行串行工作&#xff0c; 分为以下几个操作&#xff1a; 1 查询优惠券 2 判断秒杀库存是否足够 3 查询订单 4 校验是否是一人一单 5 扣减库…

Unity Shader - 2024 工具篇

目录 IDE 工具建议 IDE工具 Sublime 3 大势所趋&#xff0c;但是Sublime 使用插件还是相当的不习惯 代码跳转 Go to definite IDE 工具建议 () what is the best ide for coding shaderlab - #4 by DaveAstator - Unity Engine - Unity Discussions​​​​​​​I IDE工…

用Swagger进行后端接口测试的实战操作

目录 一.什么是Swagger&#xff1f; 二.Swagger的使用操作流程&#xff1a; 1.在pom.xml配置文件导入 Knife4j 的依赖&#xff1a; 2.在config配置类中加入 Knife4j 的相关配置并设置静态资源映射&#xff08;否则接口文档无法访问&#xff09;&#xff1a; 三.Swagger的四个…

案例研究|柯尼卡美能达软件开发(大连)有限公司基于DataEase构筑内部数据可视化体系

柯尼卡美能达软件开发&#xff08;大连&#xff09;有限公司于2007年5月25日注册成立。公司以“洞悉在工作的人们真实情况&#xff0c;探寻他们的愿望&#xff0c;持续提供使人们更加幸福的服务”为使命&#xff0c;致力于系统品质测试服务、软件开发服务、IT安全服务、高级BPO…

docker文件挂载和宿主主机文件的关系

一、背景 在排查docker日志时发现在读取docker的文件时找不到文件&#xff0c;在宿主主机上可以查到对应的文件。这里就要理解docker文件目录和宿主主机上的文件的关系。 二、Docker文件系统和宿主系统 Docker文件和宿主文件之间的关系主要体现在Docker容器的运行环境中。Docke…

C# 数组常用遍历方式

// 假设数组Point[] points new Point[2];// 第一种遍历 forfor (int i 0; i < points.Length; i){Point p points[i];Console.WriteLine($"X{p.X},y{p.Y}");}// 第二种遍历 foreachforeach (Point p in points){Console.WriteLine($"X{p.X},y{p.Y}"…

没有51基础,能不能学好STM32?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「STM32的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 我们通常准备攻读一本大部…

哪种小型内衣洗衣机好用?五款人气爆款机型不可错过

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

51单片机-第四节-定时器

一、定时器&#xff1a; 1.介绍&#xff1a; 单片机内部实现的计时系统。 作用&#xff1a;代替长时间Daley&#xff0c;提高cpu效率。 数量&#xff1a;至少2个&#xff0c;T0&#xff0c;T1&#xff0c;T2等。其中T0&#xff0c;T1为所有51单片机共有&#xff0c;T2等为不…

gitee设置ssh公钥密码频繁密码验证

gitee中可以创建私有项目&#xff0c;但是在clone或者push都需要输入密码&#xff0c; 比较繁琐。 公钥则可以解决该问题&#xff0c;将私钥放在本地&#xff0c;公钥放在gitee上&#xff0c;当对项目进行操作时带有的私钥会在gitee和公钥进行验证&#xff0c;避免了手动输入密…

Domainim:一款高效的企业级网络安全扫描工具

关于Domainim Domainim是一款功能强大的企业级网络安全扫描工具&#xff0c;该工具运行效率高&#xff0c;功能完善&#xff0c;可以帮助广大研究人员针对企业或组织网络执行大规模安全扫描任务。 该工具可以快速执行网络安全扫描和域名/子域名网络侦查任务&#xff0c;旨在使…

ES中的数据类型学习之ARRAY

Arrays | Elasticsearch Guide [7.17] | Elastic 中文翻译 &#xff1a;Array Elasticsearch 5.4 中文文档 看云 Arrays In Elasticsearch, there is no dedicated array data type. Any field can contain zero or more values by default, however, all values in the a…

使用MariaDB数据库管理系统

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、数据库管理系统 数据库是指按照某些特定结构来存储数据资料的数据仓库&#xff1b; 数据库管理系统是一种能够对数据库中存放的数据进行建立、修…

【电源专题】结合锂电池相关资料和华为手机聊聊锂离子电池使用条件限制

在文章:【电源专题】锂电池的特点和工作原理 中我们讲到了一些关于锂电池种类和特点、工作原理等。但是对于锂离子电池使用条件限制却没有介绍,本文基于手机产商 锂离子电池使用条件-电池性能和应用介绍 | 华为官网 (huawei.com)提供的介绍文档再次深入学习锂离子电池的一些特…

基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-发送信息服务处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、因为仿钉钉设计器里发送消息处理是一个服务任务&#xff0c;所以要根据这个服务任务进行处理 2、这里目前只对消息进行处理&#xff0c;就是用websocket的发送方式 输入相应的内容&…

23种设计模式【结构型模式】详细介绍之【组合模式】

23种设计模式【结构型模式】详细介绍之【组合模式】 设计模式的分类和应用场景总结组合模式详解1. 概述2. 组成部分3. 实现方式4. 组合模式的优缺点4.1 优点4.2 缺点 5. 使用场景6. 实际应用7. 总结 设计模式的分类和应用场景总结 可以查看专栏设计模式&#xff1a;设计模式 组…

数字信号||离散序列的基本运算(2)

实验二 离散序列的基本运算 一、实验目的 (1)进一步了解离散时间序列时域的基本运算。 (2)了解MATLAB语言进行离散序列运算的常用函数&#xff0c;掌握离散序列运算程序的编写方法。 二、实验涉及的MATLAB子函数 1.find 功能&#xff1a;寻找非零元素的索引号。 调用格…

(十九)原生js案例之h5地里位置信息与高德地图的初使用

h5 地里位置信息 1. 获取当前位置信息 window.onload function () {const oBtn document.querySelector("#btn");const oBox document.querySelector("#box");oBtn.onclick function () {window.navigator.geolocation.getCurrentPosition(function (…

STM32嵌入式人工智能边缘计算应用教程

目录 引言环境准备边缘计算系统基础代码实现&#xff1a;实现嵌入式人工智能边缘计算系统 4.1 数据采集模块 4.2 数据处理与推理模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;边缘计算与优化问题解决方案与优化收尾与总结 1. 引言 嵌入式人工智…