Spring Cloud 入门——9.1 stream 消息驱动的分布式

24 篇文章 0 订阅
22 篇文章 3 订阅

代码信息

本篇文章涉及代码版本

组件版本
Spring Boot2.0.8.RELEASE
Spring CloudFinchley.SR1

本篇文章涉及应用

应用说明
base-eureka服务发现
base-stream-client服务消费端
base-stream-producer服务生产端

消息驱动的分布式服务

Spring Cloud中的Spring Cloud Stream提供了一套针对消息中间件的自动化配置实现,并且引入了发布-订阅、消费组以及消息分区的概念。通过使用Spring Cloud Stream,可以有效地简化消息中间件的使用复杂度。目前Spring Cloud Stream 支持RabbitMQ和Kafka的工具

实现消息驱动

注意和配置中心一样此时需要保证你已经在本地或者云服务器上安装RabbitMQ

创建消息的发送者

引入依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream-test-support</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
参数配置
spring:
  application:
    name: base-stream-producer
  # mq的配置
  rabbitmq:
     host: 127.0.0.1
     port: 5672
     username: admin
     password: admin
  cloud:
    stream:
      rabbit:
        # 可以配置多个,作为入门案例,可以不进行配置
        bindings:
          # 监听的消息队列的名称。
          testMessage:
            # 服务的名称
            group: learn
            # 将发送的对象消息转化为json,方便调试
            content-type: application/json
server:
  port: 8704

eureka:
  client:
    service-url: 
      defaultZone: http://localhost:8000/eureka/
logging:
  file: ${spring.application.name}.log

上面有一点需要注意的就是bindings的配置对应的源码可以看到是支持配置多个的

    public void setBindings(Map<String, RabbitBindingProperties> bindings) {
        this.bindings = bindings;
    }
代码
启动类

@SpringBootApplication
@EnableEurekaClient
public class StreamProducerApplication {

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

}
配置消息发送代码
public interface MessageSource {


    String OUT_PUT = "testMessage";

    /**
     * 设置输出信息绑定的目标
     * @return
     */
    @Output(OUT_PUT)
    MessageChannel sendMessage();
}
@EnableBinding(MessageSource.class)
public class SendMessageService {

    @Autowired
    @Output(MessageSource.OUT_PUT)
    private MessageChannel channel;

    /**
     * 消息发送
     * @param msg
     */
    public void sendMsg(String msg) {
        channel.send(MessageBuilder.withPayload(msg).build());
        System.err.println("消息发送成功:"+msg);
    }

}
测试用代码
@RestController
public class SendMessageController {

    @Autowired
    private SendMessageService sendMessage;

    @RequestMapping(value = "send",method = RequestMethod.GET)
    public String sendMessag() {
        sendMessage.sendMsg("user name");
        return "send message: user name";
    }

}

创建消息的接收者

依赖和参数配置

消息接收者的依赖和参数配置和消息发送者相同

配置
spring:
  application:
    name: base-stream-client
  # mq的配置
  rabbitmq:
     host: 127.0.0.1
     port: 5672
     username: admin
     password: admin
  cloud:
    stream:
      rabbit:
        # 可以配置多个,作为入门案例,甚至可以不进行配置
        bindings:
          # 监听的消息队列的名称。
          testMessage:
            # 服务的名称
            group: learn
            # 将发送的对象消息转化为json,方便调试
            content-type: application/json

server:
  port: 8703

eureka:
  client:
    service-url: 
      defaultZone: http://localhost:8000/eureka/
logging:
  file: ${spring.application.name}.log
代码

代码不同之处,消息的发送被修改为消息的监听

启动类
@SpringBootApplication
@EnableEurekaClient
public class StreamClientApplication {

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

}

消息接收配置
public interface GetMessage {

    String NAME = "testMessage";

    /**
     * 设置输入信息绑定的目标
     * @return
     */
    @Input(NAME)
    SubscribableChannel testInPut();

}

@EnableBinding(GetMessage.class)
public class GetMessageService {


    @StreamListener(GetMessage.NAME)
    public void messageInPut(Message<String> message) {
        System.err.println(" 消息接收成功:" + message.getPayload());
    }

}

测试

现在我们测试一下通过一方进行消息发送另外一方是否能够获得消息。

现在我们请求:http://localhost:8704/send

在这里插入图片描述

可以看到消息以及发出,那么现在看看消息接收者的控制台

在这里插入图片描述
此时可以看到消息已经经过消息队列完成数据的通讯。这样Spring Cloud Stream的基础使用就完成了。


本篇文章并未贴出所有代码,涉及的源码下载地址:https://gitee.com/daifylearn/cloud-learn

ps.上述的所有项目都是可以成功运行的。但是在后期为了实现每个应用端口尽量不冲突会有些许调整,而后续某次作死调整结构和名称可能会导致部分项目无法运行o(╯□╰)o,如果发现请留言我进行修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
概要介绍:本门课程属于“Java分布式中间件大汇聚实战”系列课程,主要介绍了企业级项目中真实的应用场景的实现及主流的Java核心技术栈(Redis、RabbitMQ、Spring AOP、Redisson、ZooKeeper…)的实战等等。除此之外,还介绍了如何基于Redis设计并实战一款点赞系统(点赞、取消点赞、排行榜、用户中心、文章点赞用户列表…)可以说技术干货甚多,不仅可以巩固企业级应用系统的开发实战能力,相信在面试、跳槽涨薪方面也能带来相应的帮助!课程内容:传说中的金三银四、面试跳槽涨薪季已经来临,Debug特地为大家准备了一系列跟面试、跳槽、巩固核心技术栈相关的课程,本门课程属于第一季,其中的内容包括企业级项目中真实的应用场景实战、面试相关的技术点分享、主流的Java技术栈(Undertow、Redis、RabbitMQ、Spring AOP、Redisson、ZooKeeper…)实战等等。除此之外,我们还基于Redis设计并实战了一款点赞系统,可以说技术干货甚多。在课程的最后,Debug给大家整理了一份最新的面向BAT大厂招聘 ~ 2020年程序猿最新的Java面试题(附带目录和答案),希望对各位小伙伴的成长有所帮助!值得一提的是,本季课程实战的应用场景包括“日志记录”、“邮件发送”、“通告消息通知”、“短信验证码失效验证”、“会员到期自动提醒/到期前N天自动提醒”以及“点赞系统”的设计与实战,其大纲如下所示:其中,涉及到的技术栈包括Spring Boot2.0、Mybatis、Undertow、Redis、RabbitMQ、Redisson、Spring AOP、 Java8…下面罗列出本门课程重点介绍的价格应用案例以及业务场景的实现流程图!(1)基于Spring消息驱动模型实现日志的异步记录:(2)基于消息中间件RabbitMQ的消息队列实现日志的异步记录:(3)基于缓存中间件Redis的订阅发布机制实现商户公告消息通知:(4)基于Redis的Key失效与定时任务实现实现短信验证码的过期失效验证:其他核心、典型的应用案例和业务场景的实战可以详细参考“课程目录”!除此之外,我们还基于缓存中间件Redis设计并实战实现了点赞系统中的点赞功能模块,下面罗列出其中涉及到的相关功能模块的实战流程图:其课程收益如下所示:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大·风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值