【Lilishop商城】No2-5.确定软件架构搭建四(本篇包括消息中间件RocketMQ)

news2025/1/19 23:02:44

 仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在:

【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客


全篇只介绍重点架构逻辑,具体编写看源代码就行,读起来也不复杂~

谨慎:源代码中有一些注释是错误的,有的注释意思完全相反,有的注释对不上号,我在阅读过程中就顺手更新了,并且在我不会的地方添加了新的注释,所以在读源代码过程中一定要谨慎啊!

目录

A1.消息中间件AMQP

B1.消息中间件基本搭建 

C1.测试生产消息业务

B2.consumer 消息模块

C1.测试消费消息业务

剩余内容:定时任务等


A1.消息中间件AMQP

RocketMQ学习可以看这篇文章,特别详细:​​​​​​​RocketMQ-介绍_CSDN博客_rocketmq

有核心四大组件 NameServer(名称服务器)、Broker(费服务器)、 Producer、Consumer;

有几个概念:消息(Message)、主题(Topic)、标签(Tag)、队列(Queue)、生产者组(producerGroup)、消费者组(consumerGroup);

可以理解为:

我们想要处理的数据就是消息,每个消息属于且只能属于一个主题,但是可以属于多个标签,一个主题中可以包含多个队列,队列里面存储消息。

在使用中,我们可以把同一类型的消息放到一个主题里面,如果这类消息有不同的操作,就可以在区分不同标签,然后分别处理。

生产者组(producerGroup)、消费者组(consumerGroup)暂时用不到,但是要了解一下,生产者组就是一类生产者的集合。消费者组要复杂些,就是一类消费者的集合,这类消费者通常消费同一类消息,并且消费逻辑一致,所以将这些消费者分组在一起,消费者组与生产者组类似,都是将相同角色的消费者分组在一起并命名的。

组的概念容易搞不清楚,我也没找到实例,就是自己简单测试了一下,之后再总结吧,组的概念看这里:RocketMq中组的概念_rocketmq生产者组作用

还有一件事~消费者组有订阅逻辑,可以看阿里云的介绍,什么是订阅关系一致_消息队列RocketMQ版-阿里云帮助中心

在开始使用前为了方便查看消息队列,我们下载一个可视化控制台rocketmq-externals,可看这篇:Mac安装RocketMQ和可视化控制台教程_-CSDN博客-可视化教程在第二大步骤

rocketMq在4.4.0版本时引入了ACL机制,用于访问权限控制。但是我还没找到rocketmq-spring-boot-starter对应的操作版本,所以整合的jar包是否有权限访问这个需要再次确定(待学习)

B1.消息中间件基本搭建 

系统使用的rocketmq-spring-boot-starter,经过了封装使用起来更方便。

在 framework 项目路径下的 pom.xml 中指定使用的依赖包,并且在总项目路径中设置包的版本号

/lilishop-master/pom.xml

    <properties>
        <rocketmq-version>2.2.2</rocketmq-version>
    </properties>
/lilishop-master/framework/pom.xml

        <!-- rocketmq-spring-boot-starter -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>${rocketmq-version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>fastjson</artifactId>
                    <groupId>com.alibaba</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

然后在业务包里的resource的配置文件application.xml中设置配置信息,配置服务器访问地址和生产者信息,这里注意哦,由于我们使用的是 springboot 整合的,我们可以直接通过yml设置DefaultMQProducer的配置信息,然后通过 ExtProducerResetConfiguration 创建RocketMQTemplate的bean并使用,所以当前程序中使用自动注入的RocketMQTemplate操作生产者时都是一个group里的哦,例如manager-api模块中的。

RocketMQTemplate里面有DefaultMQProducer属性)

# /lilishop-master/manager-api/src/main/resources/application.yml

rocketmq:
  # 访问地址
  name-server: 127.0.0.1:9876
  producer:
    # 必须指定 group
    group: lili_group
    send-message-timeout: 30000

现在就可以进行基本的使用了,我们要进行一下测试的。

C1.测试生产消息业务

我们可以写个controller类,里面注入RocketMQTemplate对象,然后生产消息.

也可以在test里面进行测试,我这里就在test里测试生产了,一定要配置yml,

# /lilishop-master/manager-api/src/test/resources/application.yml

rocketmq:
  # 访问地址
  name-server: 127.0.0.1:9876
  producer:
    # 必须指定 group
    group: lili_group
    send-message-timeout: 30000

然后创建测试方法

//详见:cn.lili.test.rocketmq.MsgExtRocketMqTest

@ExtendWith(SpringExtension.class)
@SpringBootTest
@Slf4j
class MsgExtRocketMqTest {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    @Test
    void test() {
        //这里用 :隔开 topic 和 tag,多个 tag可以用 || 隔开
        String destination = "topicTest1:tagTest1";
        Message<String> message = MessageBuilder.withPayload("Context~~~~~~~"+destination).build();
        rocketMQTemplate.send(destination, message);
        log.info("生产消息:msg={}", message);
        Assertions.assertTrue(true);
    }

}

 打开可视化控制台rocketmq-externals,打开消息列表,主题查询一定要选择主题,不然提示:Required String parameter 'topic' is not present。

下面就是我们生产的消息:

注意红色字体~ 

B2.consumer 消息模块

接下来做消费者的测试,lilishop系统是直接在 consumer 模块做的消息mq和后面的定时/延时任务,那我们也可以跟他们一样创建 consumer 模块,在里面添加消费者监听

先添加依赖,由于之后的这里也会有很多业务逻辑,所以直接依赖 framework 就可以

/lilishop-master/consumer/pom.xml

    <parent>
        <groupId>cn.lili</groupId>
        <artifactId>lili-shop-parent</artifactId>
        <version>${revision}</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <dependencies>
        <dependency>
            <groupId>cn.lili</groupId>
            <artifactId>framework</artifactId>
            <version>${revision}</version>
        </dependency>
    </dependencies>

然后在resource的配置文件application.xml中设置配置信息,一开始直接设置服务端口、日志信息和rocketmq配置就可以​​​​​​​

# /lilishop-master/consumer/src/main/resources/application.yml

server:
  port: 8886
  servlet:
    context-path: /
  tomcat:
    uri-encoding: UTF-8
    threads:
      min-spare: 50
      max: 1000

# 日志
logging:
  config: classpath:logback-spring.xml
  # 输出级别
  level:
    root: info
  file:
    # 指定路径
    path: lili-logs
  logback:
    rollingpolicy:
      # 最大保存天数
      max-history: 7
      # 每个文件最大大小
      max-file-size: 5MB

rocketmq:
  # 访问地址
  name-server: 127.0.0.1:9876
  producer:
    # 必须指定 group
    group: lili_group
    send-message-timeout: 30000

同时在启动类上修改 rocketmq 的日志配置为Slf4j,默认的日志配置看:org.apache.rocketmq.client.log.ClientLogger

//详见:cn.lili.ConsumerApplication

@SpringBootApplication
public class ConsumerApplication {

    public static void main(String[] args) {
        System.setProperty("es.set.netty.runtime.available.processors", "false");
        //将 rocketmq 的日志修改为 Slf4j ,配合 logback.xml 输出
        System.setProperty("rocketmq.client.logUseSlf4j","true");
        SpringApplication.run(ConsumerApplication.class, args);
    }

}

要记得关闭security的 http.formLogin().disable();因为我们依赖的是 framework 模块~

//详见:cn.lili.sucurity.ConsumerSecurityConfig

@Component
public class ConsumerSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin().disable();
    }
}

现在添加消费业务,一个注解和一个监听接口

//详见:cn.lili.listener.TestMessageListener

@Component
@Slf4j
//消费topic = "topicTest1"的消息,consumerGroup是指消费组
@RocketMQMessageListener(topic = "topicTest1", consumerGroup = "consumerGroup")
public class TestMessageListener implements RocketMQListener<MessageExt> {

    @Override
    public void onMessage(MessageExt messageExt) {
        log.info("========TestMessageListener,topic = topicTest1 ==================");
        byte[] body = messageExt.getBody();
        String msg = new String(body);

        //区分 tag 再分别进行处理
        switch (messageExt.getTags()) {
            case "tagTest1":
                log.info("监听到消息tagTest1:msg={}", msg);
                break;
            case "tagTest2":
                log.info("监听到消息tagTest2:msg={}", msg);
                break;
            default:
                break;
        }
    }
}

C1.测试消费消息业务

直接启动consumer模块

我直接通过rocketmq-externals里面重新发的消息~

剩余内容:定时任务等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python:如何在 CentOS 8 服务器上运行 Selenium 代码?

前言 因项目需求&#xff0c;需要在 CentOS 8 服务器上运行 Python-Selenium 代码&#xff0c;那么该如何操作呢&#xff1f; 运行环境 CentOS Stream 8Python 3.9.13selenium4.6.0Google Chrome 107.0.5304.121 操作步骤 安装 Google Chrome 下载 Linux 版本的 Chrome 将下…

怎么合并视频?快把这些方法收好

小伙伴们平时会在通过网课来提高自己的技能吗&#xff1f;我经常会在网上保存一系列的视频进行学习&#xff0c;可是当保存的网课视频数量多起来后&#xff0c;每次想要找对应的视频&#xff0c;都得花上不少的时间。其实我们可以通过将相同系列的视频合并起来的方法&#xff0…

java word,excel,ppt转pdf

准备工作 1.下载 jacob.jar 链接&#xff1a;https://pan.baidu.com/s/1TWIGyX9A3xQ6AG9Y3mVlVg 提取码&#xff1a;abcd 2.下载安装wpsWPS Office-支持多人在线编辑多种文档格式_WPS官方网站 3.添加 jar到项目和ddl文件放在jdk的jre/bin目录下&#xff0c;记得自己系统是…

13_cgi

知识点1【cgi实现计算器案例】 2、GET的同步方式&#xff1a; index.html <html><head><title>table</title><meta charset"UTF-8"><!--这是描述 js中的函数来之哪个js文件--><script type"text/javascript" sr…

Kafka基础与核心概念

本文&#xff0c;我们将试图回答什么是apache kafka。 kafka是一个分布式流平台或者分布式消息提交日志 分布式 Kafka 由一个或多个节点组成的工作集群&#xff0c;这些节点可以位于不同的数据中心&#xff0c;我们可以在 Kafka 集群的不同节点之间分布数据/负载&#xff0c;并…

【学习笔记47】开关变量和拖拽效果

一、开关案例 <button>点击获取验证码</button>&#xff08;一&#xff09;基本功能的实现 // 获取标签对象const oBtn document.querySelector(button);// 给按钮添加点击事件oBtn.addEventListener(click, function () {// 定义变量 用于获取验证码let count 5…

javaSE- 方法的使用

一、方法的基本用法 方法就是一个代码片段. 类似于 C 语言中的 “函数”. 方法存在的意义(不要背, 重在体会): 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置使用.让代码更好理解更简单.直接调用现有方法开发, 不必重复造轮…

04_SpringBoot整合Mybatis

文章目录SpringBoot整合Mybatis0x01_创建项目导入依赖0x02_编写配置文件0x03_编写功能代码SpringBoot整合Mybatis 欢迎关注公众号“小东方不败” 0x01_创建项目导入依赖 创建项目&#xff1a; 目前稳定的最新版本是2.7.5,勾选两个依赖&#xff1a;Lombok和Spring Web 然后需…

Nodejs -- Express 路由原理及设置模块化路由

文章目录1. 路由的概念1.1 什么是路由1.2 显示生活中的路由1.3 Express中的路由1.4 Express中路由的例子1.5 路由的匹配过程2 路由的使用2.1 最简单的用法2.2 模块化路由2.3 为路由模块添加统一前缀1. 路由的概念 1.1 什么是路由 广义上来讲&#xff0c;路由就是映射关系 1.…

yarn : 无法加载文件 C:\Users\sunlight\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。

问题&#xff1a; yarn安装好了&#xff0c;vscode报错 报错问题&#xff1a;yarn 无法加载文件 C:\Users\sunlight\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。 具体问题&#xff1a;cmd&#xff08;管理员运行&#xff09;中安装好了yarn &…

Angular使用管道和指令进行多语言切换

工作中经常遇到需要进行多种语言切换的项目。本文记录了一种在Angular页面中通过使用管道和自定义指令实现的语言切换方案。 1、实现效果 页面显示文字根据选择的语言自动进行翻译切换&#xff0c;如下图所示&#xff1a; 此时&#xff0c;页面模板的字符串全部按照管道格式书…

2023年IB生物有什么变化?

今天我们详细了解下2023年IBDP生物新课程内容、考试评估、内容、技能发展、科学本质等详细内容。IBDP生物新课程概述 IBDP新生物课程将于2023年2月开课&#xff0c;2023年8月首次授课&#xff0c;2025年5月进行首次考试。新课程反映社会变革&#xff0c;更加关注技能和概念、背…

【iMessage苹果推群发】苹果相册推archive到appstore开发证书(Development certificate)

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

DCHP通讯协议

从通讯TCP/IP的构成传输&#xff0c;到IP地址的分类&#xff0c;再到局域网与广域网的设置。 通讯协议的构成概述IPDHCP-设定动态IPDNS数据的流动广域网 网关局域网 交换机NAT桥接模式实操概述 前景知识&#xff1a;虚拟机与工艺库管理 扩展&#xff1a;NAT模式的实操。 1、T…

yolov5量化注意事项

&#xff08;1&#xff09;使用onnxsim 0.4.1版本、ort版本1.13.1 否则使用--dynamic True时所生成的onnx就会乱掉。 &#xff08;2&#xff09;利用trtexec生成engine 所使用的命令如下&#xff1a; trtexec.exe --onnxyolov5n_ptq_detect_dynamic.onnx --saveEngineptq_int…

小白学流程引擎-FLowable(二) — 从零搭建自己的FLowable服务 — 搭建流程服务-FLowable的新手指南

一、介绍 纵览Gitee搜索Flowable开源项目&#xff0c;大多都是已开发好的项目&#xff0c;而笔者从零开始搭建属于自己的Flowable引擎&#xff0c;并且是可以拿到生产上使用的。 二、软件架构 Springboot Flowable modeler idm Mysql SrpingBoot version&#xff1a;2.7…

牛客网verilog刷题知识点盘点(75道题的版本)

牛客网verilog刷题知识点盘点(75道题的版本) 还有几个坑没填 任务和函数 1.任务和函数必须在模块内定义&#xff0c;其作用范围仅适用于该模块&#xff0c;可以在模块内多次调用。 2.任务和函数中可以声明局部变量&#xff0c;如寄存器&#xff0c;时间&#xff0c;整数&…

企业云工如何高效居家协同办公?试试这个方法

近日的疫情反扑让全国各地的防疫压力增加&#xff0c;并且甚至很多地方不知道的啥时候就要被居家隔离&#xff0c;所以在新的防疫背景下&#xff0c;居家就顺理成章地成为一种常态化的学习和工作方式。 现在越来越多公司也将日常业务搬到了线上&#xff0c;以保证疫情期间公司的…

基于ssm的旅游网站的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

vue——路由

目录 一、介绍路由 1、路由是什么 Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成&#xff0c;让用 Vue.js 构建单页应用变得轻而易举。 2、为什么要使用路由 3、主要用途 二、安装路由 1、安装命令 2、配置文件 3、在main.js 中进行挂载 三、案例展示 …