微服务项目使用RabbitMQ
微服务项目使用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的更多相关文章
- SpringCloud(1)---基于RestTemplate微服务项目案例
基于RestTemplate微服务项目 在写SpringCloud搭建微服务之前,我想先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间额通讯.然后在此基础上 ...
- Docker部署golang微服务项目
这篇博客是为了记录一下部署步骤. 因为实训需要,我要在服务器上用docker部署我们小组的微服务项目.我们的微服务有Gateway,User,Scene,Device四个部分,分别占用不同的端口,其中 ...
- 探索解析微服务下的RabbitMQ
概览 本文主要介绍如何使用RabbitMQ消息代理来实现分布式系统之间的通信,从而促进微服务的松耦合. RabbitMQ,也被称为开源消息代理,它支持多种消息协议,并且可以部署在分布式系统上.它轻量级 ...
- docker微服务部署之:三,搭建Zuul微服务项目
docker微服务部署之:二.搭建文章微服务项目 一.新增demo_eureka模块,并编写代码 右键demo_parent->new->Module->Maven,选择Module ...
- docker微服务部署之:二、搭建文章微服务项目
docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...
- docker微服务部署之:一,搭建Eureka微服务项目
先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...
- 【spring colud】spring cloud微服务项目搭建【spring boot2.0】
spring cloud微服务项目搭建 =================================== 示例版本: 1.spring boot 2.0版本 2.开发工具 IntellJ IDE ...
- Docker 搭建 ELK 读取微服务项目的日志文件
思路: 在docker搭建elasticsearch与kibana来展示日志,在微服务部署的机子上部署logstash来收集日志传到elasticsearch中,通过kibana来展示,logstas ...
- .Net Core 商城微服务项目系列(一):使用IdentityServer4构建基础登录验证
这里第一次搭建,所以IdentityServer端比较简单,后期再进行完善. 1.新建API项目MI.Service.Identity,NuGet引用IdentityServer4,添加类InMemo ...
- 毕业设计代做,各种系统微服务项目ssm项目,员工管理系统,微信小程序,购物商城,二手商城系统,销售系统,等等
毕业设计代做,各种系统,微服务项目,ssm项目 小程序,商城等,期末作业等都可以,价格好说,长期接单, 有项目说明书,软件介绍相关文档,答辩的时候包过,知识点对接好,给你讲解等, 毕业设计代做,各种系 ...
随机推荐
- 2022-09-03:n块石头放置在二维平面中的一些整数坐标点上 每个坐标点上最多只能有一块石头 如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。 给你一个长度为 n 的数组
2022-09-03:n块石头放置在二维平面中的一些整数坐标点上 每个坐标点上最多只能有一块石头 如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头. 给你一个长度为 n 的数组 ...
- 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 ...
- 8张图带你全面了解kafka的核心机制
前言 kafka是目前企业中很常用的消息队列产品,可以用于削峰.解耦.异步通信.特别是在大数据领域中应用尤为广泛,主要得益于它的高吞吐量.低延迟,在我们公司的解决方案中也有用到.既然kafka在企业中 ...
- 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 ...
- ubuntu18 安装单机k8s v1.18.2
背景 当我们需要对k8s进行二次开发时,k8s环境是必须的,那么在ubuntu上部署单机k8s是最方便的,便于开发调试 系统准备 本人用的是Ubuntu18,以下以此为例 部署之前,最好切换至root ...
- Java 网络编程 —— 创建非阻塞的 HTTP 服务器
HTTP 概述 HTTP 客户程序必须先发出一个 HTTP 请求,然后才能接收到来自 HTTP 服器的响应,浏览器就是最常见的 HTTP 客户程序.HTTP 客户程序和 HTTP 服务器分别由不同的软 ...
- .NET 创建无边框的跨平台应用
.NET 创建无边框的跨平台应用 在创建了Photino应用程序以后我们发现它自带了一个标题栏,并且非常丑,我们现在要做的就是去掉这个很丑的自带标题栏,并且自定义一个更好看的,下面我们将用Masa B ...
- 我们浏览 GitHub 时,经常看到 "WIP" 的分支,即 Work In Progress,正在开发过程中(尚不能独立的运行)的代码。这部分的代码在 Github/Gitlab 中将禁用“合......
本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...
- Python生成指定大小的文件
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/400bd75c.html 你好,我是测试蔡坨坨. 在日常测试工作中,我们经常需要对上传的文件大小进行测试,例如:一个文件上传 ...
- 6 种方式读取 Springboot 的配置,老鸟都这么玩(原理+实战)
大家好,我是小富- 从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者在这个方面踩坑. 我整理了几种获取配置属性的方式,目的不仅是要让大家学 ...