微服务项目使用RabbitMQ

很久未用RabbitMQ了,根据网上的Demo,大多数是一个服务包含所有的生产者和消费者和配置,当自己去搭建服务的时候,还需要一些思考各种包的划分.无法无脑CV大法,所以,下文,我根据实际项目抽离出一个比较完整的小Demo演示微服务项目使用RabbitMQ.注意:这个小Demo并没有做消息的可靠性相关操作!

公共服务

一般微服务有一个公共服务,用于存放一些配置类或者常量类等,这里我以service_util举例,这个服务下,应该会有以下四个包,如下:

├─config  -- 配置类的包
│ RabbitMQConfig.java

├─MQConstant -- 常量的包
│ RabbitMQConstant.java

├─service -- 封装的服务的包
│ RabbitService.java

└─vo -- Vo的包
OrderVo.java

RabbitMQConfig

这个类下,我们可以配置基本的RabbitMQ的消息的序列化,在消息的传输过程中,对象和Json的互相转化,详细代码如下:

package com.leixin.mq.config;

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @Classname RabbitMQConfig
* @Description TODO
* @Date 2023-08-07 21:25
* @Created by LeiXin
*/
/*
这个配置类的作用是将一个消息转换器添加到RabbitMQ中,
这样在消息发送和接收时,
就能够自动地将Java对象转换为JSON格式的消息,
以及将JSON格式的消息转换回Java对象。
*/
@Configuration
public class RabbitMQConfig { // 声明一个@Bean注解,表示这是一个Spring Bean,会由Spring容器进行管理和实例化
@Bean
public MessageConverter getMessageConverter() {
// 创建并返回一个Jackson2JsonMessageConverter实例作为消息转换器
// 这个转换器用于在消息发送和接收之间进行JSON格式的转换
return new Jackson2JsonMessageConverter();
}
}

RabbitMQConstant

这个包用于指定消息队列的常量

package com.leixin.mq.MQConstant;

/**
* @Classname RabbitMQConstant
* @Description TODO
* @Date 2023-08-07 23:23
* @Created by LeiXin
*/
public class RabbitMQConstant { /**
* 预约下单
*/
public static final String EXCHANGE_DIRECT_ORDER = "exchange.direct.order";
public static final String ROUTING_ORDER = "order";
//队列
public static final String QUEUE_ORDER = "queue.order"; /**
* 短信
*/
public static final String EXCHANGE_DIRECT_SMS = "exchange.direct.msm";
public static final String ROUTING_SMS_ITEM = "msm.item";
//队列
public static final String QUEUE_MSM_SMS = "queue.msm.item";
}

RabbitService

这个包用于封装消息的发送方式,之后发送消息只要使用RabbitService.

package com.leixin.mq.service;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; /**
* @Classname RabbitService
* @Description TODO
* @Date 2023-08-07 23:07
* @Created by LeiXin
*/
@Service
public class RabbitService {
@Autowired
private RabbitTemplate rabbitTemplate; /**
* 发送消息
* @param exchange
* @param routingKey
* @param message
* @return
*/
public boolean sendMessage(String exchange,String routingKey,Object message){
rabbitTemplate.convertAndSend(exchange,routingKey,message);
return true;
}
}

OrderVo

这里注意Vo包都要放在公共包中,因为生产者和消费者的服务都使用这个对象进行消息的封装传输,这个OrderVo类,只是简单举个例子.

package com.leixin.mq.vo;

/**
* @Classname OrderVo
* @Description TODO
* @Date 2023-08-08 0:04
* @Created by LeiXin
*/
public class OrderVo {
String id;
String orderName; Integer count; public Integer getCount() {
return count;
} public void setCount(Integer count) {
this.count = count;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getOrderName() {
return orderName;
} public void setOrderName(String orderName) {
this.orderName = orderName;
}
}

依赖

  <parent>
<groupId>com.leixin</groupId>
<artifactId>SpringBoot-RabbitMq</artifactId>
<version>1.0-SNAPSHOT</version>
</parent> <artifactId>service_util</artifactId> <properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies> <!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- 提供 Spring Boot 对 AMQP(高级消息队列协议)的支持,包括 RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency> <!-- 提供 Java 的 Lombok 库,可以简化代码中的重复和样板代码,提高代码可读性和可维护性 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency> <!-- 提供 Spring Boot 单元测试和集成测试所需的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> </dependencies>

生产者

生产者用于发送消息,简单举例,就直接在Controller层发送消息

└─producer
│ XxxApplication.java

└─controller
XxxController.java

XxxApplication

SpringBoot的启动类,注意,这个CompontScan主要是为了扫描到公共包的一些配置或者组件

@SpringBootApplication
@ComponentScan("com.leixin")
public class XxxApplication { public static void main(String[] args) {
SpringApplication.run(XxxApplication.class, args);
}
}

XxxController

生产者的服务发送至消息队列

@RestController
@RequestMapping("/test")
public class XxxController {
@Autowired
private RabbitService rabbitService; @GetMapping
public void testSendMessage(){
OrderVo orderVo = new OrderVo();
orderVo.setCount(100);
rabbitService.sendMessage(RabbitMQConstant.EXCHANGE_DIRECT_ORDER
,RabbitMQConstant.ROUTING_ORDER,
orderVo);
}
}

配置类

application.yml

# Spring配置部分
spring:
rabbitmq:
# RabbitMQ主机地址
host: localhost
# RabbitMQ端口
port: 5672
# 连接RabbitMQ的用户名
username: guest
# 连接RabbitMQ的密码
password: guest
# 虚拟主机,默认为根虚拟主机"/"
virtual-host: / # Spring Boot内嵌服务器配置部分
server:
# 内嵌服务器监听的端口号
port: 8092

依赖

    <dependencies>
<dependency>
<groupId>com.leixin</groupId>
<artifactId>service_util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

消费者

消费者主要用于处理一些消息,文件如下:

│  YyyApplication.java

└─listener
YyyMQListener.java

YyyMQListener

这里就是用于处理消息

package com.leixin.mq.listener;

import com.leixin.mq.MQConstant.RabbitMQConstant;
import com.leixin.mq.vo.OrderVo;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; /**
* @Classname YyyMQListener
* @Description TODO
* @Date 2023-08-07 23:54
* @Created by LeiXin
*/ @Component
public class YyyMQListener { // 使用 @RabbitListener 注解标记这个方法作为消息监听器
// bindings 属性用于定义队列、交换机以及路由关系
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue(name = RabbitMQConstant.QUEUE_ORDER, durable = "true"), // 创建队列
exchange = @Exchange(name = RabbitMQConstant.EXCHANGE_DIRECT_ORDER), // 创建交换机
key = RabbitMQConstant.ROUTING_ORDER
)
})
// consume 方法用于处理收到的消息
public void consume(OrderVo order, Message message, Channel channel) {
// 从传入的 OrderVo 对象中获取订单数量,并将其减少
Integer count = order.getCount();
count--; // 输出调试信息,展示订单数量的变化
System.out.println(count); // 在这里可以添加你的业务逻辑,处理订单相关的操作
// 例如,更新数据库中的订单状态、发送通知等
// 最后,可能需要手动确认消息的处理,通过 channel.basicAck 方法
}
}

配置文件

application.yml

spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
virtual-host: /
server:
port: 8093

依赖

    <dependencies>
<dependency>
<groupId>com.leixin</groupId>
<artifactId>service_util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

微服务项目使用RabbitMQ的更多相关文章

  1. SpringCloud(1)---基于RestTemplate微服务项目案例

    基于RestTemplate微服务项目 在写SpringCloud搭建微服务之前,我想先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间额通讯.然后在此基础上 ...

  2. Docker部署golang微服务项目

    这篇博客是为了记录一下部署步骤. 因为实训需要,我要在服务器上用docker部署我们小组的微服务项目.我们的微服务有Gateway,User,Scene,Device四个部分,分别占用不同的端口,其中 ...

  3. 探索解析微服务下的RabbitMQ

    概览 本文主要介绍如何使用RabbitMQ消息代理来实现分布式系统之间的通信,从而促进微服务的松耦合. RabbitMQ,也被称为开源消息代理,它支持多种消息协议,并且可以部署在分布式系统上.它轻量级 ...

  4. docker微服务部署之:三,搭建Zuul微服务项目

    docker微服务部署之:二.搭建文章微服务项目 一.新增demo_eureka模块,并编写代码 右键demo_parent->new->Module->Maven,选择Module ...

  5. docker微服务部署之:二、搭建文章微服务项目

    docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...

  6. docker微服务部署之:一,搭建Eureka微服务项目

    先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...

  7. 【spring colud】spring cloud微服务项目搭建【spring boot2.0】

    spring cloud微服务项目搭建 =================================== 示例版本: 1.spring boot 2.0版本 2.开发工具 IntellJ IDE ...

  8. Docker 搭建 ELK 读取微服务项目的日志文件

    思路: 在docker搭建elasticsearch与kibana来展示日志,在微服务部署的机子上部署logstash来收集日志传到elasticsearch中,通过kibana来展示,logstas ...

  9. .Net Core 商城微服务项目系列(一):使用IdentityServer4构建基础登录验证

    这里第一次搭建,所以IdentityServer端比较简单,后期再进行完善. 1.新建API项目MI.Service.Identity,NuGet引用IdentityServer4,添加类InMemo ...

  10. 毕业设计代做,各种系统微服务项目ssm项目,员工管理系统,微信小程序,购物商城,二手商城系统,销售系统,等等

    毕业设计代做,各种系统,微服务项目,ssm项目 小程序,商城等,期末作业等都可以,价格好说,长期接单, 有项目说明书,软件介绍相关文档,答辩的时候包过,知识点对接好,给你讲解等, 毕业设计代做,各种系 ...

随机推荐

  1. 2022-09-03:n块石头放置在二维平面中的一些整数坐标点上 每个坐标点上最多只能有一块石头 如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。 给你一个长度为 n 的数组

    2022-09-03:n块石头放置在二维平面中的一些整数坐标点上 每个坐标点上最多只能有一块石头 如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头. 给你一个长度为 n 的数组 ...

  2. 2022-06-26:以下golang代码输出什么?A:true;B:false;C:编译错误。 package main import “fmt“ func main() { type

    2022-06-26:以下golang代码输出什么?A:true:B:false:C:编译错误. package main import "fmt" func main() { t ...

  3. 8张图带你全面了解kafka的核心机制

    前言 kafka是目前企业中很常用的消息队列产品,可以用于削峰.解耦.异步通信.特别是在大数据领域中应用尤为广泛,主要得益于它的高吞吐量.低延迟,在我们公司的解决方案中也有用到.既然kafka在企业中 ...

  4. weex create test-app Error: Cannot find module '../package.json'

    weex create 报错 D:\YLKJPro>weex create test-app Error: Cannot find module '../package.json' at Fun ...

  5. ubuntu18 安装单机k8s v1.18.2

    背景 当我们需要对k8s进行二次开发时,k8s环境是必须的,那么在ubuntu上部署单机k8s是最方便的,便于开发调试 系统准备 本人用的是Ubuntu18,以下以此为例 部署之前,最好切换至root ...

  6. Java 网络编程 —— 创建非阻塞的 HTTP 服务器

    HTTP 概述 HTTP 客户程序必须先发出一个 HTTP 请求,然后才能接收到来自 HTTP 服器的响应,浏览器就是最常见的 HTTP 客户程序.HTTP 客户程序和 HTTP 服务器分别由不同的软 ...

  7. .NET 创建无边框的跨平台应用

    .NET 创建无边框的跨平台应用 在创建了Photino应用程序以后我们发现它自带了一个标题栏,并且非常丑,我们现在要做的就是去掉这个很丑的自带标题栏,并且自定义一个更好看的,下面我们将用Masa B ...

  8. 我们浏览 GitHub 时,经常看到 "WIP" 的分支,即 Work In Progress,正在开发过程中(尚不能独立的运行)的代码。这部分的代码在 Github/Gitlab 中将禁用“合......

    本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...

  9. Python生成指定大小的文件

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/400bd75c.html 你好,我是测试蔡坨坨. 在日常测试工作中,我们经常需要对上传的文件大小进行测试,例如:一个文件上传 ...

  10. 6 种方式读取 Springboot 的配置,老鸟都这么玩(原理+实战)

    大家好,我是小富- 从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者在这个方面踩坑. 我整理了几种获取配置属性的方式,目的不仅是要让大家学 ...