RocketMQ部署 Linux方式和Docker方式
一、Linux部署
准备一台Linux机器,部署单master rocketmq节点
系统 | ip | 角色 | 模式 |
---|---|---|---|
CENTOS | 10.4.7.126 | Nameserver,broker | Master |
1. 配置JDK
rocketmq运行需要依赖jdk,安装步骤略。
2. 下载和配置
- 从官网下载安装包 https://rocketmq.apache.org/zh/download/ ,并上传到CENTOS系统中,并进行解压

cd /data
# 解压
unzip rocketmq-all-5.1.3-bin-release.zip
# 创建目录软链接
ln -s rocketmq-all-5.1.3-bin-release rocketmq
# 创建目录
# 消息存储及位点目录mkdir -p /data/rocketmq/storemkdir -p /data/rocketmq/store/commitlogmkdir -p /data/rocketmq/store/consumequeuemkdir -p /data/rocketmq/store/index
# 创建日志目录mkdir -p /data/rocketmq/logs
# 进入配置文件目录并替换日志配置文件中的日志目录的位置
cd /data/rocketmq/conf && sed -i 's#${user.home}#/data/rocketmq#g' *.xml
修改rocketmq启动所需配置文件
# 进入rocketmq自带的配置文件目录
[root@mq-126 conf]# cd /data/rocketmq/conf/
[root@mq-126 conf]# ls
# 2master 2slave 异步消息同步配置目录
2m-2s-async
# 2master 2slave 同步消息同步配置目录
2m-2s-sync
# 2master no slave 配置目录
2m-noslave
# 单点配置目录
broker.conf
container
controller
dledger
plain_acl.yml
# 日志配置文件
rmq.broker.logback.xml
rmq.client.logback.xml
rmq.controller.logback.xml
rmq.namesrv.logback.xml
rmq-proxy.json
rmq.proxy.logback.xml
rmq.tools.logback.xml
tools.yml
[root@mq-126 conf]# vi broker.conf
将下面的配置赋值到broker.conf中
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker 名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer 地址,分号分割
namesrvAddr=127.0.0.1:9876
#在发送消息时,自动创建服务器不存在的 topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4 点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog 每个文件的大小默认 1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/data/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store/consumequeue #消息索引存储路径
storePathIndex=/data/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/data/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制 Master
#- SYNC_MASTER 同步双写 Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
修改启动脚本的jvm参数,找到对应行进行修改,原配置设置的内存太大,我的虚拟机是1g内存的,会无法正常启动,需要改小。
-
vim /data/rocketmq/bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
-
vim /data/rocketmq/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
3. 启动
-
启动nameserver
[root@mq-126 rocketmq]# nohup sh /data/rocketmq/bin/mqnamesrv &[root@mq-126 rocketmq]# jps 2617 NamesrvStartup 2654 Jps [root@mq-126 rocketmq]# netstat -ano | grep 9876 tcp6 0 0 :::9876 :::* LISTEN off (0.00/0/0) tcp6 0 0 10.4.7.126:9876 10.4.7.126:53946 ESTABLISHED off (0.00/0/0) tcp6 0 0 10.4.7.126:9876 10.4.7.125:42368 ESTABLISHED off (0.00/0/0) tcp6 0 0 10.4.7.126:53946 10.4.7.126:9876 ESTABLISHED off (0.00/0/0)
-
启动broker
[root@mq-126 bin]# nohup sh /data/rocketmq/bin/mqbroker -c /data/rocketmq/conf/broker.conf & [2] 2829 [root@mq-126 bin]# jps 2796 NamesrvStartup 2861 BrokerStartup 2893 Jps
-
启动dashboard
启动dashboard最快的方式是通过docker进行启动。
[root@mq-126 bin]# systemctl start docker [root@mq-126 bin]# docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=10.4.7.126:9876" -p 8080:8080 -t apacherocketmq/rocketmq-dashboard:latest d55cb8b7ff0e9d19964c2019eaf4bba8301cfc2cf1b8a3eb01bff09df134f90e
然后就可以访问dashboard了
如果没有docker环境 在官网下下载源码包,使用maven编译后进行启动
https://rocketmq.apache.org/zh/download/
4. 发送和消费测试代码
Producer
package cn.shutdown.mq;import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;/*** 消息生产者* @author Domino.J* @date 2023/8/11*/
public class Producer {public static final String NAMESRV_ADDR = "10.4.7.126:9876";public static void main(String[] args)throws MQClientException, MQBrokerException, RemotingException, InterruptedException {DefaultMQProducer producer = new DefaultMQProducer("test_quick_producer_name");producer.setNamesrvAddr(NAMESRV_ADDR);producer.start();for (int i = 0; i < 1000; i++) {Message message = new Message("test_quick_topic",//主题"TagA", //标签"KeyA" + i, //用户自定义的key,唯一的标识("Hello RocketMQ" + i).getBytes());//消息内容//发送消息SendResult sr = producer.send(message);System.out.println("消息发送结果:" + sr);Thread.sleep(1000);}producer.shutdown();}
}
Consumer
package cn.shutdown.mq;import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;import java.util.List;/*** 消息消费者* @author Domino.J* @date 2023/8/11*/
public class Consumer {public static final String NAMESRV_ADDR = "10.4.7.126:9876";public static void main(String[] args) throws MQClientException {DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_quick_consumer_name");consumer.setNamesrvAddr(NAMESRV_ADDR);consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);consumer.subscribe("test_quick_topic", "*");consumer.registerMessageListener(new MessageListenerConcurrently() {@Overridepublic ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {MessageExt me = msgs.get(0);try {String topic = me.getTopic();String tags = me.getTags();String keys = me.getKeys();String msgBody = new String(me.getBody(), RemotingHelper.DEFAULT_CHARSET);System.err.println("topic: " + topic + ",tags: " + tags + ", keys: " + keys + ",body: " + msgBody);} catch (Exception e) {e.printStackTrace();return ConsumeConcurrentlyStatus.RECONSUME_LATER;}return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});consumer.start();System.err.println("consumer start...");}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.shutdown</groupId><artifactId>rocketmq-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>rocketmq-demo</name><description>rocketmq-demo</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client-java</artifactId><version>5.0.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.1.3</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>cn.shutdown.mq.RocketmqDemoApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>
运行结果


二、Docker Compose部署
1. 拉取镜像
拉取 rocketmq镜像
docker pull apache/rocketmq:5.1.3
拉取 rocketmq dashboard镜像
docker pull apacherocketmq/rocketmq-dashboard:latest
2. 创建挂载目录,拷贝挂载文件
-
创建Nameserver需要的挂载目录并拷贝挂载文件
# 日志目录 mkdir /data/opt/rocketmq/nameserver/logs -p # 脚本目录 mkdir /data/opt/rocketmq/nameserver/bin -p
设置权限:如果不设置会导致NameServer容器内部无法写日志文件
# 777 文件所属者、文件所属组和其他人有读取 & 写入 & 执行全部权限。rwxrwxrwx chmod 777 -R /data/opt/rocketmq/nameserver/*
正如使用Linux部署一样,需要修改JAVA_OPT配置,这里需要从rocketmq容器中复制出一份运行文件,修改后再挂载到新启动的容器上。另外,NameServer启动脚本中有一个自动计算最大堆内存和新生代内存的函数会导致在不同硬件环境下设置最大堆内存和新生代内存环境变量不被应用,,这里先提前copy一份容器内部启动脚本做挂载,如果想自定义内存可以自己调整。
启动临时rocketmq容器
docker run -d \ --privileged=true \ --name rmqnamesrv \ apache/rocketmq:5.1.3 sh mqnamesrv
复制容器内的文件到挂载目录中
[root@mq-126 bin]# docker cp rmqnamesrv:/home/rocketmq/rocketmq-5.1.3/bin/ /data/opt/rocketmq/nameserver/ [root@mq-126 bin]# ls cachedog.sh mqbroker.numanode0 os.sh cleancache.sh mqbroker.numanode1 play.cmd cleancache.v1.sh mqbroker.numanode2 play.sh controller mqbroker.numanode3 README.md dledger mqcontroller runbroker.cmd docker-entrypoint.sh mqcontroller.cmd runbroker.sh export.sh mqnamesrv runserver.cmd mqadmin mqnamesrv.cmd runserver.sh mqadmin.cmd mqproxy setcache.sh mqbroker mqproxy.cmd startfsrv.sh mqbroker.cmd mqshutdown tools.cmd mqbrokercontainer mqshutdown.cmd tools.sh
修改 runserver.sh,把 calculate_heap_sizes 这句注释掉,
# 注释掉以下这句 # calculate_heap_sizes# Dynamically calculate parameters, for reference.
然后停止并删除容器
docker stop rmqnamesrv && docker rm rmqnamesrv
-
创建Broker需要挂载的文件夹和文件
# 创建需要的挂载目录 mkdir /data/opt/rocketmq/broker/logs -p mkdir /data/opt/rocketmq/broker/data -p mkdir /data/opt/rocketmq/broker/conf -p mkdir /data/opt/rocketmq/broker/bin -p mkdir /data/opt/rocketmq/broker/store -p
给目录赋权限
# 777 文件所属者、文件所属组和其他人有读取 & 写入 & 执行全部权限。rwxrwxrwx chmod 777 -R /data/opt/rocketmq/broker/*
启动临时容器
docker run -d \ --name rmqbroker \ --privileged=true \ apache/rocketmq:5.1.3 \ sh mqbroker
拷贝运行文件
[root@mq-126 bin]# docker cp rmqbroker:/home/rocketmq/rocketmq-5.1.3/bin/ /data/opt/rocketmq/broker/ Successfully copied 110kB to /data/opt/rocketmq/broker/ [root@mq-126 bin]# ls cachedog.sh mqbroker.numanode0 os.sh cleancache.sh mqbroker.numanode1 play.cmd cleancache.v1.sh mqbroker.numanode2 play.sh controller mqbroker.numanode3 README.md dledger mqcontroller runbroker.cmd docker-entrypoint.sh mqcontroller.cmd runbroker.sh export.sh mqnamesrv runserver.cmd mqadmin mqnamesrv.cmd runserver.sh mqadmin.cmd mqproxy setcache.sh mqbroker mqproxy.cmd startfsrv.sh mqbroker.cmd mqshutdown tools.cmd mqbrokercontainer mqshutdown.cmd tools.sh
修改 runbroker.sh,把 calculate_heap_sizes 这句注释掉,
# 注释掉以下这句 # calculate_heap_sizes# Dynamically calculate parameters, for reference.
拷贝配置文件
[root@mq-126 conf]# docker cp rmqbroker:/home/rocketmq/rocketmq-5.1.3/conf/ /data/opt/rocketmq/broker/ Successfully copied 145kB to /data/opt/rocketmq/broker/ [root@mq-126 conf]# ls 2m-2s-async dledger rmq-proxy.json 2m-2s-sync plain_acl.yml rmq.proxy.logback.xml 2m-noslave rmq.broker.logback.xml rmq.tools.logback.xml broker.conf rmq.client.logback.xml tools.yml container rmq.controller.logback.xml controller rmq.namesrv.logback.xml
修改 broker.conf
# 集群名称 brokerClusterName = DefaultCluster # 节点名称 brokerName = broker-a # broker id节点ID, 0 表示 master, 其他的正整数表示 slave,不能小于0 brokerId = 0 # Broker服务地址 String 内部使用填内网ip,如果是需要给外部使用填公网ip brokerIP1 = 10.4.7.125 # Broker角色 brokerRole = ASYNC_MASTER # 刷盘方式 flushDiskType = ASYNC_FLUSH # 在每天的什么时间删除已经超过文件保留时间的 commit log,默认值04 deleteWhen = 04 # 以小时计算的文件保留时间 默认值72小时 fileReservedTime = 72 # 是否允许Broker 自动创建Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true # 是否允许Broker自动创建订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true
停止并删除临时的broker容器
docker stop rmqbroker && docker rm rmqbroker
3. 准备Docker Compose 文件
在/data/opt/rocketmq
目录创建docker-compose.yml文件
version: '3.8'
services:rmqnamesrv:image: apache/rocketmq:5.1.3container_name: rmqnamesrvports:- 9876:9876restart: alwaysprivileged: truevolumes:- /data/opt/rocketmq/nameserver/logs:/home/rocketmq/logs- /data/opt/rocketmq/nameserver/bin/runserver.sh:/home/rocketmq/rocketmq-5.1.3/bin/runserver.shenvironment:- MAX_HEAP_SIZE=256M- HEAP_NEWSIZE=128Mcommand: ["sh","mqnamesrv"]broker:image: apache/rocketmq:5.1.3container_name: rmqbrokerports:- 10909:10909- 10911:10911- 8081:8081restart: alwaysprivileged: truevolumes:- /data/opt/rocketmq/broker/logs:/home/rocketmq/logs- /data/opt/rocketmq/broker/store:/home/rocketmq/store- /data/opt/rocketmq/broker/conf/broker.conf:/home/rocketmq/broker.conf- /data/opt/rocketmq/broker/bin/runbroker.sh:/home/rocketmq/rocketmq-5.1.3/bin/runbroker.shdepends_on:- 'rmqnamesrv'environment:- NAMESRV_ADDR=rmqnamesrv:9876- MAX_HEAP_SIZE=512M- HEAP_NEWSIZE=256Mcommand: ["sh","mqbroker","-c","/home/rocketmq/broker.conf","--enable-proxy"]rmqdashboard:image: apacherocketmq/rocketmq-dashboard:latestcontainer_name: rocketmq-dashboard-latestports:- 8080:8080restart: alwaysprivileged: truedepends_on:- 'rmqnamesrv'environment:- JAVA_OPTS= -Xmx256M -Xms256M -Xmn128M -Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
使用docker compose 命令启动
[root@mq_125 rocketmq]# vi docker-compose.yml
[root@mq_125 rocketmq]# docker compose up -d
[+] Building 0.0s (0/0)
[+] Running 3/3✔ Container rmqnamesrv Started 0.7s✔ Container rocketmq-dashboard-latest Started 2.6s✔ Container rmqbroker Started
4. 发送和消费消息测试
测试代码与linux部署相同
相关文章:

RocketMQ部署 Linux方式和Docker方式
一、Linux部署 准备一台Linux机器,部署单master rocketmq节点 系统ip角色模式CENTOS10.4.7.126Nameserver,brokerMaster 1. 配置JDK rocketmq运行需要依赖jdk,安装步骤略。 2. 下载和配置 从官网下载安装包 https://rocketmq.apache.org/zh/downlo…...

css内容达到最底部但滚动条没有滚动到底部
也是犯了一个傻狗一样的错误 ,滚动条样式是直接复制的蓝湖的代码,有个高度,然后就出现了这样的bug 看了好久一直以为是布局或者overflow的问题,最后发现是因为我给这个滚动条加了个高度,我也是傻狗一样的,…...

机器学习深度学习——transformer(机器翻译的再实现)
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——自注意力和位置编码(数学推导代码实现) 📚订阅专栏:机器…...
神经网络基础-神经网络补充概念-30-搭建神经网络块
概念 搭建神经网络块是一种常见的做法,它可以帮助你更好地组织和复用网络结构。神经网络块可以是一些相对独立的模块,例如卷积块、全连接块等,用于构建更复杂的网络架构。 代码实现 import numpy as np import tensorflow as tf from tens…...

在线吉他调音
先看效果(图片没有声,可以下载源码看看,比这更好~): 再看代码(查看更多): <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…...

Windows11 Docker Desktop 启动 -wsl kernel version too low
系统环境:windows11 1:docker下载 Docker: Accelerated Container Application Development 下载后双击安装即可 安装后启动Docker提示:Docker Desktop -wsl kernel version too low 处理起来也是非常方便 1:管理员身份启动:…...
Golang 中的 unsafe 包详解
Golang 中的 unsafe 包用于在运行时进行低级别的操作。这些操作通常是不安全的,因为可以打破 Golang 的类型安全性和内存安全性,使用 unsafe 包的程序可能会影响可移植性和兼容性。接下来看下 unsafe 包中的类型和函数。 unsafe.Pointer 类型 通常用于…...
linux 的swap、swappiness及kswapd原理【转+自己理解】
本文讨论的 swap基于Linux4.4内核代码 。Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。 希望本文能让读者了解Linux对swap的使用大概是什么样子。阅读完本文,应该可以帮你解决以下问题: swap到底是干嘛的…...
什么是Java中的适配器模式?
Java中的适配器模式(Adapter Pattern)是一种设计模式,它允许我们将一种类的接口转换成另一种类的接口,以便于使用。适配器模式通常用于在不兼容的接口之间提供一种过渡性的接口,从而使代码更加灵活和可维护。 在Java中…...
MYSQL线上无锁添加索引
在需求上线过程中,经常会往一个数据量比较大的数据表中的字段加索引,一张几百万数据的表,加个索引往往要几分钟起步。在这段时间内,保证服务的正常功能运行十分重要,所以需要线上无锁添加索引,即加索引的语…...

如何实现客户自助服务?打造产品知识库
良好的客户服务始于自助服务。根据哈佛商业评论,81% 的客户在联系工作人员之前尝试自己解决问题。92% 的客户表示他们更喜欢使用产品知识库/帮助中心。 所以本文主要探讨了产品知识库是什么,有哪些优势以及如何创建。 产品知识库是什么 产品知识库是将…...
LeetCode环形子数组的最大和(编号918)
目录 一.题目 二.解题思路 三.解题代码 一.题目 918. 环形子数组的最大和 给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[…...
PhpOffice/PhpSpreadsheet读取和写入Excel
PhpSpreadsheet是一个纯PHP编写的组件库,它使用现代PHP写法,代码质量和性能比PHPExcel高不少,完全可以替代PHPExcel(PHPExcel已不再维护)。使用PhpSpreadsheet可以轻松读取和写入Excel文档,支持Excel的所有…...
jenkins自动化部署Jenkinsfile文件配置
简介 使用jenkins部署时会读取项目中Jenkinsfile文件,文件配置不对会导致部署失败 文件内容 pipeline {agent anyparameters {string(name: project_name, defaultValue: xxx1, description: 项目jar名称)string(name: version, defaultValue: xxx2, description…...

【socket编程简述】TCP UDP 通信总结、TCP连接的三次握手、TCP断开的四次挥手
Socket:Socket被称做 套接字,是网络通信中的一种约定。 Socket编程的应用无处不在,我们平时用的QQ、微信、浏览器等程序.都与Socket编程有关。 三次握手 四次断开 面试可…...

多线程-死锁
/*** 死锁demo*/ public class DeadlockDemo {public static void main(String[] args) {// 创建两个对象final Object resource1 "resource1";final Object resource2 "resource2";// 创建第一个线程Thread t1 new Thread(() -> {// 尝试锁定resour…...
P1006 [NOIP2008 提高组] 传纸条
P1006 [NOIP2008 提高组] 传纸条 题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路四维dp三维dp AC四维代码:AC三维代码: 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中&#…...

杭电比赛总结
我们的队伍:team013 另外两队:team014、team015 今天是我第一次打杭电,发现杭电多数都是猜结论题 先给一下我们的提交数据 Submit TimeProblem IDTimeMemoryJudge Status4:59:59101115 MS1692 KWrong Answer4:59:55101115 MS1684 KWrong…...

dom靶场
靶场下载地址: https://www.vulnhub.com/entry/domdom-1,328/ 一、信息收集 获取主机ip nmap -sP 192.168.16.0/24netdiscover -r 192.168.16.0/24端口版本获取 nmap -sV -sC -A -p 1-65535 192.168.16.209开放端口只有80 目录扫描 这里扫描php后缀的文件 g…...
go struct 的常见问题
go struct 的常见问题 1. 什么是struct?2. 如何声明、定义和创建一个struct?3. struct和其他数据类型(如数组、切片、map等)有什么区别?4. 如何访问struct字段?5. struct是否支持继承,是否支持重…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...