SpringCloud MQ

Springcloud集成RocketMQ,实现生产者和消费者案例 整合springcloud,实现生产和消费 案例实现如何携带Key和Tag的方式,请参考 阅读详情

概述

MQ(Message Queue),也就是 消息队列,就是在消息的传输过程中保存消息的容器。目前比较主流的有 RocketMQ、RabbitMQ、ActiveMQ(比较老了) 以及 Kafka(一个项目可能也会集成多种 MQ 产品来实现不同功能),以下是不同 MQ 的基本信息。

在这里插入图片描述

使用 MQ 的好处

服务解耦

典型的消费者-生产者模型:生产者只需要关注发消息,消费者只需要关注收消息,没有业务逻辑的侵入,从而实现解耦。假设业务 A 需要处理订单,又得发短信、邮件,同一代码耦合起来会疯的,那么就只需要发个异步消息让其他专门发短信的业务去做就好了。A 不需要去关心短信的业务逻辑。

流量削峰

假设 A 服务平时访问量是每秒 300 请求,一台服务器可轻松应对 。但在秒杀的时候, 访问量翻了几十倍,达到每秒 30000次 请求,单台服务器就挂了,想着增加多几台服务器减压,可是这种高压每天只出现一次,一次跟你啪啪速度一样快(见鬼了)。那这么多服务器在平时都只分担每秒几十次请求,这样很浪费资源了,这时可以设置一个 MQ 当用户发起请求后台并不会立刻处理,而是通过 MQ 发送一个请求,发送到队列里面,排队等待处理… 然后接收者,发现队列中有消息,一个一个的取出,慢慢进行后台处理…

异步调用

A 服务是给用户外卖下单,订单数据可以发送到消息队列服务器,A 立刻响应客户端 “商家准备中”,
消息接收方 B 监听获取每一个订单消息后,发送订单给商家,接收方 C 监听后寻找快递小哥给商家。

队列主流协议

  • AMQP:是一个二进制协议,具有以下特性:多通道、可协商、异步、安全、高效等。
    在这里插入图片描述
  • MQTT:是用于消息队列服务的轻量级、发布订阅、端到端网络协议,运行在TCP/IP协议之上,为资源或网络带宽有限的远程设备提供实时有效的消息服务。
    在这里插入图片描述
  • Kafka:Kafka、RocketMQ都是使用的自定义协议,用于处理海量流式数据,具有分布式、高性能、高可靠、低延迟、高扩展性等特征。
    在这里插入图片描述

消息传输模型

主流的消息中间件的传输模型主要为点对点模型和发布订阅模型。

点对点模型:也叫队列模型,具有匿名消费(上下游沟通的唯一的身份就是队列,消费者从队列获取消息无法申明独立身份)和一对一通信特点(下游消费者即使有多个,但都没有自己独立的身份,因此共享队列中的消息,每一条消息都只会被唯一的消费者处理。因此点对点模型只能实现一对一通信。)

在这里插入图片描述
发布订阅模型:相比队列模型的匿名消费方式,发布订阅模型中消费方都会具备的身份,一般叫做订阅组(订阅关系),不同订阅组之间相互独立不会相互影响。而基于独立身份的设计,同一个主题内的消息可以被多个订阅组处理,每个订阅组都可以拿到全量消息。因此发布订阅模型可以实现一对多通信。

在这里插入图片描述

安装

这里主要使用 RocketMQ,安装可以参考 Docker Compose 部署。

因为有些朋友总喜欢捣鼓怎么安装软件,这里真的不建议(纯属浪费时间),对技术无任何提升,我们是使用工具来替我们做事,不是去研究他怎么安装更正确。当然一点配置还是需要懂,但是官网有对应的参数可以参考

RocketMQ 官网

概念

参考 基本概念 和 基本特性

简单说,就是 Producer 生成某个 Topic 的 Message ,通过 Queue 发送到 Broker,Consumer 通过订阅 Topic,把 Queue 里面的 Message 拉取过来。

消息模型(Message Model)

RocketMQ 主要由 Producer、Broker、Consumer 三部分组成,Producer 生产消息,Consumer 消费消息,Broker 存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息

名字服务(Name Server)与 代理服务器(Broker Server)

  • Name Server 简单说就是给 Broker Server 用的注册中心功能(类似于 Nacos 或者 Zookeeper),充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的 Broker IP 列表。

  • 这里的代理服务器别跟 nginx 什么的弄混了,这里的 Broker Server 是消息中转角色,负责存储消息、转发消息。负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。 Broker Server 也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。

消息生产者(Producer)与 生产者组(Producer Group)

  • 消息生产者会把业务应用系统里产生的消息发送到 Broker Server。有多种发送方式:同步、异步、顺序、单向。同步和异步方式均需要 Broker 返回确认信息,单向发送不需要。

  • 生产者组就是把 同一类的生产者给组合到一块,同一组 Producer 发送同一类消息且发送逻辑一致。如果发送的是事务消息且原始生产者在发送之后崩溃,则 Broker 服务器会联系同一生产者组的其他生产者实例以提交或回溯消费。

消息消费者(Consumer)与 消费者组(Consumer Group)

  • 消息消费者会从 Broker Server 拉取消息并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。

  • 消费者组就是同一类的消费者放到一个组里,这类 Consumer 通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。要注意的是,消费者组的消费者实例必须订阅完全相同的 Topic。RocketMQ 支持集群消费(Clustering)和广播消费(Broadcasting)。

主题(Topic)与 队列(Queue)

  • 主题用来隔离不同消息类型的,是某一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是进行消息订阅的基本单位。比如短信有短信的主题和邮件的主题。

  • 队列( Topic 分区,称作 Message Queue) 是消息存储和传输的实际容器,也是消息的最小存储单元。队列天然具备顺序性。RocketMQ 的主题都是由多个队列组成,以此实现队列数量的水平拆分和队列内部的流式存储。RocketMQ 队列模型和 Kafka 的分区(Partition)模型类似。

拉取式消费(Pull Consumer)与 推动式消费(Push Consumer)

  • 拉取式消费通常主动调用 Consumer 的拉消息方法从 Broker 服务器拉消息、主动权由应用控制。一旦获取了批量消息,应用就会启动消费过程。
  • 而推动式消费不需要主动调用 Consumer 的拉消息方法,在底层已经封装了拉取的调用逻辑,在用户层面看来是 Broker 把消息推送过来的,底层还是 consumer 去 broker 主动拉取消息。

集群消费(Clustering)与 广播消费(Broadcasting)

  • 集群消费模式下,相同 Consumer Group 的每个 Consumer 实例平均分摊消息。
  • 广播消费模式下,相同 Consumer Group 的每个 Consumer 实例都接收全量的消息。

回溯消费

回溯消费是指 Consumer 已经消费成功的消息,由于业务上需求需要重新消费,要支持此功能,Broker 在向 Consumer 投递成功消息后,消息仍然需要保留。并且重新消费一般是按照时间维度,例如由于 Consumer 系统故障,恢复后需要重新消费 1 小时前的数据,那么 Broker 要提供一种机制,可以按照时间维度来回退消费进度。

消息(Message)与 标签(Tag)

最基本的信息数据,MQ 所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。每个消息拥有唯一的 Message ID,且携带具有业务标识的 Key。系统提供了通过 Message ID 和 Key 查询消息的功能。消息具备不可变性,在初始化发送和完成存储后即不可变。

而 Tag 简单说就是用来过滤筛选指定的消息的。用于同一主题下区分不同类型的消息。可以根据不同业务目的在同一主题下设置不同标签,然后消费者根据 Tag 实现对不同主题的不同消费逻辑。

消息顺序指的是一类消息消费时,能按照发送的顺序来消费,分为全局顺序消息与分区顺序消息,全局顺序是指某个Topic下的所有消息都要保证顺序,部分顺序消息只要保证每一组消息被顺序消费即可。

  • 普通顺序消费(Normal Ordered Message),消费者通过同一个消息队列收到的消息是有顺序的,不同消息队列收到的消息则可能是无顺序的。比如:创建订单同时让发送其他消息去发短信。
  • 严格顺序消息(Strictly Ordered Message),消费者收到的所有消息均是有顺序的。例如:一个订单产生了三条消息分别是订单创建、订单付款、订单完成。消费时要按照这个顺序消费才能有意义,同时订单之间是可以并行消费的

消息事务 与 定时消息

消息事务就是分布式事务,指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。

定时消息(延迟队列)是指消息发送到 broker 后,不会立即被消费,等待特定时间投递给真正的topic。比如内容管理系统可以在某个时间段发布文章。

消息重试、消息重投

消息重试是指 Consumer 在消费失败后,Rocket MQ 提供的一种重试机制来令消息再消费一次。

消息重投就是 Producer 在发送消息时,同步消息失败会重投,异步消息有重试,oneway 没有任何保证。消息重投保证消息尽可能发送成功、不丢失,但可能会造成消息重复,消息重复在RocketMQ中是无法避免的问题。

流量控制 与 死信队列

生产者流控,因为 broker 处理能力达到瓶颈;消费者流控,因为消费能力达到瓶颈。

死信队列(Dead-Letter Queue)用于处理无法被正常消费的消息。当一条消息初次消费失败,消息队列会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。

演示

依赖与配置

添加依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
 	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

配置文件

spring:
  application:
    name: mq-server

logging:
  file:
    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径

# rocketmq 配置项,对应 RocketMQProperties 配置类
rocketmq:
  name-server: 127.0.0.1:9876 # RocketMQ Namesrv 地址。如果多个,使用逗号分隔。
  # RocketMQAutoConfiguration 自动化配置类,RocketMQ 的自动配置,创建相应的 Producer 和 Consumer
  producer: # RocketMQ Producer
    group: ${spring.application.name}_PRODUCER # 生产者分组
    send-message-timeout: 3000 # 发送消息超时时间,单位:毫秒。默认为 3000 。
    compress-message-body-threshold: 4096 # 消息压缩阀值,当消息体的大小超过该阀值后,进行消息压缩。默认为 4 * 1024B
    max-message-size: 4194304 # 消息体的最大允许大小。。默认为 4 * 1024 * 1024B
    retry-times-when-send-failed: 2 # 同步发送消息时,失败重试次数。默认为 2 次。
    retry-times-when-send-async-failed: 2 # 异步发送消息时,失败重试次数。默认为 2 次。
    retry-next-server: false # 发送消息给 Broker 时,如果发送失败,是否重试另外一台 Broker 。默认为 false
    access-key: # Access Key ,可阅读 https://github.com/apache/rocketmq/blob/master/docs/cn/acl/user_guide.md 文档
    secret-key: # Secret Key
    enable-msg-trace: true # 是否开启消息轨迹功能。默认为 true 开启。可阅读 https://github.com/apache/rocketmq/blob/master/docs/cn/msg_trace/user_guide.md 文档
    customized-trace-topic: RMQ_SYS_TRACE_TOPIC # 自定义消息轨迹的 Topic 。默认为 RMQ_SYS_TRACE_TOPIC 。
  # Consumer 配置项
  consumer: 
    listeners: # 配置某个消费分组,是否监听指定 Topic 。结构为 Map<消费者分组, <Topic, Boolean>> 。默认情况下,不配置表示监听。
      test-consumer-group:
        topic1: false # 关闭 test-consumer-group 对 topic1 的监听消费

项目工程

大多数情况下,生产者和消费者其实不在相同工程里面。演示就无所谓了

启动类

@SpringBootApplication
public class MQApplication {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

基本消息实体

@Data
@Accessors(chain = true) // 这里可以直接链式调用
public class TestMessage {
    public static final String TOPIC = "test1";
    private Integer id;
}

Producer

@Slf4j
@Component
public class Producer {

    @Resource
    private RocketMQTemplate rocketMQTemplate;

	public SendResult syncSend(Integer id) {
        TestMessage message = new TestMessage().setId(id);
        // 同步发送消息
        return rocketMQTemplate.syncSend(TestMessage.TOPIC, message);
    }
    public void asyncSend(Integer id, SendCallback callback) {
        TestMessage message = new TestMessage().setId(id);
        // 异步发送消息
        rocketMQTemplate.asyncSend(TestMessage.TOPIC, message, callback);
    }
    public void onewaySend(Integer id) {
        TestMessage message = new TestMessage().setId(id);
        // oneway 发送消息
        rocketMQTemplate.sendOneWay(TestMessage.TOPIC, message);
    }
	
}

RocketMQTemplate 提供了多种发送方式与方法,有需要可以研究下具体实现类。这里就不多做赘述

Consumer

@Component
@Slf4j
// 这里 声明 tocpi 是 test1, 而 消费者分组是 test-consumer-group-test1
// 一般情况下建议一个消费者分组仅消费一个 Topic 。好处是每个消费者分组职责单一,只消费一个 Topic。
// 而每个消费者分组是独占一个线程池,这样能够保证多个 Topic 隔离在不同线程池,保证隔离性,
// 从而避免一个 Topic 消费很慢,影响到另外的 Topic 的消费。
@RocketMQMessageListener(consumerGroup = "test-consumer-group" + TestMessage.TOPIC, 
							topic = TestMessage.TOPIC) 
public class Consumer implements RocketMQListener<TestMessage>{ // 泛型的好处就是不用去转
	@Override
    public void onMessage(TestMessage message) {
        log.info("收到消息: " + message);
    }
}

Consumer2

@Component
// 这里分组跟上面不一样,用于测试集群消费,同一个 Topic 下不同分组的消费
@RocketMQMessageListener(
        topic = TestMessage.TOPIC,
        consumerGroup = "test2-consumer-group-" + TestMessage.TOPIC
)
// RocketMQ 内置的 MessageExt 类。通过 MessageExt 可以获取到消息的更多信息,例如所属队列、创建时间等,不过消息的内容 body 就需要自己去反序列化。一般情况下不会使用 MessageExt 类。
public class Demo01AConsumer implements RocketMQListener<MessageExt> {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void onMessage(MessageExt message) {
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
    }
}

注意,集群消费上面已经说了,相同 Consumer Group 的每个 Consumer 实例平均分摊消息。也就是说,发送一条 Topic 为 “test1” 的消息,可以分别被 “test-consumer-group-test1” 和 “test2-consumer-group-test1” 都消费一次。

但是,如果启动两个该演示项目的实例,则消费者分组 “test-consumer-group-test1” 和 “test2-consumer-group-test1” 里面就有多个 Consumer 了。此时,再发送一条 Topic 为 “test1” 的消息,只会被 “test-consumer-group-test1” 和 “test2-consumer-group-test1” 的一个 Consumer 消费一次,那另外一个就消费不到了。

通过集群消费的机制,可以实现针对相同 Topic ,不同消费者分组实现各自的业务逻辑。例如说:用户注册成功时,发送一条 Topic 为 “USER_REGISTER” 的消息。然后,不同模块使用不同的消费者分组,订阅该 Topic ,实现各自的拓展逻辑:

  • 积分模块:判断如果是手机注册,给用户增加 20 积分。
  • 优惠劵模块:因为是新用户,所以发放新用户专享优惠劵。

这样,我们就可以将注册成功后的业务拓展逻辑,实现业务上的解耦,未来也更加容易拓展。同时,也提高了注册接口的性能,避免用户需要等待业务拓展逻辑执行完成后,才响应注册成功。

主要类说明

RocketMQTemplate

RocketMQTemplate 继承 Spring Messaging 定义的 AbstractMessageSendingTemplate 抽象类,以达到融入 Spring Messaging 体系中。

在 RocketMQTemplate 中,会创建一个 DefaultMQProducer 生产者 producer ,RocketMQTemplate 后续都使用它的各种发送消息的方法。当然,因为 RocketMQTemplate 的封装,所以我们可以像使用 Spring Messaging(如 redistemplate 等) 一样的方式,进行消息的发送,而无需直接使用 RocketMQ 提供的 Producer 发送消息。

而通过 RocketMQUtil 的 convertToRocketMessage() 将消息 Message 序列化,方法如下:

// RocketMQTemplate.java

public SendResult syncSend(String destination, Object payload, long timeout) {
	// RocketMQTemplate 通过 Spring Messaging 的 MessageBuilder 将我们传入的消息 payload 转换成 Spring Messaging 的 Message 消息对象。
    Message<?> message = MessageBuilder.withPayload(payload).build();
}

//  RocketMQUti.java
public static org.apache.rocketmq.common.message.Message convertToRocketMessage(
    MessageConverter messageConverter, String charset,
    String destination, org.springframework.messaging.Message<?> message) {
    Object payloadObj = message.getPayload();
    byte[] payloads;
    try {
        if (null == payloadObj) {
            throw new RuntimeException("the message cannot be empty");
        }
        // 如果是 String 类型,则直接获得其 byte[] 内容。
        if (payloadObj instanceof String) {
            payloads = ((String)payloadObj).getBytes(Charset.forName(charset));
        // 如果是 byte[] 类型,则直接使用即可
        } else if (payloadObj instanceof byte[]) {
            payloads = (byte[])message.getPayload();
        // 如果是复杂对象类型,则使用 MessageConverter 进行转换成字符串,然后再获得字符串的 byte[] 内容。
        } else {
            String jsonObj = (String)messageConverter.fromMessage(message, payloadObj.getClass());
            if (null == jsonObj) {
                throw new RuntimeException(String.format(
                    "empty after conversion [messageConverter:%s,payloadClass:%s,payloadObj:%s]",
                    messageConverter.getClass(), payloadObj.getClass(), payloadObj));
            }
            payloads = jsonObj.getBytes(Charset.forName(charset));
        }
    } catch (Exception e) {
        throw new RuntimeException("convert to RocketMQ message failed.", e);
    }
    // 转换成 RocketMQ Message
    return getAndWrapMessage(destination, message.getHeaders(), payloads);
}

因为我们一般消息都是复杂对象类型,所以会采用 MessageConverter 类进行转换。默认使用 MappingJackson2MessageConverter 或 MappingFastJsonMessageConverter ,即使用 JSON 格式序列化和反序列化 Message 消息内容。为什么是这两个 MessageConverter ,可以看看 RocketMQ-Spring 的 MessageConverterConfiguration 配置类。

@RocketMQMessageListener

通过 @RocketMQMessageListener 注解,设置每个消费者 Consumer 的消息监听器的配置。

/**
 * Consumer 所属消费者分组
 */
String consumerGroup();

/**
 * 消费的 Topic
 */
String topic();

/**
 * 选择器类型。默认基于 Message 的 Tag 选择。
 * @see SelectorType
 */
SelectorType selectorType() default SelectorType.TAG;
/**
 * 选择器的表达式。
 * 设置为 * 时,表示全部。
 *
 * 如果使用 SelectorType.TAG 类型,则设置消费 Message 的具体 Tag 。
 * 如果使用 SelectorType.SQL92 类型,可见 https://rocketmq.apache.org/rocketmq/filter-messages-by-sql92-in-rocketmq/ 文档
 */
String selectorExpression() default "*";

/**
 * 消费模式。可选择并发消费,还是顺序消费。
 */
ConsumeMode consumeMode() default ConsumeMode.CONCURRENTLY;

/**
 * 消息模型。可选择是集群消费,还是广播消费。
 */
MessageModel messageModel() default MessageModel.CLUSTERING;

/**
 * 消费的线程池的最大线程数
 */
int consumeThreadMax() default 64;

/**
 * 消费单条消息的超时时间 default 30s.
 */
long consumeTimeout() default 30000L;

@ExtRocketMQTemplateConfiguration

开发者可能需要连接多个不同的 RocketMQ 集群,提供了 @ExtRocketMQTemplateConfiguration 注解,实现配置连接不同集群的 Producer 的 RocketMQTemplate Bean 对象。

// 设置连接的 RocketMQ Namesrv 地址
@ExtRocketMQTemplateConfiguration(nameServer = "${test.rocketmq.extNameServer:test.rocketmq.name-server}")
// 继承 RocketMQTemplate 类,从而可以直接使用 @Resource 注解,注入 RocketMQTemplate Bean 属性。
public class ExtRocketMQTemplate extends RocketMQTemplate {
}
基于SpringCloud的商城项目之MQ(下) 在开启确认机制的情况下,当生产者发送消息给MQ后,MQ会根据消息处理的情况返回不同的回执。比较优雅的一种处理方案是RepublishMessageRecoverer,失败后将消息投递到一个指定的,专门存放异常消息的队列,后续由人工集中处理。极端情况就是消费者一直无法执行成功,那么消息requeue就会无限循环,导致mq的消息处理飙升,带来不必要的压力。可以设置最大重试次数。注意:在开启持久化机制以后,如果同时还开启了生产者确认,那么MQ会在消息持久化以后才发送ACK回执,进一步确保消息的可靠性。 阅读详情

相关推荐

SpringCloud使用注解+AOP+MQ来实现日志管理模块

Component}流程:注解标记--->AOP拦截--->日志发送到MQ--->专门处理日志的系统监听MQ消息 --->日志插入到数据库。

m0_73311735的博客 913

用微服务spring cloud架构打造物联网云平台

一、物联网的概览1.1物联网的起源1.2物联网的概念1.3物联网的应用1.4物联网技术要素1.5物联网与云计算的关系1.6物联网与大数据的关系二、软件架构演进史2.1单体架构2.2分布式应用2.3微服务架构2.4Serverless架构三、物联网云平台开发环境搭建3.1开发需要的软件与技术环境概览3.2Java环境-JDK安装3.3数据库-MySQL安装3.4高速缓存技术-redis安装3.5时序数据库-influxdb安装3.6IDE开发工具-idea 安装3.7原型图设计工具-axure安装3.8前端开发工具-vscode安装3.9容器部署-docker安装3.10消息队列-kafka安装3.11mqtt broker安装四、可视化管理工具的安装4.1navicat安装与使用4.2redis 可视化工具安装与使用4.3mqtt可视化工具安装与使用4.4kafka可视化工具安装与使用4.5代码管理工具安装git与使用五、后台开发基础知识介绍5.1数据库使用5.2Redis连接5.3Mqtt接入5.4Influxdb接入5.5Kafka接入5.6负载均衡nginx搭建5.7租户概念5.8Iass,pass,sass之间的联系六、微服务架构介绍6.1微服务核心组件介绍6.2微服务网关gateway6.3注册中心6.4配置中心6.5负载均衡6.6服务调用6.7熔断机制七、物联网平台需求分析7.1物联网云平台的背景7.2物联网云平台脑图设计7.3物联网云平台需求分析7.4物联网云平台开发计划设计八、物联网平台架构设计8.1平台服务拆分8.2物联网平台架构图设计8.3平台技术栈的选择8.4设备认证的设计8.5服务网关的设计8.6后台服务的设计 九、物联网云平台原型设计9.1登录注册页面设计9.2首页设计9.3产品页面设计9.4设备页面设计9.5数据中心页面设计十、数据库设计10.1关系数据库表设计10.1.1用户表10.1.2角色表10.1.3权限表10.1.4用户角色表10.1.5角色权限表10.1.6产品表10.1.7设备表10.1.8操作记录表10.2时序数据库表设计十一、物联网云平台接口文档设计11.1物联网云平台通信方式介绍11.2HTTP接口设计11.2.1.登录接口设计11.2.2注册接口设计11.2.3产品列表设计11.2.4产品添加设计11.2.5产品编辑接口11.2.6产品删除设计11.2.7添加设备接口11.2.8编辑设备接口11.2.9删除设备接口11.2.10添加租户接口11.2.11删除租户接口11.2.12编辑租户接口11.3mqtt主题十二、物联网云平台后台代码开发12.1.认证服务代码开发12.2产品管理代码开发12.3设备管理代码开发12.4数据分析代码开发12.5首页代码开发十三、物联网平台接口测试13.1什么是接口13.2接口测试流程13.3常见后台测试用例13.4使用postman测试接口 十四、物联网云平台前端设计14.1物联网云平台前端技术栈14.2vue环境搭建14.3element基础组件学习14.4vue admin element框架13.5vue与后台接口对接与联调 十五、物联网设备客户端开发15.1flutter介绍15.2flutter环境搭建15.3利用flutter编写第一个Android程序15.4flutter写一个程序接入物联网云平台  十六、部署与实施16.1使用idea发布docker环境16.2微服务程序部署方式介绍16.2.1使用jar包部署微服务程序16.2.2docker 部署微服务程序16.3dockerfile编写16.5负载均衡Nginx搭建与配置微服务程序 十七、物联网实例-设计一款远程电子锁17.1材料准备17.2技术原理17.3产品测试

Spring Cloud Stream 消息驱动,MQ之间交流更灵活

本文目录:写在开头1.微服务面临的问题1. 什么是 Spring Cloud Stream2. 标准MQ 和 Spring Cloud Stream 对比2.1 标准 MQ 结构图2.2 Spring Cloud Stream 结构图3. Spring Cloud Stream如何统一底层差异4. Spring Cloud Stream 执行流程5. 编码API和常用注解6. 上代码6.1 生产者配置Ⅰ.引入 pom 依赖6.1 消费者配置 写在开头   接上一篇文章:Spring Cloud Bus 服

扛麻袋的少年的博客 1031

Spring系列第48篇:通过Spring事务实现MQ中的事务消息

好了,今天的内容就到此就讲完了,我们一块来总结回顾一下,你需要重点掌握的内容。1、消息投递的5种方式的推演,要熟练掌握其优缺点2、方式4中事务消息的代码实现,需要大家掌握消息服务使用频率挺高的,通常作为系统中的基础服务使用,大家可以尝试一下开发一个独立的消息服务,提供给其他服务使用。

GitHub质检员 368

spring cloud整合MQTT简单示例

spring cloud整合MQTT简单示例,分为三个项目eureka-server、service-hi、service-ribbon,MQTT环境需要自己提前搭好,我这搭的环境是apache-apollo-1.7.1

mqcloud:RocketMQ企业级一站式服务平台

MQCloud - 集客户端SDK,运维,监控,预警等功能的企业级一站式服务平台 它具备以下特性: 跨集群:可以同时管理多个集群,对使用者透明。 预警功能:针对生产或消费堆积,失败,异常等情况预警,处理。 简单明了:用户视图-拓扑、流量、消费状况等指标直接展示;管理员视图-集群运维、监控、流程审批等。 安全:用户隔离,操作审批,数据安全。 更多特性正在开发中。 下图简单描述了MQCloud大概的功能: 特性概览 用户topic列表-不同用户看到不同的topic,管理员可以管理所有topic topic详情-分三块 基本信息,今日流程,拓扑 生产详情 消费详情 某个消费者具体的消费详情-可以查询重试消息和死消息 消息 消息消费情况 集群发现 集群管理 集群流量 创建broker 目前运维的规模 服务器:40台+ 集群:5个+ topic:370个+ 生产消费消息量/日:10亿条+ 生产消费消

SpringCloud -- MQ基础

微服务一旦拆分,必然会涉及到服务之间的相互调用。各个微服务之间如果采用的是基于OpenFeign的调用,在这种方式中调用者发起请求后需要等待服务提供者返回结果之后,才能执行后面的业务。在此之前,调用者是一直处于阻塞状态的。我们称这种调用方式为同步调用。但有时也需要采用异步调用的方式。先来看看什么是同步通讯和异步通讯。如图:同步通讯:就如同打视频电话,双方的交互都是实时的。因此同一时刻你只能跟一个人打视频电话。异步通讯:就如同发微信聊天,双方的交互不是实时的,你不需要立刻给对方回应。

2301_76580356的博客 1072

LoFTR训练避坑指南:从零到一复现论文训练流程

本文是一份详细的LoFTR模型训练避坑指南,旨在帮助开发者从零开始复现论文训练流程。文章系统性地讲解了环境配置、数据准备、代码调试与显存优化等关键步骤,并针对常见的训练错误提供了解决方案,确保训练过程顺利进行。

weixin_29091837的博客 204

SpringCloud -- MQ高级

之后用户就会向支付服务发起请求进行支付的行为,如果用户支付成功,理论上支付服务就会通过MQ向交易服务发送一条消息,即“用户已支付”。在电商的支付业务中,对于一些库存有限的商品,为了更好的用户体验,通常都会在用户下单时立刻扣减商品库存。同时,因为交易服务并不知道支付状态,就会一直等待,商品的库存也会处于扣减状态,此时就相当于一直在占用商品,会导致其他用户没办法进行下单。例如,订单支付超时时间为30分钟,则我们应该在用户下单后的第30分钟检查订单支付状态,如果发现未支付,应该立刻取消订单,释放库存。

2301_76580356的博客 908

车辆TBOX科普 第64次 TBOX系统集成测试与文档编写

汽车电子开发中,TBOX作为核心网关面临独特挑战:需处理多网络接口、满足严苛安全标准并确保10年以上可靠性。项目文档是开发流程的核心资产,必须与编码同步更新,构建从需求到测试的完整闭环。系统集成测试需分层进行,结合硬件在环测试和自动化工具,并严格管理缺陷。文档与测试深度协同,通过追溯矩阵确保每个需求都被覆盖验证。最终交付不仅是软件包,更是一套包含完整验证报告的信任体系。这种严谨的工程纪律,是将代码转化为车规级可靠产品的关键保障。

IT深耕十余载,大道之简 1316

概述DeepLab系列(deeplab v1, deeplab v2, deeplab v3, deeplab v3+)

前言:图像分割是指像素级别的图像识别,即标注出图像中每个像素所属的对象类别。 语义分割更注重类别之间的区分,而实例分割更注重个体之间的区别。 DeepLab是由Google团队提出的一系列图像分割算法。 DeepLab v1 (2014年) Paper (ICLR 2015) Code 创新点: 空洞卷积(Atrous Conv); <解决编码过程中信号不断被下采样,细节丢失的问题> 全连接条件随机场(Fully-connected Conditional Random Field)。

ZSH12345678900的博客 5527

【SpringCloud】微服务6—消息队列MQ高级

每个RabbitTemplate只能配置一个ReturnCallback,因此我们可以在配置类中统一设置。log . error("触发return callback,");} });} }log . error("触发return callback,");} });} }Slf4j;import orglog . error("触发return callback,");} });} }

m0_73509988的博客 1070

20个闭环渗透测试项目:从漏洞发现到简历突围

渗透测试不仅是工具使用,更是对系统设计缺陷与实现偏差的深度推演。理解OWASP Top 10、Burp Suite等基础能力只是起点,真正具备工程价值的是能复现、可验证、可协作的完整攻击链。本文聚焦真实业务场景下的SSRF协议绕过、JWT签名机制缺陷、Redis未授权利用、Kong网关配置风险及etcd存储结构分析等核心热词,揭示漏洞本质在于架构决策与配置偏差的叠加态。适用于红队实战、甲方安全建设与乙方渗透审计等多类岗位,帮助从业者将技术动作升维为技术叙事。

weixin_32234493的博客 413

【SpringCloud】什么是MQ

异

m0_65462447的博客 1061

数据安全实战技能解析:从加密攻防到数字水印的竞赛指南

数据安全是信息安全领域的核心,其基础在于密码学与信息隐藏技术。密码学通过加密算法(如AES、RSA)和哈希函数,保障数据的机密性与完整性,其原理涉及对称/非对称加密、工作模式及密钥管理。数字水印技术则基于信号处理(如DCT/DWT变换),将信息嵌入多媒体载体,用于版权保护与溯源。这些技术的价值在于为数据全生命周期提供“防泄漏”与“可追溯”的解决方案,广泛应用于企业数据治理、合规审计和**数据防泄漏(DLP)** 系统。本文以一场贴近实战的**数据安全职业技能竞赛**为切入点,深入剖析如何运用密码分析、磁盘取

weixin_34314962的博客 402

短信验证码逻辑漏洞学习——各种绕过姿势技巧

短信验证码逻辑漏洞学习——各种绕过姿势技巧

记录并分享学习安全的知识点.. 2555

【Springcloud微服务】MQ基础

介绍了MQ的基本概念,然后介绍了RabbitMQ的相关概念及其在Java项目中如何使用,并使用它改进了微服务项目中的部分业务。

一以贯之的努力 不得懈怠的人生 741

如何为 Claude Code 配置代理与网络环境

那么大概率不是软件问题,而是。因为 Claude Code 是运行在终端里的,不是浏览器。

sg_knight的专栏 3478

SpringCloud - 整合MQ实现消息总线服务

SpringCloud - 整合MQ实现消息总线服务

weixin_46619605的博客 1200

紫光展锐面试——FPGA/IC设计面试面经案例总结

自我介绍;研究生的主要研究方向是什么?为什么想要应聘数字芯片相关的工作?简单介绍下数字IC设计流程。逻辑综合主要做什么?你有实际做过逻辑综合工作吗?你了解SS corner和FF corner吗?综合时应该使用哪个corner?综合时需要考虑hold吗?为什么?提高时钟频率对setup和hold有什么影响?为什么?hvt、rvt/svt、lvt有什么区别?c40、c50是指什么概念?有什么区别?你对EDA工具有过了解吗?

FPGA/MATLAB学习教程/源码/项目合作开发 1561

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

基于SpringCloud的商城项目之MQ(上)

SpringAMQP。

Shine19的博客 1088

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SpringCloud-MQ消息队列

本文介绍了Spring Cloud中常见的消息队列,重点探讨了RabbitMQ、Apache Kafka和ActiveMQ等消息中间件在分布式系统中的应用。通过解释消息队列的优势,如异步通信、解耦服务、可靠性和分布式事务,读者能够深入了解消息队列在微服务架构中的关键作用。进一步探讨了Spring Cloud对不同消息队列系统的支持,并提供了简单的使用示例。这篇文章旨在帮助开发者更好地理解消息队列的概念和应用,为构建弹性、可维护的分布式系统提供指导。

踏雨歌青春,诗酒趁年华 3399

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SpringCloud-stream一体化MQ解决方案-消费分区

参考demo参考视频1 参考视频2官方文档(推荐)官方文档中文版关于Kafka和rabbitMQ的安装教程,见本人之前的博客rocketMq的安装教程rocketMq仪表盘安装教程 重!!! 个人整理SpringCloud-Stream各部分概念、配置方法、配置项大全 Stream基本配置(Kafka、RabbitMQ和RocketMQ)Stream消费者组(解决Kafka消费者组只有一个消费者的问题)​​​ ​​​Learn标签选择对应版本说明文档​​ overview​​Main Concepts(Co

qq_23095607的博客 1494

SpringCloud(九)【MQ服务异步通信】

发布订阅模式与之前案例的区别就是允许将同一消息发送给多个消费者。TopicExchange与DirectExchange类似,区别在于routingKey必须是多个单词的列表,并且以。实际结果:消费者1和消费者2的消息处理数量一样多,且消费者2没有在一秒内处理完成。预期:消费者1在一秒内处理完多的消息,消费者2在一秒内处理的消息不如消费者2多。Work queue,工作队列,可以提高消息处理速度,避免队列消息堆积。注意:exchange负责消息路由,而不是存储,路由失败则消息丢失。原因:存在消息预取机制。

qq_45822726的博客 974

SrpingCloud 十、SpringCloud Stream 消息驱动(Mq的封装)

1、什么是Bus消息总线? 1、在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例,它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线。 SpringCloud中也有对应的解决方案,SpringCloud Bus 将分布式的节点用轻量的消息代理连接起来,可以很容易搭建消息总线,配合SpringCloud config 实现微服务应用配置信息的动态...

ws - 兮的博客空间 932

手把手教你搭建高可靠性 MQ(消息队列):基于 Spring Cloud 的实现方案

Spring Cloud是一个基于Spring Framework的开源框架,用于构建基于微服务架构的应用程序。它为开发人员提供了一套工具和技术,可以轻松地实现和管理各种微服务模式。Spring Cloud提供了各种解决方案,包括服务发现、配置管理、负载均衡、断路器、API网关等,使得开发人员能够轻松地创建和管理微服务。MQ(消息队列)是一种重要的异步通信机制,用于在不同的应用程序之间进行通信。它允许应用程序之间的异步通信,可以提高应用程序的可伸缩性和可靠性。

陈书予 3万+
上一篇: SpringCloud Alibaba Seata 分布式事务
下一篇: SpringCloud Sentinel
RedRay0
博客等级 码龄2年 120粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值