当前位置: 首页 > news >正文

RocketMQ云服务器和本地基础安装搭建及可视化控制台安装使用

一起学编程,让生活更随和!

如果你觉得是个同道中人,欢迎关注博主gzh:【随和的皮蛋桑】。

专注于Java基础、进阶、面试以及计算机基础知识分享🐳。偶尔认知思考、日常水文🐌。

在这里插入图片描述


目录

  • 一、RocketMQ 介绍
    • 1、RocketMQ是什么?
    • 2、MQ 的应用场景
      • 2.1、异步任务处理
      • 2.2、应用程序解耦合
      • 2.3、日志收集
    • 3、消息队列技术选型对比
  • 二、RocketMQ 安装和基础使用
    • 1、RocketMQ组成结构
      • 1.1、交互过程
      • 1.2、集群作用
    • 2、RocketMQ安装
      • 2.1、本地Windows安装
        • 2.1.1、环境要求
        • 2.1.2、下载
        • 2.1.3、环境搭建
        • 2.2.4、测试
      • 2.2、云服务器Linux安装
        • 2.2.1、环境要求
        • 2.2.2、环境搭建
        • 2.2.3、测试
    • 3、安装可视化控制台

一、RocketMQ 介绍

1、RocketMQ是什么?

RocketMQ是阿里开源的一款非常优秀中间件产品,脱胎于阿里的另一款队列技术MetaQ,后捐赠给Apache基金会作为一款孵化技术,仅仅经历了一年多的时间就成为Apache基金会的顶级项目。并且它现在已经在阿里内部被广泛的应用,并且经受住了多次双十一的这种极致场景的压力。(2017年的双十一,RocketMQ流转的消息量达到了万亿级,峰值TPS达到5600万)。并且其内部通过Java语言开发,便于阅读与修改。

RocketMQ官: http://rocketmq.apache.org/

2、MQ 的应用场景

MQ全称为Message Queue,即消息队列, 开发中消息队列通常有如下应用场景:

2.1、异步任务处理

将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。

传统方式:

在这里插入图片描述

改造后,交互流程如下:

  1. 订单服务发消息到消息队列。
  2. 消息队列将消息发给仓储服务和物流服务。
  3. 仓储服务和物流服务接收到消息进行业务处理。

在这里插入图片描述

2.2、应用程序解耦合

MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。
举例:上图中,消息队列将订单服务和仓储服务进行解耦合,将订单服务和物流服务进行解耦合。

2.3、日志收集

进行统一业务日志收集,供分析系统进行数据分析,消息队列作为日志数据的中转站。
交互流程如下:
1、采集系统从log日志文件采集数据,发送至消息队列 。
2、各日志需求服务从消息队列 接收消息进行日志处理。

在这里插入图片描述

3、消息队列技术选型对比

市场上还有哪些消息队列?

ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,Redis等

本项目选用RocketMQ的一个主要原因如下 :

  1. 支持事务消息
  2. 支持延迟消息
  3. 天然支持集群、负载均衡
  4. 支持指定次数和时间间隔的失败消息重发

详细的技术选型对比如下:

RabbitMQ:

优点:                           1.支持AMQP协议                                           2.基于erlang语言开发,高并发性能较好                         3.工作模式较为灵活      4.支持延迟消息5.提供较为友好的后台管理页面 6.单机部署,1~2WTPS    
缺点:1.不支持水平扩容    2.不支持事务    3.消息吞吐量三者最差    4.当产生消息堆积,性能下降明显    5.消息重发机制需要手动设置    6.不支持消息重复消费 

RocketMQ:

优点:1.高可用,高吞吐量,海量消息堆积,低延迟性能上,都表现出色    2.api与架构设计更加贴切业务场景    3.支持顺序消息    4.支持事务消息    5.支持消息过滤    6.支持重复消费    7.支持延迟消息    8.支持消息跟踪    9.天然支持集群、负载均衡    10.支持指定次数和时间间隔的失败消息重发    11.单机部署,5~10WTPS    
缺点:1.生态圈相较Kafka有所不如    2.消息吞吐量与消息堆积能力也不如Kafka    3.不支持主从自动切换    4.只支持Java

Kafka:

优点:1.高可用,高吞吐量,低延迟性能上,都表现出色    2.使用人数多,技术生态圈完善    3.支持顺序消息    4.支持多种客户端    5.支持重复消费    
缺点:1.依赖分区,消费者数量受限于分区数    2.单机消息过多时,性能下降明显    3.不支持事务消息    4.不支持指定次数和时间间隔的失败消息重发

二、RocketMQ 安装和基础使用

1、RocketMQ组成结构

在这里插入图片描述

1.1、交互过程

  1. Brokder定时发送自身状态 到NameServer。
  2. Producer 请求NameServer获取Broker的地址。
  3. Producer 将消息发送到Broker中的消息队列。
  4. Consumer订阅Broker中的消息队列,通过拉取消息,或由Broker将消息推送至Consumer。

1.2、集群作用

1)Producer Cluster 消息生产者集群

  • 负责发送消息,一般由业务系统负责产生消息。

2)Consumer Cluster 消费者集群

  • 负责消费消息,一般是后台系统负责异步消费。
  • 两种消费模式:
    • Push Consumer,服务端向消费者端推送消息
    • Pull Consumer,消费者端向服务定时拉取消息

3)NameServer 名称服务器

  • 集群架构中的组织协调员,相当于注册中心,收集 broker的工作情况,不负责消息的处理

4)Broker 消息服务器

  • 是 RocketMQ的核心,负责消息的接受,存储,发送等。
  • 需要定时发送自身状态 到NameServer,默认10秒发送一次,超时2分钟会认为该broker失效。

2、RocketMQ安装

RocketMQ安装:本地Windows版本和云服务器Linux版本。

2.1、本地Windows安装

2.1.1、环境要求

  1. 64位JDK 1.8+;
  2. Maven 3.2.x;
  3. 64位操作系统。

2.1.2、下载

官网下载地址:https://archive.apache.org/dist/rocketmq/

根据需要下载对应的版本,本文介绍采用:4.5.0

下载后解压到一个没有空格和中文的目录。

在这里插入图片描述

2.1.3、环境搭建

maven 采用3.2.x 及以上版本均可(自行找教程下载安装即可)。

1)参数配置

开发环境不需要太多的内存,这里调小一点。

Broker默认磁盘空间利用率达到85%就不再接收,这里在开发环境可以提高磁盘空间利用率报警阀值为98%。

调整默认的内存大小参数,切换到bin目录下,编辑runserver.cmd

cd bin/
vim runserver.cmd

在这里插入图片描述

修改为如下:

set "JAVA_OPT=%JAVA_OPT% ‐server ‐Xms512m ‐Xmx512m ‐Xmn512m ‐XX:MetaspaceSize=128m ‐XX:MaxMetaspaceSize=320m"

bin目录下,编辑修改runbroker.cmd

cd bin/
vim runbroker.cmd

在这里插入图片描述

修改为如下:

set "JAVA_OPT=%JAVA_OPT% ‐server ‐Drocketmq.broker.diskSpaceWarningLevelRatio=0.98 ‐Xms512m ‐Xmx512m ‐Xmn512m"

指定broker的命名空间地址,编辑broker.conf

在这里插入图片描述

默认情况下,namesrvAddr127.0.0.1:9876

2)配置环境变量

路径只到解压目录即可:

在这里插入图片描述

3)启动NameServer

打开cmd窗口,切换到bin目录:

d:
cd D:\Software\MQ\rocketmq-all-4.5.0-bin-release\bin
start mqnamesrv.cmd

在这里插入图片描述

4)启动Broker

打开cmd窗口,切换到bin目录下:

# -n:指定NameServer的地址
start mqbroker.cmd ‐n 127.0.0.1:9876 autoCreateTopicEnable=true

在这里插入图片描述

此窗口也不要关闭。

2.2.4、测试

bin目录下专门提供了一个tools.cmd工具类,可以测试namesrvbroker是否真正启动成功!

1)打开cmd窗口【发送消息】

set NAMESRV_ADDR=127.0.0.1:9876
cd D:\Software\MQ\rocketmq-all-4.5.0-bin-release\bin
# 启动生产者
tools.cmd org.apache.rocketmq.example.quickstart.Producer

如果启动报错,仔细检查启动namesrvbroker的参数配置,以及tools.cmd的参数配置!!!

正确启动如下:

在这里插入图片描述

2)打开cmd窗口【接收消息】

set NAMESRV_ADDR=127.0.0.1:9876
cd D:\Software\MQ\rocketmq-all-4.5.0-bin-release\bin
# 启动消费者
tools.cmd org.apache.rocketmq.example.quickstart.Consumer

在这里插入图片描述

windows下安装和测试完成!!!

2.2、云服务器Linux安装

2.2.1、环境要求

下载地址和环境要求和上述要求大致保持一致!!!

2.2.2、环境搭建

前提是要拥有一个云服务器,我购买的是阿里云轻量级服务器,自己玩够用了,当然如果没条件也可以自己在本地使用VMware一样效果。

如果想购买云服务器,传送门:https://blog.csdn.net/qq_52596258/article/details/121290659

1)使用远程链接工具(Tabby)和SFTP工具将其上传到服务器上:

在这里插入图片描述

2)解压

# 解压
unzip rocketmq-all-4.5.0-bin-release.zip# 将解压包,移动到指定路径下
mv rocketmq-all-4.5.0-bin-release ../software

3)参数配置

runserver.sh

runbroker.sh

tools.sh

上述配置文件的jvm参数和windows下的配置保持一致即可!!!

云服务器需要在broker.conf文件最下面添加如下配置:

brokerIP = 服务器公网IP# eg
brokerIP = 106.15.0.30

4)操作指令【bin目录下】

# 启动 nameserver
nohup sh mqnamesrv -n 106.15.0.30:9876 &# 启动 broker
nohup sh mqbroker -n 106.15.0.30:9876 -c ../conf/broker.conf autoCreateTopicEnable=true &# 查看进程
jps -l

在这里插入图片描述

# 关闭服务
sh mqshutdown namesrv
sh mqshutdown broker

2.2.3、测试

1)启动Producer【发送消息】

# 生产者
sh tools.sh org.apache.rocketmq.example.quickstart.Producer

在这里插入图片描述

2)启动Consumer【接收消息】

# 消费者
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer

在这里插入图片描述

Linux下搭建成功!

3、安装可视化控制台

1)下载

RocketMQ提供了UI管理工具,名为rocketmq-console,项目地址:https://github.com/apache/rocketmq-externals/tree/master/rocketmq-console

这个是rocketmq的扩展,里面不仅包含控制台的扩展,也包含对大数据flume、hbase等组件的对接和扩展。

在这里插入图片描述

2)上传解压

为了演示服务器版搭建,我直接下载上传至云服务器:

在这里插入图片描述

# 解压
unzip rocketmq-console.zip# 移动到software目录下
mv rocketmq-console ../software

3)修改配置参数

修改rocketmq-console\src\main\resources\application.properties配置文件

在这里插入图片描述

4)打包

进入rocketmq-console目录下

打开cmd窗口执行:

mvn clean package ‐Dmaven.test.skip=true

5)启动

进入/rocketmq-console/target目录下执行:

# 指定端口号和命名空间地址
java -jar rocketmq-console-ng-1.0.1.jar --server.port=9877 --rocketmq.config.namesrvAddr=106.15.0.30:9876

在这里插入图片描述

虽然console启动成功,想控制台不报错误日志,必须先启动namesrvbroker,让console连接上命名空间和broker

6)访问

http://106.15.0.30:9877

如果无法访问,很有可能是服务器的防火墙没有开放端口号,步骤如下:

# 查看防火墙状态
systemctl status firewalld# 关闭防火墙
systemctl stop firewalld# 启动防火墙
systemctl start firewalld# 永久开放指定端口号【把用到的端口号都开放】
firewall-cmd --zone=public --add-port=10909/tcp --permanent
firewall-cmd --zone=public --add-port=10911/tcp --permanent
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --zone=public --add-port=9877/tcp --permanent# 重新加载防火墙
firewall-cmd --reload# 或者重启防火墙
systemctl restart firewalld.service# 查看防火墙信息列表
firewall-cmd --list-all# 只查看防火墙开放端口号列表
firewall-cmd --list-ports

在这里插入图片描述

防火墙端口号开放之后,同时也要在ECS服务器安全组中添加端口规则:

在这里插入图片描述

入方向和出方向最好都添加上。

再次访问:http://106.15.0.30:9877

如果还不行,那这个时候不要着急,着急也没有用,我们先来理下思路,

  1. 防火墙端口号打开了
  2. 安全组规则添加了

还访问不了,是不是还有防火墙,果然上网搜索,发现阿里云服务器还有一层防火墙iptables,应该是默认配置的,如何关闭或者在这层防火墙也开放端口号,步骤如下:

# 查看防火墙状态出现的问题
service iptables status# 关闭防火墙
service iptables stop

如果上述命令报错,可能是没有安装iptable,但是默认确实有这一层防火墙的。

解决办法:打开阿里云进入轻量级服务器界面,左边菜单栏有一个防火墙tab,这个代表的就是iptable,直接在这添加端口开放规则

在这里插入图片描述

再次访问:http://106.15.0.30:9877

在这里插入图片描述

大功告成,访问成功,撒花!!!


在这里插入图片描述


相关文章:

RocketMQ云服务器和本地基础安装搭建及可视化控制台安装使用

一起学编程,让生活更随和! 如果你觉得是个同道中人,欢迎关注博主gzh:【随和的皮蛋桑】。 专注于Java基础、进阶、面试以及计算机基础知识分享🐳。偶尔认知思考、日常水文🐌。 目录一、RocketMQ 介绍1、Ro…...

JavaScript:简单理解防抖和节流,如何定义防抖和节流函数?

防抖 防抖函数,就是防止抖动,避免事件重复触发。比如监听输入框的输入,不应该在用户每输入一个字符就触发监听,而是在用户输入结束后再来监听。 流程为: 1、事件触发; 2、开启定时器; 3、当事…...

【opencv 系列】第3章 图像的8种变换

文章目录前言上代码1.1 复习读取和显示1.2 图像放大、缩小 cv2.resize()1.3 图像平移1.4 图像旋转1.5 图像仿射变换1.6 图像的裁剪1.7 位运算(AND, OR, XOR)1.8 图像的分离和融合1.9 颜色空间 color space前言 坦白说,这一章我认为是整个opencv系列最难的一张&…...

【C语言刷题】倒置字符串

解题思路与过程📽️解题思路📽️解题过程🔧1.输入🔧2.设计逆序函数🔧3.逆序整个字符串🔧4.逆序每个单词📽️源码📷先来看题👇📽️解题思路 🔴 首先…...

用switch语句编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:

用switch语句编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:操作数1 运算符op 操作数2计算表达式的值,指定的算术运算符为加()、减(-)、乘(*)、除&#…...

uboot编译分析

uboot编译分析 V 1 –> Q ,在一行命令前面加上表示不会在终端输出命令 KCONFIG_CONFIG ? .config.config 默认是没有的,默认是需要使用命令“make xxx_defconofig”先对uboot进行配置,配置完成就会在uboot根目录下生成.config。如果后续自行调整…...

SpringCloud Alibaba集成Dubbo实现远程服务间调用

SpringCloud Alibaba集成Dubbo实现远程服务间调用 工程创建 一、创建springBoot分模块项目,父工程:springcloud-alibaba以及子模块product-dubbo-provider、order-dubbo-consumer等 项目基本结构图如下所示: 二、依赖引入 在以上两个子模块…...

网络编程(一)

网络编程 文章目录网络编程前置概念1- 字节序高低地址与高低字节高低地址:高低字节字节序大端小端例子代码判断当前机器是大端还是小端为何要有字节序字节序转换函数需要字节序转换的时机例子一例子二2- IP地址转换函数早期(不用管)举例现在与字节序转换函数相比:**…...

PVE硬件直通之强制IOMMU分组

文章目录检查是否直接支持IOMMU分组配置IOMMU分组不直接支持的需要更新内核参考检查是否直接支持IOMMU分组 下面 以SATA控制器为例,看pci设备是否可以直接支持IOMMU分组 /* 打印pci设备详细信息*/ lspci -vv /* 找到SATA controller 段落*/ 16:00.1 SATA controll…...

深入讲解Kubernetes架构-node

Kubernetes 通过将容器放入在节点(Node)上运行的 Pod 中来执行你的工作负载。 节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。 每个节点包含运行 Pod 所需的服务; 这些节点由控制面负责管理。通常集群中会有若干个节点…...

XSS-labs-master

XSS 经典14关这边先说一下常用的弹窗手法<script>alert(1)</script> <script>confirm(1)</script> <script>alert(1)</script> <script>alert(/1/zyl)</script> <script>alert(document.cookie)</script> <scr…...

「可信计算」助力TLS 传输更安全

序言背景&#xff08;Satuation&#xff09;&#xff1a;TLS 是 TCP/IP 上的传输层安全协议&#xff0c;保护着数以亿万级的数据安全&#xff0c;我们在浏览器中输入的 https&#xff0c;就是受到 TLS 保护的。冲突&#xff08;complication&#xff09;&#xff1a;从可信计算…...

链表学习基础

链表 通过指针串联在一起的线性结构&#xff0c;每个节点由数据域和指针域两部分组成。链表节点在内存中的存储通常不是连续的&#xff0c;各节点通过指针连接在一起&#xff0c;其内存分布大致如下图所示。 定义 单链表 struct ListNode {// DATATYPE 可以是任意存放数据的…...

springboot整合阿里云oss文件服务器

springboot整合阿里云oss文件服务器一、申请Bucket二、 获取AccessKey ID、AccessKey Secret三、 springboot整合3.1 在application.yml 配置参数3.2 oss需要的pom3.3 配置 oss配置类3.4 oss的controller类3.5 oss的service类以及impl一、申请Bucket 进入该网址对象存储oss述 …...

数据分析:旅游景点销售门票和消费情况分析

数据分析&#xff1a;旅游景点销售门票和消费情况分析 文章目录数据分析&#xff1a;旅游景点销售门票和消费情况分析一、前言二、数据准备三、分析数据四、用户购买门票数量分析五、用户复购分析六、用户回购分析七、占比分析1.每个月分层用户占比情况。2.每月不同用户的占比3…...

Android问题解决方案(一):Android 打空包后提示没有”android:exported“的属性设置

Android 打空包后提示没有”android:exported“的属性设置Android 打空包后提示没有”android:exported“的属性设置1、问题&#xff1a;2、文档3、参考链接&#xff1a;4、解决方案&#xff1a;Android 打空包后提示没有”android:exported“的属性设置 1、问题&#xff1a; …...

Portraiture2023最新版人像图像后期处理软件

2023全新发布Portraiture 4是专注于图像后期处理软件研发的 Imagenomic, LLC产品之一&#xff0c;在摄影爱好者中有点影响力。Portraiture可以将繁琐复杂的人像磨皮操作极致简化&#xff0c;不论是普通爱好者或专业后期处理人员&#xff0c;均能一键完成。凭借优秀的AI算法和多…...

链表OJ(七)删除有序链表中重复的元素-I -II

目录 删除有序链表中重复的元素-I 删除有序链表中重复的元素-II 删除有序链表中重复的元素-I 描述 删除给出链表中的重复元素&#xff08;链表中元素从小到大有序&#xff09;&#xff0c;使链表中的所有元素都只出现一次 例如&#xff1a; 给出的链表为1→1→21→1→2,返回1…...

C语言经典编程题100例(81~100)

目录81、习题7-7 字符串替换82、习题8-10 输出学生成绩83、习题8-2 在数组中查找指定元素84、习题8-3 数组循环右移85、题8-9 分类统计各类字符个数86、习题9-2 计算两个复数之积87、习题9-6 按等级统计学生成绩88、习题11-1 输出月份英文名89、习题11-2 查找星期90、练习10-1 …...

ChIP-seq 分析:数据质控实操(5)

1. 数据 今天将继续回顾我们在上一次中研究的 Myc ChIPseq。这包括用于 MEL 和 Ch12 细胞系的 Myc ChIPseq 及其输入对照。 可在此处[1]找到 MEL 细胞系中 Myc ChIPseq 的信息和文件可在此处[2]找到 Ch12 细胞系中 Myc ChIPseq 的信息和文件可以在此处[3]找到 MEL 细胞系的输入…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...