Bootstrap

【微服务学习】spring-cloud-starter-stream 4.x 版本的使用(rocketmq 版)

@[TOC](【微服务学习】spring-cloud-starter-stream 4.x 版本的使用(rocketmq 版))

1. 区别

3.x 版本

3.x 版本的使用, 都是基本上都是通过注解 
@EnableBinding 
@Input 
@Output 
@StreamListener 
等注解来实现对不同信道的绑定.
具体使用可参考: https://www.cnblogs.com/xfeiyun/p/16229303.html

3.0.13 版本

4.x 版本

4.x 版本删除了这些注解. 
具体的使用采用隐式绑定的方式(虽然文档上说不推荐这种方式,但是我也没找到其他实现方式) 
具体文档参考: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html

No more Annotations
4.0.1在这里插入图片描述

2. 使用

2.1 消息发送者

消息发送, 有两种方式.
方式一: 使用 StreamBridge streamBridge; 往指定信道发送消息.
方式二: 通过隐式绑定信道, 注册 Bean 发送消息
2.1.1 使用 StreamBridge streamBridge; 往指定信道发送消息
	@Resource
    private StreamBridge streamBridge;
    // im-out 为信道名称 与 yml 中的配置绑定 spring.cloud.stream.bindings.im-out
	boolean b = streamBridge.send("im-out", "要发送的消息");
2.1.2 通过隐式绑定信道, 注册 Bean 发送消息
    @Bean
    //注意: 此处的 im 对象是与 spring.cloud.stream.function.bindings.im-out-0 绑定的. 
    //其中 -out-0 是 4.x 的一种约定.
    public Supplier<String> im() {
   
        return () -> "要发送的信息";
    }
绑定关系大致如图:

在这里插入图片描述

2.2 消息接收者

消息接收, 目前我只得到一种可行性方式, 就是隐式绑定, 与消息发送者类似
另一种方式, 使用: @ServiceActivator(outputChannel = "im") 测试发现, 只能实现异步, 并不走 MQ 发送消息.

    @Bean
    public Function<String, String> toUpperCase() {
   
        return String::toUpperCase;
    }

    @Bean
    public Consumer<String> sout() {
   
        return s -> {
   
            //消息处理者
            System.out.println("接收到的消息切转换大写的结果为: " + s);
        };
    }

在这里插入图片描述

  • 注意: 多个方法之间可以使用 “|” 间隔, 但是绑定时 多个需要按顺序写. 其中 -in-0 是一种约定

3. 实践

首先, 说一下, 我的理解, spring 更多的是往响应式异步编程的方式发展. 
spring 文档中 大部分的 demo 都是采用 FLux 和 Mono 这样的响应式异步编程实现的. 
3.1 消息发送者隐式绑定存在的问题
  • Q: 通过 2.1.2 发现, 消息的发送是通过注册 Bean 的方式, 那是不是在服务启动的时候,
    就已经必须编辑好要发送的内容进行发送, 跟现实使用不符.

  • A: 可以通过 Flux 异步将 FluxSink 暴露出去使用. (不知道怎么描述, 直接看例子吧)


3.2 场景
首先, 基础框架是我之前写的一个 IM 及时聊天框架, 所以, 场景就借助这个框架实现. 
主要关注就是如何发送消息, 和如何接收消息.
3.2.1 消息发送者
  • maven 依赖
 
;