9.Spring Cloud Ailibaba RocketMQ(分布式消息系统)

目录


为什么使用微服务?微服务解决了什么问题?

分布式系统组成要素及其运行机制

微服务场景模拟

1. Spring Cloud Alibaba基本介绍

2. Spring Cloud Alibaba Nacos(服务注册与发现)

3. Spring Cloud Alibaba Nacos Config(分布式配置)

4.Spring Cloud Ailibaba Sentinel(限流)

5. Spring Cloud Ailibaba Sentinel支持OpenFeign、RestTemplate(远程调用)及动态数据源

6. Spring Cloud Ailibaba Geteway与Zuul(服务网关)

7. Spring Cloud Ailibaba Seata(分布式事务)

8. Spring Cloud微服务项目集成Seata

9. Spring Cloud Ailibaba RocketMQ(分布式消息系统)


Spring Cloud Ailibaba RocketMQ(分布式消息系统)

  • 目录
  • Spring Cloud Ailibaba RocketMQ(分布式消息系统)
    • Spring Cloud Stream介绍
      • (1)Binder
      • (2)Binding
    • RocketMQ介绍
    • 简单消息发送、接收
    • 如何使用Spring Cloud Alibaba RocketMQ Binder
    • Spring Cloud Alibaba RocketMQ Binder实现
    • MessageSource支持
      • SCS(顺序控制系统)
    • 配置选项
      • (1)RocketMQ Binder
      • (2)RocketMQ Consumer(消费者)
      • (3)RocketMQ Provider(生产者)


Spring Cloud Ailibaba RocketMQ(分布式消息系统)

Spring Cloud Stream介绍

Spring Cloud Stream是一个用于构建基于消息的微服务应用框架。它基于Spring Boot来创建具有生产级别的单机Spring应用,并且使用Spring Integration与Broker进行连接。

Spring Cloud Stream提供了消息中间件配置的统一抽象,推出了publish-subscribe、consumer groups、partition这些统一的概念。

Spring Cloud Stream内部有两个概念:Binder和Binding

(1)Binder

跟外部消息中间件集成的组件,用来创建Binding,各消息中间件都有自己的Binder实现

比如:
Kafka的实现KafkaMessageChannelBinder,RabbitMQ的实现RabbitMessageChannelBinder,RocketMQ的实现RocketMQMessageChannelBinder。

(2)Binding

包括Input Binding和Output Binding

Binding在消息中间件与应用程序提供的Provider和Consumer之间提供了一个桥梁,实现了开发者只需使用应用程序的Provider或Consumer生产或消费数据即可,屏蔽了开发者与底层消息中间件的接触。


RocketMQ介绍

RocketMQ是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。
官网:http://rocketmq.apache.org/

特点:
(1)能够保证严格的消息顺序
(2)提供丰富的消息拉取模式
(3)高效的订阅者水平扩展能力
(4)实时的消息订阅机制
(5)亿级消息堆积能力


简单消息发送、接收

使用Spring Cloud Stream完成一段简单的消息发送和消息接收代码:
Spring Cloud Stream底层基于这段代码去做了各种抽象。下面代码所有的消息类都是spring-messaging模块里提供的。屏蔽具体消息中间件的底层实现,如果想用更换消息中间件,在配置文件里配置相关消息中间件信息以及修改binder依赖即可。

MessageChannel messageChannel = new DirectChannel();

// 消息订阅
((SubscribableChannel) messageChannel).subscribe(new MessageHandler() {
    @Override
    public void handleMessage(Message message) throws MessagingException {
        System.out.println("receive msg: " + message.getPayload());
    }
});

// 消息发送
messageChannel.send(MessageBuilder.withPayload("simple msg").build());

如何使用Spring Cloud Alibaba RocketMQ Binder

如果要在项目中引入RocketMQ Binder,需要引入如下maven依赖:


    com.alibaba.cloud
    spring-cloud-stream-binder-rocketmq

或者可以使用 Spring Cloud Stream RocketMQ Starter:


    com.alibaba.cloud
    spring-cloud-starter-stream-rocketmq


Spring Cloud Alibaba RocketMQ Binder实现

Spring Cloud Stream RocketMQ Binder实现架构:
9.Spring Cloud Ailibaba RocketMQ(分布式消息系统)_第1张图片

RocketMQ Binder实现依赖于RocketMQ-Spring框架
RocketMQ-Spring框架是RocketMQ与Spring Boot的整合,RocketMQ Spring主要提供了3个特性:
(1)使用RocketMQTemplate用来统一发送消息,包括同步、异步发送消息和事务消息
(2)@RocketMQTransactionListener注解用来处理事务消息的监听和回查
(3)@RocketMQMessageListener注解用来消费消息

RocketMQ Binder的核心类RocketMQMessageChannelBinder实现了Spring Cloud Stream规范,内部构建会RocketMQInboundChannelAdapter和RocketMQMessageHandler。

RocketMQMessageHandler会基于Binding配置构造RocketMQTemplate,RocketMQTemplate内部会把spring-messaging模块内org.springframework.messaging.Message消息类转换成 RocketMQ的消息类org.apache.rocketmq.common.message.Message,然后发送出去。

RocketMQInboundChannelAdapter基于Binding配置构造 RocketMQListenerBindingContainer
,RocketMQListenerBindingContainer内部会启动RocketMQ Consumer接收消息

注意:在使用RocketMQ Binder的同时也可以配置“rocketmq.**”用于触发RocketMQ Spring相关的AutoConfiguration

目前Binder支持在Header中设置相关的key来进行RocketMQ Message消息的特性设置。

比如:TAGS、DELAY、TRANSACTIONAL_ARG、KEYS、WAIT_STORE_MSG_OK、FLAG。表示RocketMQ消息对应的标签。

MessageBuilder builder = MessageBuilder.withPayload(msg)
        .setHeader(RocketMQHeaders.TAGS, "binder")
        .setHeader(RocketMQHeaders.KEYS, "my-key")
        .setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "1");

Message message = builder.build();
output().send(message);

MessageSource支持

SCS RocketMQ Binder支持MessageSource,可以进行消息的拉取。

SCS(顺序控制系统)

按照规定的顺序依次完成各种操作的控制系统。顺序控制是一种按时间顺序或逻辑顺序进行控制的开环控制方式,其特点是按照预先规定的顺序进行检查、判断、控制的过程。

@SpringBootApplication
@EnableBinding(MQApplication.PolledProcessor.class)
public class MQApplication {
    private final Logger logger =
            LoggerFactory.getLogger(MQApplication.class);

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

    @Bean
    public ApplicationRunner runner(PollableMessageSource source,
                                    MessageChannel dest) {
        return args -> {
            while (true) {
                boolean result = source.poll(m -> {
                    String payload = (String) m.getPayload();
                    logger.info("Received: " + payload);
                    dest.send(MessageBuilder.withPayload(payload.toUpperCase())
                            .copyHeaders(m.getHeaders())
                            .build());
                }, new ParameterizedTypeReference() { });
                if (result) {
                    logger.info("Processed a message");
                }
                else {
                    logger.info("Nothing to do");
                }
                Thread.sleep(5_000);
            }
        };
    }

    public static interface PolledProcessor {
        @Input
        PollableMessageSource source();
        @Output
        MessageChannel dest();
    }

}

配置选项

(1)RocketMQ Binder

前缀:spring.cloud.stream.rocketmq.binder

配置项 默认值 描述
name-server 127.0.0.1:9876 RocketMQ NameServer地址(老版本使用namesrv-addr配置项)
access-key null 阿里云账号AccessKey
secret-key null 阿里云账号SecretKey
enable-msg-trace true 是否为Producer和Consumer开启消息轨迹功能
customized-trace-topic RMQ_SYS_TRACE_TOPIC 消息轨迹开启后存储的topic名称

(2)RocketMQ Consumer(消费者)

下面配置以“spring.cloud.stream.rocketmq.bindings..consumer.”为前缀的RocketMQ Consumer相关的配置。

配置项 默认值 描述
enable true 是否启用Consumer
tags empty Consumer基于TAGS订阅,多个tag以||分割
sql empty Consumer基于SQL订阅
broadcasting false Consumer是否是广播消费模式。如果想让所有的订阅者都能接收到消息,可以使用广播模式
orderly false Consumer是否同步消费消息模式
delayLevelWhenNextConsume 0 异步消费消息模式下消费失败重试策略:
①-1:不重复,直接放入死信队列
②0:broker控制重试策略
③>0:client控制重试策略
suspendCurrentQueueTimeMillis 1000 同步消费消息模式下消费失败后再次消费的时间间隔

(3)RocketMQ Provider(生产者)

下面配置以“spring.cloud.stream.rocketmq.bindings..producer.”为前缀的RocketMQ Producer相关的配置。

配置项 默认值 描述
enable true 是否启用Producer
group empty Producer分组名称
maxMessageSize 8249344 消息发送的最大字节数
transactional false 是否发送事务消息
sync false 是否使用同步得方式发送消息
vipChannelEnabled true 是否在Vip Channel上发送消息
sendMessageTimeout 3000 发送消息的超时时间(毫秒)
compressMessageBodyThreshold 4096 消息体压缩阀值(当消息体超过4k的时候会被压缩)
retryTimesWhenSendFailed 2 在同步发送消息的模式下,消息发送失败的重试次数
retryTimesWhenSendAsyncFailed 2 在异步发送消息的模式下,消息发送失败的重试次数
retryNextServer false 消息发送失败的情况下是否重试其它的broker

你可能感兴趣的:(Spring,Cloud,Alibaba,java-rocketmq,spring,cloud,rocketmq)