【RocketMQ 系列三】RocketMQ集群搭建(2m-2s-sync)

news2024/11/28 2:52:32

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。
❤️ 3. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 4. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 5. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门

文章目录

    • 一、集群特点
    • 二、服务器环境
      • 1.1.部署架构
      • 1.2.服务器信息
      • 1.3.配置Host (两台服务器都需要)
      • 1.4. 安装jdk(两台服务器都需要)
      • 1.5. 关闭防火墙(两台服务器都需要)
      • 1.6. 创建数据存储目录(两台服务器都需要)
    • 三、下载与安装配置
      • 2.1.下载rocketmq并解压(两天服务器都要)
      • 2.2. 环境变量配置(两台服务器都需要)
      • 2.3. 配置 rocketmq broker-a (在Master1上操作)
      • 2.4. 配置 rocketmq broker-b-s (在Slave2上配置)
      • 2.5. 配置 rocketmq broker-b.properties(在Master2上操作)
      • 2.6. 配置rocketmq broker-a-s.properties(在Slave1上操作)
      • 2.7. 测试环境JVM配置(两台机器都要执行)
      • 2.8. 生产环境JVM配置
    • 四、启动集群
      • 3.1.启动nameserver((两台机器上都执行)
      • 3.2.启动broker
      • 3.3.测试集群生产消费情况
      • 3.5. 关闭命令
    • 五、问题总结
    • 六、安装管理面板

一、集群特点

image-20230924162430614

  1. NameServer是一个几乎无状态的节点,可集群部署,节点之间不会互相通信。
  2. Broker部署相对比较复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master。Master与Slave可以通过指定相同的BrokerName,不同的BrokerId来区分,BrokerId为0表示Master,BrokerId大于0表示Slave。
  3. Producer与NameServer集群中的其中一个节点(随机选择)建立长链接,定期从NameServer取Topic路由信息,并向Topic服务的Master建立长链接(也就是说根据Topic的路由信息找到向哪个Broker发送消息),且定时向Master发送心跳,Producer完全无状态,可集群部署。
  4. Consumer与NameServer集群中的其中一个节点(随机选择)建立长链接,定期从NameServer取Topic路由信息,并向Topic服务的Master,Slave建立长链接,且定时向Master,Slave发送心跳,Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅关系由Broker配置决定。

二、服务器环境

1.1.部署架构

使用的模式是 2m-2s-sync,双主双从,同步复制

1.2.服务器信息

IP角色架构模式
192.31.186.198nameserver,brokermaster1,slave2
192.31.184.89nameserver,brokermaster2,slave1

1.3.配置Host (两台服务器都需要)

  1. nameserver机器信息

    #nameserver
    172.31.186.180 rocketmq-nameserver1
    172.31.184.89  rocketmq-nameserver2
    #broker 机器信息
    172.31.186.180  rocketmq-master1
    172.31.186.180  rocketmq-slave2
    172.31.184.89  rocketmq-master2
    172.31.184.89  rocketmq-slave1
    

    配置完成之后,重启网卡。

    systemctl restart network
    

1.4. 安装jdk(两台服务器都需要)

安装jdk-8u192-linux-x64.rpm,此处省略。

1.5. 关闭防火墙(两台服务器都需要)

首先查看防火墙的状态,如果状态是 active 则表示防火墙开启

$ systemctl status firewalld

关闭防火墙

$ systemctl stop firewalld

1.6. 创建数据存储目录(两台服务器都需要)

  1. 创建master节点的存储路径
mkdir -p /data/server/feige/rocketmq/store
mkdir -p /data/server/feige/rocketmq/store/commitlog
mkdir -p /data/server/feige/rocketmq/store/consumequeue
mkdir -p /data/server/feige/rocketmq/store/index
  1. 创建slave节点的存储路径

    mkdir -p /data/server/feige/rocketmq/store-s
    mkdir -p /data/server/feige/rocketmq/store-s/commitlog
    mkdir -p /data/server/feige/rocketmq/store-s/consumequeue
    mkdir -p /data/server/feige/rocketmq/store-s/index
    

三、下载与安装配置

2.1.下载rocketmq并解压(两天服务器都要)

cd /data/server/feige
wget https://archive.apache.org/dist/rocketmq/5.1.3/rocketmq-all-5.1.3-bin-release.zip
unzip rocketmq-all-5.1.3-bin-release.zip -d /data/server/feige/rocketmq
cd /data/server/feige/rocketmq/rocketmq-all-5.1.3-bin-release

2.2. 环境变量配置(两台服务器都需要)

vim /etc/profile

在profile文件的末尾加入如下命令:

ROCKETMQ_HOME=/data/server/feige/rocketmq/rocketmq-all-5.1.3-bin-release
PATH=$PATH:$ROCKETMQ_HOME/bin
export ROCKETMQ_HOME PATH

​ 执行 source /etc/profile 使文件生效

2.3. 配置 rocketmq broker-a (在Master1上操作)

vim conf/2m-2s-sync/broker-a.properties

在此配置文件中添加,master默认的端口是10911。

#所属集群名称
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样;主从节点一样,也就是这个值区分broker组的;
brokerName=broker-a
#主从标识:0 表示Master, >0 表示Slave;同一个组中区分主从的标识,只能有一个主;
brokerId=0
#当前broker监听的IP
brokerIP1=172.31.186.180
#用于HA主从同步
brokerIP2=172.31.186.180
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
haListenPort=10912
#删除长期无用文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间(h),默认48小时
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间使用率
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/server/feige/rocketmq/store
#commitLog存储路径
storePathCommitLog=/data/server/feige/rocketmq/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/data/server/feige/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/data/server/feige/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckPoint=/data/server/feige/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/data/server/feige/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#broker角色
#- ASYNC_MASTER    异步复制Master
#- SYNC_MASTER     同步双写Master
#- SLAVE    从节点
brokerRole=SYNC_MASTER
#刷盘策略
#- ASYNC_FLUSH    异步刷盘
#- SYNC_FLUSH     同步刷盘
flushDiskType=ASYNC_FLUSH

2.4. 配置 rocketmq broker-b-s (在Slave2上配置)

这里为了避免与master的端口冲突,将slave的默认端口改成11011,另外还需要将从节点broker的存储路径改下,不能与master节点共用。

#所属集群名称
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#主从标识:0 表示Master, >0 表示Slave
brokerId=1
#当前broker监听的IP
brokerIP1=172.31.186.180
#用于HA主从同步
brokerIP2=172.31.186.180
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
haListenPort=11012
#删除长期无用文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间(h),默认48小时
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/server/feige/rocketmq/store-s
#commitLog存储路径
storePathCommitLog=/data/server/feige/rocketmq/store-s/commitlog
#消费队列存储路径
storePathConsumeQueue=/data/server/feige/rocketmq/store-s/consumequeue
#消息索引存储路径
storePathIndex=/data/server/feige/rocketmq/store-s/index
#checkpoint 文件存储路径
storeCheckPoint=/data/server/feige/rocketmq/store-s/checkpoint
#abort 文件存储路径
abortFile=/data/server/feige/rocketmq/store-s/abort
#限制的消息大小
maxMessageSize=65536
#broker角色
#- ASYNC_MASTER    异步复制Master
#- SYNC_MASTER     同步双写Master
#- SLAVE    从节点
brokerRole=SLAVE
#刷盘策略
#- ASYNC_FLUSH    异步刷盘
#- SYNC_FLUSH     同步刷盘
flushDiskType=ASYNC_FLUSH

2.5. 配置 rocketmq broker-b.properties(在Master2上操作)

执行

vim conf/2m-2s-sync/broker-b.properties

在此配置文件中添加:master默认的端口是10911。

#所属集群名称
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#主从标识:0 表示Master, >0 表示Slave
brokerId=0
#当前broker监听的IP
brokerIP1=172.31.184.89
#用于HA主从同步
brokerIP2=172.31.184.89
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
haListenPort=10912
#删除长期无用文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间(h),默认48小时
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/server/feige/rocketmq/store
#commitLog存储路径
storePathCommitLog=/data/server/feige/rocketmq/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/data/server/feige/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/data/server/feige/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckPoint=/data/server/feige/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/data/server/feige/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#broker角色
#- ASYNC_MASTER    异步复制Master
#- SYNC_MASTER     同步双写Master
#- SLAVE    从节点
brokerRole=SYNC_MASTER
#刷盘策略
#- ASYNC_FLUSH    异步刷盘
#- SYNC_FLUSH     同步刷盘
flushDiskType=ASYNC_FLUSH

2.6. 配置rocketmq broker-a-s.properties(在Slave1上操作)

vim conf/2m-2s-sync/broker-a-s.properties

在此配置文件中添加:将slave的默认端口改成11011。这里从节点的存储路径要与主节点区分,主和从都必须有

#所属集群名称
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#主从标识:0 表示Master, >0 表示Slave
brokerId=1
#当前broker监听的IP
brokerIP1=172.31.184.89
#用于HA主从同步
brokerIP2=172.31.184.89
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
haListenPort=11012
#删除长期无用文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间(h),默认48小时
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/server/feige/rocketmq/store-s
#commitLog存储路径
storePathCommitLog=/data/server/feige/rocketmq/store-s/commitlog
#消费队列存储路径
storePathConsumeQueue=/data/server/feige/rocketmq/store-s/consumequeue
#消息索引存储路径
storePathIndex=/data/server/feige/rocketmq/store-s/index
#checkpoint 文件存储路径
storeCheckPoint=/data/server/feige/rocketmq/store-s/checkpoint
#abort 文件存储路径
abortFile=/data/server/feige/rocketmq/store-s/abort
#限制的消息大小
maxMessageSize=65536
#broker角色
#- ASYNC_MASTER    异步复制Master
#- SYNC_MASTER     同步双写Master
#- SLAVE    从节点
brokerRole=SLAVE
#刷盘策略
#- ASYNC_FLUSH    异步刷盘
#- SYNC_FLUSH     同步刷盘
flushDiskType=ASYNC_FLUSH

2.7. 测试环境JVM配置(两台机器都要执行)

RocketMQ默认占用的内存是8G,比较大,这里需要修改下占用的堆内存,不然在一个机器是上同时启动两个 broker可能会启动失败。

vim bin/runbroker.sh
# 根据机器实际内存调整,这里演示的机器内存比较小,配置的值比较小
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn128m"
 vim bin/runserver.sh
# 根据机器实际内存调整,这里演示的机器内存比较小,配置的值比较小
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
 vim bin/tools.sh
# 根据机器实际内存调整,这里演示的机器内存比较小,配置的值比较小
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m"

2.8. 生产环境JVM配置

 vim bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
 vim bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
 vim bin/tools.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m"

四、启动集群

3.1.启动nameserver((两台机器上都执行)

nohup sh bin/mqnamesrv > /data/server/feige/rocketmq/logs/mqnamesrv.log 2>&1 &

3.2.启动broker

在192.31.186.180上执行如下命令

#1.启动Master1,在Master1上操作
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties > /data/server/feige/rocketmq/logs/broker-a.log 2>&1 &
#2.启动Slave2,在Slave 2上操作
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b-s.properties > /data/server/feige/rocketmq/logs/broker-b-s.log 2>&1 &
#6、查看 NameServer(9876)和 Broker(10909、10911、10912)启动情况,在2台主机上操作
netstat -nltup|egrep "9876|10911|10912|11011|11012"

image-20230921110217969

在192.31.184.89上执行如下命令:

#1.启动Master2,在Master2上操作
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b.properties > /data/server/feige/rocketmq/logs/broker-b.log 2>&1 &

#2.启动Slave1,在Slave1上操作
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a-s.properties > /data/server/feige/rocketmq/logs/broker-a-s.log 2>&1 &

#6、查看 NameServer(9876)和 Broker(10909、10911、10912)启动情况,在2台主机上操作
netstat -nltup|egrep "9876|10911|10912|11011|11012"
或者
sh bin/mqadmin clusterList -n "172.31.184.89:9876;172.31.186.180:9876"
或者
jps

3.3.测试集群生产消费情况

#在2台主机上操作
vim /etc/profile
#在文件/etc/profile中追加
export NAMESRV_ADDR="rocketmq-nameserver1:9876;rocketmq-nameserver2:9876"
#在控制台在其中1台机器上操作,启动一个生产者,在1个消费者机器就可以看到消费信息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
#在控制台其中2台机器上操作,启动2个消费者
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

这里的NAMESRV_ADDR变量名不能做任何修改,不然就可能报连不上Nameserver的错误。

i讯飞图片_1695298575007

正常消费成功的话,则消费者出现如下日志:

image-20230922124659669

3.5. 关闭命令

#关闭broker命令:
sh bin/mqshutdown broker
#关闭namesrv命令:
sh bin/mqshutdown namesrv

五、问题总结

java.lang.RuntimeException: Lock failed,MQ already started
	at org.apache.rocketmq.store.DefaultMessageStore.start(DefaultMessageStore.java:214)
	at org.apache.rocketmq.broker.BrokerController.start(BrokerController.java:827)
	at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:64)
	at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)
  1. 检查master节点和slave节点的端口是否冲突
  2. 检查master节点和slave节点的broker的存储路径是否冲突

六、安装管理面板

官网提供了两种部署方式,docker部署和源码部署,由于前面我们都是使用的直接部署,所以这里也采用官网提供的源码部署的方式。 (PS:docker 部署也尝试了,一直不行)。

  1. 下载源代码,源码地址:https://github.com/apache/rocketmq-dashboard/tags

  2. 在本地解压源码,然后,对源码进行编译打包,打包命令是:

    $ mvn clean package -Dmaven.test.skip=true
    

    然后,将生成的 rocketmq-dashboard-1.0.0.jar包上传到服务器,jar的相对路径是 target\rocketmq-dashboard-1.0.0.jar

  3. 运行 rocketmq-dashboard-1.0.0.jar

nohup java -jar rocketmq-dashboard-1.0.0.jar --server.port=18080 --rocketmq.config.namesrvAddr='172.31.184.89:9876;172.31.186.180:9876'>/data/server/feige/rocketmq/logs/mq-console.log 2>&1 &

这里需要指定两个参数:

  1. --server.port=18080 设置端口是18080,因为默认的端口是8080,很可能会冲突
  2. --rocketmq.config.namesrvAddr='192.31.184.89:9876;192.31.186.180:9876' 用于指定nameserver集群的地址,不指定的话会有问题。

启动成功之后访问控制台:http://192.31.186.180:18080/

image-20230922193948595

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

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

相关文章

Python 脚本中的 FFmpeg

FFmpeg 是快进运动图像专家组的缩写。 它是一个开源项目,提供了ffmpeg、ffplay、ffprobe等工具来处理多媒体文件。 FFmpeg 是一个命令行实用程序,可帮助转换视频/音频格式、压缩视频、从视频中提取音频、创建 GIF、剪切视频等。 本篇文章将介绍在Pytho…

数据库中了mkp勒索病毒,mkp勒索病毒解密,数据恢复

最近一段时间网络上的mkp勒索病毒比较猖獗,给企业的服务器数据库带来了严重影响。通过这一波的mkp勒索病毒攻击,云天数据恢复中心的工程师发现,大部分被攻击的企业,主要是因为网络安全意识不高,服务器安全防护没有做到…

基于STM32的森林火灾监控系统设计

一、设计简述 基于STM32设计的森林火灾监控系统(OneNet) 1.1 项目背景 近年来,随着全球气候变暖和人类活动的不断增加,森林火灾成为全球性的重大灾害之一。据统计,每年全球因森林火灾造成的经济损失高达数十亿美元,严重威胁着生态环境和人民生命财产安全。如何及时预警和响…

2023 年 42 周

2023 年 42 周 说句题外话,上次写这玩意儿居然都是两年前的事情了……这次换个方式计算,直接用周数来 学习 📑 进度 本周其实进度有那么点乱,学了一些 JPA/Hibernate 的内容,LC 刷题进度也拖慢了一些,基本…

会声会影2023中文旗舰版crack 2023注册机百度网盘下载

会声会影2023中文旗舰版功能非常强大的视频编辑软件,非常专业的使用效果,会声会影2023中文版可以针对剪辑电影进行使用,非常强大的色彩校正方式,无论什么光线下进行拍摄,都可以通过后期进行调整,并且里面超…

论文速递 | 8月下旬9月上旬Operations ResearchManagement Science文章精选

编者按 本期我们选取了8月下旬及9月上旬Operations Research文章2篇,Management Science文章4篇期刊文章,着眼于各种不同场景下对于风险的预测、量化及管理,通过聚焦于风险这一主题,体系化地形成文章精选。 文章1 Computation of…

【云计算网络安全】DDoS 攻击类型:什么是 ACK 洪水 DDoS 攻击

文章目录 一、什么是 ACK 洪水 DDoS 攻击?二、什么是数据包?三、什么是 ACK 数据包?四、ACK 洪水攻击如何工作?五、SYN ACK 洪水攻击如何工作?六、文末送书《AWD特训营》内容简介读者对象 一、什么是 ACK 洪水 DDoS 攻…

【UE5 虚幻引擎】新建C++类:类的类型 命名 类的目标模块

目录 0 引言1 新建C类2 类前的宏 🙋‍♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏💥 标题:【UE5 虚幻引擎】新建C类:类的类型 命名 类的目标模块❣️ 寄语:加油,一次专注一…

游戏设计模式专栏(十):在Cocos游戏开发中运用外观模式

点击上方亿元程序员关注和★星标 引言 大家好,我是亿元程序员,一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。 外观模式(F…

C#,数值计算——数据建模State的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class State { public double lam1 { get; set; } public double lam2 { get; set; } public double tc { get; set; } public int k1 { get; set; } public…

系统对接-验签机制

一、消息摘要算法 1、消息摘要算法特点 消息摘要算法加密过程不需要密钥,加密的数据无法解密。 只有输入相同的明文并且使用相同的摘要算法才能得到相同的结果。 2、MD5算法 压缩性:任意长度的数据MD5值都是固定128位(32个16进制数值串&a…

CUDA initialization: The NVIDIA driver on your system is too old解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于大模型(LLM)的Agent 应用开发

目前,业界一般认为基于大模型的应用集中在两个方向上:RAG 和 Agent,无论哪一种应用,设计、实现和优化能够充分利用大模型(LLM)潜力的应用都需要大量的努力和专业知识。随着开发人员开始创建日益复杂的LLM应用程序,开发…

Mock入门之概念理解

当我们讨论软件测试,特别是单元测试时,经常会遇到“mock”和“Mockito”。让我们先了解“mock”,然后详细探讨“Mockito”。 Mock概述 定义: 在软件测试中,mock是一个模拟真实对象的虚假对象,它模拟了真实对象的行为。…

在Google cloud上创建VM虚拟机

登录GCP console,确保Compute Enginee API 已经被eanbled 在左边菜单栏,选择第一个item - VM instance 如果见到上面页面, 则代表compute enginee的API 已经被enabled, 否则要先enable Compute enginee的API. 后者从APIs &…

【Eclipse】取消按空格自动补全,以及出现没有src的解决办法

【Eclipse】设置自动提示 教程 根据上方链接,我们已经知道如何设置Eclipse的自动补全功能了,但是有时候敲变量名的时候按空格,本意是操作习惯,不需要自动补全,但是它却给我们自动补全了,这就造成了困扰&…

14.7 Socket 循环结构体传输

在上述内容中笔者通过一个简单的案例给大家介绍了在套接字编程中如何传递结构体数据,本章将继续延申结构体传输,在某些时候例如我们需要传输一些当前系统的进程列表信息,或者是当前主机中的目录文件,此时就需要使用循环结构体传输…

C++ 引用()的超详细解析(小白必看系列)

目录 一、前言 二、引用的概念介绍 三、引用的五大特性 💦 引用在定义时必须初始化 💦 一个变量可以有多个引用 💦 一个引用可以继续有引用 💦 引用一旦引用一个实体,再不能引用其他实体 💦 可以对任何…

02-spring源码概述-debug流程

文章目录 1. 两个主要ApplicationContext的类继承结构图1.1 ClassPathXmlApplicationContext1.2 ClassPathXmlApplicationContext 2. DefaultListableBeanFactory类继承结构图 1. 两个主要ApplicationContext的类继承结构图 1.1 ClassPathXmlApplicationContext 1.2 ClassPath…

基于SSM的旅游景点管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…