SpringCloud-消息组件

1 简介

了解过RabbitMQ后,可能我们会遇到不同的系统在用不同的队列。比如系统A用的Kafka,系统B用的RabbitMQ,但是没了解过Kafka,因此可以使用Spring Stream,它能够屏蔽地产,像JDBC一样,只关心SQL和业务本身,不关心数据库的具体实现。

创建一个新的项目测试

导入SpringCloud依赖

bash 复制代码
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

新建两个模块,一个生产者一个消费者

给两个模块导入依赖

bash 复制代码
<dependencies>
    <!--  RabbitMQ的Stream实现  -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>


1.1 编写生产者

首先是配置文件

bash 复制代码
server:
  port: 8001
spring:
  cloud:
    stream:
      binders:   #此处配置要绑定的rabbitmq的服务信息
        local-server: #绑定名称,随便起一个就行
          type: rabbit #消息组件类型,这里使用的是RabbitMQ,就填写rabbit
          environment:  #服务器相关信息,按照下面的方式填写就行,爆红别管
            spring:
              rabbitmq:
                host: 8.130.172.119
                port: 5672
                username: admin
                password: password
                virtual-host: /
       bindings:
        test-out-0:
          destination: test.exchange


然后编写controller,访问一次接口,就向消息队列发送一个数据:

bash 复制代码
@RestController
public class PublishController {

    @Resource
    StreamBridge bridge;  //通过bridge来发送消息

    @RequestMapping("/publish")
    public String publish(){
        //第一个参数其实就是RabbitMQ的交换机名称(数据会发送给这个交换机,到达哪个消息队列,不由我们决定)
      	//这个交换机的命名稍微有一些规则:
      	//输入:    <名称> + -in- + <index>
      	//输出:    <名称> + -out- + <index>
      	//这里我们使用输出的方式,来将数据发送到消息队列,注意这里的名称会和之后的消费者Bean名称进行对应
        bridge.send("test-out-0", "HelloWorld!");
        return "消息发送成功!"+new Date();
    }
}


这里生产者就完成了

1.2 消费者

编写配置文件

因为消费者是输入,默认名称为 方法名-in-index,这里我们将其指定为我们刚刚定义的交换机

消费者启动类

直接定义一个consumer类型的bean即可

bash 复制代码
@Component
public class ConsumerComponent {

    @Bean("test")   //注意这里需要填写我们前面交换机名称中"名称",这样生产者发送的数据才会正确到达
    public Consumer<String> consumer(){
        return System.out::println;
    }
}

此时消费者就编写完成

1.3 启动测试

启动两个服务

访问controller

消费者接收到消息

这样就通过SpringCloud Stream屏蔽掉底层RabbitMQ来直接进行消息的操作了

相关推荐
正经摸鱼1 分钟前
classpath与classpath*实现逻辑
后端·spring
努力的搬砖人.1 分钟前
maven如何使用
java·后端·面试·maven
小码编匠5 分钟前
.NET 验证码生成神器基于 SkiaSharp 的高性能方案
后端·c#·.net
风象南5 分钟前
SpringBoot中6种跨域请求解决方案
java·spring boot·后端
LucianaiB7 分钟前
拿到Offer,租房怎么办?看我用高德MCP+腾讯云MCP,帮你分分钟搞定!
前端·后端·cursor
vivo互联网技术7 分钟前
活动中台系统慢 SQL 治理实践
java·数据库·后端
良枫7 分钟前
Spring Security认证授权深度解析
spring boot·spring
MariaH34 分钟前
Sequelize模型初探
前端·后端
码视野35 分钟前
基于SpringBoot的河道水情大数据可视化分析平台设计与实现(源码+论文+部署讲解等)
spring boot·后端·物联网·信息可视化·论文·本科毕业论文·计算机专业毕业论文
你的人类朋友39 分钟前
解释一下Node.js的『阻塞』现象,并回答:为什么会阻塞?什么情况下会阻塞?
javascript·后端·node.js