JavaEE 企业级分布式高级架构师(十三)微服务框架 SpringCloud (H 版)(6)

消息系统整合框架Spring Cloud Stream

简介

官网

在这里插入图片描述

  • 原文】A lightweight event-driven microservices framework to quickly build applications that can connect to external systems. Simple declarative(声名式的) model to send and receive messages using Apache Kafka or RabbitMQ between Spring Boot apps.
  • 翻译】一个轻量级的事件驱动微服务框架,用于快速构建可连接到外部系统的应用程序。在 Spring Boot 应用程序之间使用 Kafka 或 RabbitMQ 发送和接收消息的简单声明式模型。

综合

  • Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。通过使用 Spring Cloud Stream,可以有效简化开发人员对消息中间件的使用复杂度,让系统开发人员可以有更多的精力关注于核心业务逻辑的处理。但是目前 Spring Cloud Stream 只支持 RabbitMQ 和 Kafka 的自动化配置。
  • 官方文档:https://docs.spring.io/spring-cloud-stream/docs/3.1.3/reference/html/

程序模型

在这里插入图片描述

  • 应用程序的核心部分(Application Core)通过 inputs 与 outputs 管道,与中间件连接,而管道是通过绑定器 Binder 与中间件相绑定的。

stream kafka微服务

创建生产者工程 08-provider-stream-kafka

  • 新建一个 spring boot 工程,命名为 08-provider-stream-kafka,添加一个 Spring Cloud Stream Kafka 依赖:
<!-- stream-binder-kafka依赖 -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-stream-binder-kafka</artifactId>
</dependency>
<!--    &lt;!&ndash; 或者使用这个 &ndash;&gt;-->
<!--    <dependency>-->
<!--      <groupId>org.springframework.cloud</groupId>-->
<!--      <artifactId>spring-cloud-starter-stream-kafka</artifactId>-->
<!--    </dependency>-->
消息发送给一个主题
  • 创建消息生产者类:
// Spring Cloud 中的 Source 类,将MQ与生产者类通过消息管道想绑定
@EnableBinding(Source.class)
@Component
public class SomeProducer {
    // 必须使用byName方式注入消息管道,系统中还定义了名称为 nullChannel、errorChannel 的两个同类型的管道
    @Autowired
    @Qualifier(Source.OUTPUT)
    private MessageChannel channel;

    public void sendMsg(String message) {
        // 通过消息管道发送消息,即消息写入到消息管道,再通过管道写入到 MQ
        channel.send(MessageBuilder.withPayload(message).build());
    }
}
  • 创建处理器类:
@RestController
public class SomeController {
    @Autowired
    private SomeProducer producer;
    
    @PostMapping("/msg/send")
    public String sendMsg(@RequestParam("message") String message) {
        producer.sendMsg(message);
        return "send success";
    }
}
  • 创建配置文件application.yml:
server:
  port: 8090

spring:
  application:
    name: msc-provider-stream-kafka
  cloud:
    stream:
      kafka:
        binder:
          brokers: 192.168.254.128:9092,192.168.254.130:9092,192.168.254.132:9092
          # 指定是否自动创建主题
          auto-create-topics: true
      bindings:
        output: # 指定要输出的消息主题及类型
          destination: persons
          content-type: text/plain
消息发送给多个主题
  • 自定义 Source 接口:
public interface CustomSource {
    String CHANNEL_NAME = "xxx";
    @Output(CustomSource.CHANNEL_NAME)
    MessageChannel output();
}
  • 修改消息发送者类:

在这里插入图片描述

  • 修改配置文件:

在这里插入图片描述

测试
  • 启动项目进行测试,通过 postman 调用接口发送消息,并用命令行启动一个kafka消费者客户端监听消息,命令如下
[root@centos-host kafka]# bin/kafka-console-consumer.sh --bootstrap-server 192.168.254.128:9092 --topic persons --from-beginning
[root@centos-host kafka]# bin/kafka-console-consumer.sh --bootstrap-server 192.168.254.130:9092 --topic countries --from-beginning

在这里插入图片描述

  • 消息查看:两个主题都能接收到消息

在这里插入图片描述

创建消费者工程 08-consumer-stream-kafka

  • 复制 08-provider-stream-kafka 工程,重命名为 08-consumer-stream-kafka,在此基础上修改。
  • Spring Cloud Stream 提供了三种创建消费者的方式,这三种方式的都是在消费者类的“消费”方法上添加注解。只要有新的消息写入到了管道,该“消费”方法就会执行。只不过三种注解,其底层的实现方式不同。即当新消息到来后,触发“消费”方法去执行的实现方式不同。
    • @PostConstruct:以发布/订阅方式实现
    • @ServiceActivator:新的消息激活服务方式实现
    • @StreamListener:以监听方式实现
@PostConstruct方式
  • 创建消费者类:
@Component
@EnableBinding(Sink.class)
public class PostConstructConsumer {
    @Autowired
    @Qualifier(Sink.INPUT)
    private SubscribableChannel channel;

    @PostConstruct
    public void receiveMsg() {
        channel.subscribe(new MessageHandler() {
            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                System.out.println("@PostConstruct --- " + message.getHeaders() + ", ");
                byte[] payload = (byte[]) message.getPayload();
                System.out.println(new String(payload));
            }
        });
    }
}
  • 定义配置文件:
server:
  port: 8080

spring:
  application:
    name: msc-stream-kafka
  cloud:
    stream:
      kafka:
        binder:
          brokers: 192.168.254.128:9092,192.168.254.130:9092,192.168.254.132:9092
          # 指定是否自动创建主题
          auto-create-topics: true
      bindings:
        input:
          destination: persons
  • 启动工程,提供者工程调用接口发送消息,消费者可以正确接收消息:

在这里插入图片描述

@ServiceActivator方式
  • 该注解所标注的方法是以服务的形式出现的,只要管道中的数据发生了变化就会激活该服务。
  • 注释掉前面定义的消费者,然后重新创建消费者类:
@Component
@EnableBinding(Sink.class)
public class ServiceActivatorConsumer {
    @ServiceActivator(inputChannel = Sink.INPUT)
    public void receiveMsg(Object message) {
        System.out.println("@ServiceActivator --- " + message);
    }
}
  • 重启工程,提供者工程调用接口发送消息,消费者可以正确接收消息:

在这里插入图片描述

@StreamListener方式
  • 该方式是以监听的方式实现,只要管道中的流数据发生变化,其就会触发该注解所标注的方法的执行。
  • 注释掉前面定义的消费者,然后重新创建消费者类:
@Component
@EnableBinding(Sink.class)
public class StreamListenerConsumer {
    @StreamListener(Sink.INPUT)
    public void printMsg(Object message){
        System.out.println(message);
    }
}
  • 重启工程,提供者工程调用接口发送消息,消费者可以正确接收消息:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讲文明的喜羊羊拒绝pua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值