JavaEE 企业级分布式高级架构师(二十)微服务框架 SpringCloudAlibaba (2.2 版)(7)

消息系统整合Spring Cloud Stream

简介

在这里插入图片描述

  • Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。通过使用 Spring Cloud Stream,可以有效简化开发人员对消息中间件的使用复杂度,让系统开发人员可以有更多的精力关注于核心业务逻辑的处理。
  • 程序模型:应用程序的核心部分(Application Core)通过 inputs 与 outputs 管道,与中间件连接,而管道是通过绑定器 Binder 与中间件相绑定的。

在这里插入图片描述

Stream RocketMQ 微服务

生产者应用

  • 创建工程:任意复制前面的一个提供者工程,重命名为 09-stream-rocketmq-producer-8081,将其中的除启动类之外的其它代码全部删除。
  • 添加依赖:仅需再添加一个 Spring Cloud Stream Kafka 相关的依赖即可。
<!-- stream-rocketmq 依赖 -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
  • 修改配置文件:
server:
  port: 8081
spring:
  application:
    name: msc-stream-producer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.100:8848
    stream:
      rocketmq:
        binder:
          # 指定rocketMQ的name server地址
          name-server: 192.168.254.130:9876
          # 指定是否自动创建主题
          auto-create-topics: true
      bindings:
        # 指定要绑定的管道的名称
        output:
          # 指定要生产的消息的主题及类型
          destination: persons
          content-type: text/plain
  • 创建生产者类:
@Component
// Source类为绑定器
@EnableBinding(Source.class)
public class MsgProducer {
    /**
     * 必须使用byType注入,因为系统中同时定义了名称为 nullChannel 与 errorChannel 的两个同类型管道
     */
    @Autowired
    @Qualifier(Source.OUTPUT)
    private MessageChannel channel;

    public String sendMsg(String msg) {
        // 创建MessageHeaders
        Map<String, Object> headers = new HashMap<>(1);
        headers.put(MessageConst.PROPERTY_TAGS, "stream-rmq");
        MessageHeaders msgHeaders = new MessageHeaders(headers);
        // 消息由 消息体 与 消息头 两部分构成
        Message<String> message = MessageBuilder.createMessage(msg, msgHeaders);
        // 通过管道将消息发送给MQ
        channel.send(message);
        return msg;
    }
}
  • 创建控制器:
@RestController
public class MessageController {
    @Autowired
    private MsgProducer producer;

    @GetMapping("/msg/send")
    public String send(@RequestParam String msg) {
        return producer.sendMsg(msg);
    }
}

消费者应用

  • 创建工程:复制 09-stream-rocketmq-producer-8081 工程,重命名为 09-stream-rocketmq-consumer-8080,在其基础上进行修改,删除其生产者类与控制器类。
  • 修改配置文件:

在这里插入图片描述

  • 创建消费者类:
@Component
// Sink 类是绑定器
@EnableBinding(Sink.class)
public class MsgConsumer {
    /**
     * 为指定名称的管道添加监听器,只要管道中的数据发生变化,就会触发该方法执行
     */
    @StreamListener(Sink.INPUT)
    public void receiveMsg(Object message) {
        System.out.println(message);
    }
}

测试

  • 启动 09-stream-rocketmq-producer-8081 工程,调用接口发送消息 http://localhost:8081/msg/send?msg=abc,通过rocketmq-console查看消息是否发送成功:

在这里插入图片描述

  • 查看消费者工程控制台输出:

在这里插入图片描述

生产者将消息发送给多个主题

  • 在 09-stream-rocketmq-producer-8081 工程中进行修改
  • 自定义管道:
public interface CustomSource {
    String CHANNEL_NAME = "custom";

    @Output(CustomSource.CHANNEL_NAME)
    MessageChannel output();
}
  • 修改 MsgProducer:

在这里插入图片描述

  • 修改 MessageController:

在这里插入图片描述

  • 修改配置文件:

在这里插入图片描述

  • 测试访问地址:http://localhost:8081/msg/sendMulti?msg=123456,然后到 rocketmq-console 查看消息

在这里插入图片描述

另外两种消费者定义方式

  • 方式一:
@Component
@EnableBinding(Sink.class)
public class MsgConsumer {
    /**
     * 当指定管道中的数据流发生变化,就会激活当前消费服务
     */
    @ServiceActivator(inputChannel = Sink.INPUT)
    public void receiveMsg2(Object message) {
        log.info("==>> ServiceActivator receive message: {}", message);
    }
}
  • 方式二:
@Component
@EnableBinding(Sink.class)
public class MsgConsumer {
    @Autowired
    @Qualifier(Sink.INPUT)
    private SubscribableChannel channel;

    @PostConstruct
    public void init() {
        channel.subscribe(message -> {
            byte[] payload = (byte[]) message.getPayload();

            System.out.println(new String(payload) + ", " + message.getHeaders());
        });
    }
}

Dubbo Spring Cloud

概述

  • Spring Cloud 默认情况下微服务间的通信采用的是 HTTP REST,其通信效率较 RPC 通信是比较低的。而 Dubbo 是一个 RPC 通信架构,不过其仅提供了服务发现与治理两大功能,即其生态不如 Spring Cloud 完整。
  • Dubbo Spring Cloud 则是将两者完美结合一起,各取所长。

示例演示

定义提供者工程

  • 创建工程:复制 02-provider-nacos-8081 工程,重命名为 10-provider-dubbo-8081,在其基础上进行修改。
  • 添加依赖:
<!-- dubbo spring cloud 依赖 -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
  • 修改 DepartServiceImpl:

在这里插入图片描述

  • 修改配置文件:增加如下配置
dubbo:
  scan:
    # 指定Dubbo服务扫描的基本包
    base-packages: com.yw.sca
  # 指定注册中心挂载到当前应用指定的Spring Cloud的注册中心
  registry:
    address: spring-cloud://192.168.0.100
  # 指定服务暴露协议
  protocol:
    name: dubbo
    # 自增端口号,表示从20880开始自增
    port: -1
  • 启动工程:

在这里插入图片描述

  • 查看 nacos 服务详情:

在这里插入图片描述

  • 访问地址 http://localhost:8081/provider/depart/list、http://localhost:8081/provider/depart/get/1

定义消费者工程

  • 创建工程:复制 04-consumer-feign-8080 工程,重命名为 10-consumer-dubbo-8080,在其基础上进行修改。
  • 修改 pom.xml 文件,与 10-provider-dubbo-8081 工程增加一样的依赖,同时将原来的 OpenFeign 依赖删除。
  • 修改 DepartService 接口:
public interface DepartService {
    boolean save(Depart depart);
    boolean deleteById(int id);
    boolean update(Depart depart);
    Depart findById(int id);
    List<Depart> list();
}
  • 修改DepartController:

在这里插入图片描述

  • 删除启动类上的@EnableFeignClients 注解,以及去掉原来的负载均衡配置。
  • 修改配置文件:
spring:
  application:
    name: msc-consumer-depart
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.100:8848
dubbo:
  registry:
    address: spring-cloud://192.168.0.100
  # 指定要订阅的服务
  cloud:
    subscribed-services: msc-provider-depart
  protocol:
    name: dubbo
    port: -1
  • 启动工程,查看 nacos 服务详情:

在这里插入图片描述

  • 访问地址:http://localhost:8080/consumer/depart/get/1、http://localhost:8080/consumer/depart/list

注意点

  • 提供者和消费者的实体类都需要实现序列化,否者会报错:

在这里插入图片描述

总结

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

讲文明的喜羊羊拒绝pua

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

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

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

打赏作者

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

抵扣说明:

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

余额充值