RabbitMQ运维
1. 单机多节点
1.1 搭建RabbitMQ
①安装RabbitMQ
略
②确认RabbitMQ运⾏没问题
#查看RabbitMQ状态
rabbitmqctl status
节点名称:
端口号:
- 25672:Erlang分布式节点通信的默认端⼝, Erlang是RabbitMQ的底层通信协议.
- 15672: Web管理界⾯的默认端⼝, 通过这个端⼝可以访问RabbitMQ的Web管理控制台, ⽤于查看和管理消息队列
- 5672: AMQP 协议的默认端⼝, ⽤于客⼾端与 RabbitMQ服务器之间的通信.
③再启动两个节点
启动命令:
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
④验证RabbitMQ启动成功
在云服务器开通 15673, 15674端⼝号:
分别测试:
119.91.154.99:15673/
119.91.154.99:15674/
1.2 搭建集群
①停⽌服务并重置
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset
运行结果:
②把rabbit2, rabbit3添加到集群
rabbit@localhost是主节点的node Name
rabbitmqctl -n rabbit2 join_cluster rabbit@localhost
rabbitmqctl -n rabbit3 join_cluster rabbit@localhost
③重启rabbit2,rabbit3
rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit3 start_app
④查看集群状态
rabbitmqctl cluster_status -n rabbit
通过主节点(rabbit)管理界⾯, 可以看到集群其他节点:
2. 宕机演示
2.1 添加队列
添加bit虚拟机,其它节点也有了这个虚拟机
在bit虚拟机中添加队列:
2.2 添加之后,可以看到三个节点都有队列了
2.3 往testQueue队列中发送⼀条数据(从任⼀节点都可以)
发送之后, 观察3个节点的队列中均有消息:
2.4 关闭主节点
关闭后可以看到rabbit2和rabbit3没有该队列的数据了
也就是说, 这个数据只在主节点存在, 从节点没有
如何解决这个问题呢, 就需要引⼊"仲裁队列"
3. 仲裁队列(Quorum Queues)
RabbitMQ 的仲裁队列是⼀种基于 Raft ⼀致性算法实现的持久化、复制的 FIFO 队列. 仲裁队列提供队列复制的能⼒, 保障数据的⾼可⽤和安全性.
使⽤仲裁队列可以在 RabbitMQ 节点间进⾏队列数据的复制, 从⽽达到在⼀个节点宕机时, 队列仍然可以提供服务的效果
3.1 Raft协议介绍
Raft 是⼀种⽤于管理和维护分布式系统⼀致性的协议, 它是⼀种共识算法, 旨在实现⾼可⽤性和数据的 持久性. Raft 通过在节点间复制数据来保证分布式系统中的⼀致性,即使在节点故障的情况下也能保证数据不会丢失.
在分布式系统中, 为了消除单点提⾼系统可⽤性, 通常会使⽤副本来进⾏容错, 但这会带来另⼀个问题, 即如何保证多个副本之间的⼀致性?
共识算法就是做这个事情的, 它允许多个分布式节点就某个值或⼀系列值达成⼀致性协议. 即使在⼀些节点发⽣故障, ⽹络分区或其他问题的情况下, 共识算法也能保证系统的⼀致性和数据的可靠性.
常⻅的共识算法有: Paxos, Raft, Zab等,此处用Raft算法
3.2 Raft 基本概念
Raft 使⽤ Quorum 机制来实现共识和容错, 我们将对 Raft 集群的操作必须得到⼤多数(> N/2)节点的同意才能提交.
Raft 集群必须存在⼀个主节点(Leader), 客⼾端向集群发起的所有操作都必须经由主节点处理. 所以 Raft 核⼼算法中的第⼀部分就是选主(Leader election). 没有主节点集群就⽆法⼯作, 先选出⼀个主节点, 再考虑其它事情
主节点会负责接收客⼾端发过来的操作请求, 将操作包装为⽇志同步给其它节点, 在保证⼤部分节点都 同步了本次操作后, 就可以安全地给客⼾端回应响应了. 这⼀部分⼯作在 Raft 核⼼算法中叫⽇志复制 (Log replication).
因为主节点的责任⾮常⼤, 所以只有符合条件的节点才可以当选主节点. 为了保证集群对外展现的⼀致 , 主节点在处理操作⽇志时, 也⼀定要谨慎, 这部分在Raft核⼼算法中叫安全性(Safety).
Raft算法将⼀致性问题分解为三个⼦问题: Leader选举, ⽇志复制和安全性.
选主(Leader election)
选主(Leader election)就是在集群中抉择出⼀个主节点来负责⼀些特定的⼯作.
在执⾏了选主过程后, 集群中每个节点都会识别出⼀个特定的, 唯⼀的节点作为 leader
角色
- Leader(领导者): 负责处理所有客⼾请求,并将这些请求作为⽇志项复制到所有 Follower. Leader 定期向所有 Follower 发送⼼跳消息, 以维持其领导者地位, 防⽌ Follower 进⼊选举过程.
- Follower(跟随者): 接收来⾃ Leader 的⽇志条⽬, 并在本地应⽤这些条⽬. 跟随者不直接处理客⼾请求.
- Candidate(候选者): 当跟随者在⼀段时间内没有收到来⾃ Leader 的⼼跳消息时,它会变得不确定 Leader 是否仍然可⽤. 在这种情况下, 跟随者会转变⻆⾊成为 Candidate, 并开始尝试通过投票过程成为新的 Leader.
在正常情况下, 集群中只有⼀个 Leader, 剩下的节点都是 follower.
所有节点在启动时, 都是follow状态, 在⼀段时间内如果没有收到来⾃leader的⼼跳, 从 follower切换到candidate, 发起选举. 如果收到多数派(majority)的投票(含⾃⼰的⼀票) 则切换到 leader状态. Leader⼀般会⼀直⼯作直到它发⽣异常为⽌.
任期
Raft 将时间划分成任意⻓度的任期(term). 每⼀段任期从⼀次选举开始, 在这个时候会有⼀个或者多个 candidate 尝试去成为 leader. 在成功完成⼀次leader election之后,⼀个leader就会⼀直节管理集群直到任期结束. 在某些情况下, ⼀次选举⽆法选出 leader, 这个时候这个任期会以没有 leader ⽽结束. 同时⼀个新的任期(包含⼀次新的选举) 会很快重新开始
Term 更像是⼀个逻辑时钟(logic clock)的作⽤, 有了它,就可以发现哪些节点的状态已经过期. 每⼀个节点都保存⼀个 current term, 在通信时带上这个 term的值.
每⼀个节点都存储着⼀个当前任期号(current term number). 该任期号会随着时间单调递增. 节点之间通信的时候会交换当前任期号, 如果⼀个节点的当前任期号⽐其他节点⼩, 那么它就将⾃⼰的任期号更新为较⼤的那个值. 如果⼀个 candidate 或者 leader 发现⾃⼰的任期号过期了, 它就会⽴刻回到 follower 状态. 如果⼀个节点接收了⼀个带着过期的任期号的请求, 那么它会拒绝这次请求.
Raft 算法中服务器节点之间采⽤ RPC 进⾏通信, 主要有两类 RPC 请求:
- RequestVote RPCs: 请求投票, 由 candidate 在选举过程中发出
- AppendEntries RPCs: 追加条⽬, 由 leader 发出, ⽤来做⽇志复制和提供⼼跳机制
选举过程
Raft 动画演⽰官方在线地址: https://raft.github.io/
Raft 采⽤⼀种⼼跳机制来触发 leader 选举, 当服务器启动的时候, 都是follow状态. 如果follower在 election timeout内没有收到来⾃leader的⼼跳(可能没有选出leader, 也可能leader挂了, 或者leader与 follower之间⽹络故障), 则会主动发起选举
所有节点均为follow状态:
步骤如下:
- 率先超时的节点, ⾃增当前任期号然后切换为 candidate 状态, 并投⾃⼰⼀票
- 以并⾏的⽅式发送⼀个 RequestVote RPCs 给集群中的其他服务器节点(企图得到它们的投票)
- 等待其他节点的回复
S1节点率先超时,把任期号改为2,切换为candidate 状态, 并投⾃⼰⼀票:
在这个过程中, 可能出现三种结果
- 赢得选举, 成为Leader(包括⾃⼰的⼀票)
- 其他节点赢得了选举, 它⾃⾏切换到follower
- ⼀段时间内没有收到majority投票, 保持candidate状态, 重新发出选举
投票要求:
- 每⼀个服务器节点会按照 先来先服务原则(first-come-first-served)只投给⼀个 candidate.
- 候选人知道的信息不能比自己少
接下来对这三种情况进⾏说明:
①赢得了选举之后, 新的leader会⽴刻给所有节点发消息, ⼴⽽告之, 避免其余节点触发新的选举.
②⽐如有三个节点A B C, A B同时发起选举, ⽽A的选举消息先到达C, C给A投了⼀票, 当B的消息到达C时, 已经不能满⾜上⾯提到的第⼀个约束, 即C不会给B投票, 这时候A就胜出了. A胜出之后, 会给 B,C发⼼跳消息, 节点B发现节点A的term不低于⾃⼰的term, 知道有已经有Leader了, 于是把⾃⼰转换成follower.
S5收到S1的心跳消息,发现S1的term不低于自己,知道有leader了,把自己切换为follower:
③没有任何节点获得majority投票. ⽐如所有的 follower 同时变成 candidate, 然后它们都将票投给⾃⼰, 那这样就没有 candidate 能得到超过半数的投票了. 当这种情况发⽣的时候, 每个 candidate 都会进⾏⼀次超时响应, 然后通过⾃增任期号来开启⼀轮新的选举, 并启动另⼀轮的 RequestVote RPCs. 如果没有额外的措施, 这种⽆结果的投票可能会⽆限重复下去
注意:
为了解决上述问题,Raft 采⽤随机选举超时时间来确保很少产⽣⽆结果的投票,并且就算发⽣了也能很快地解决。
为了防⽌选票⼀开始就被⽠分,选举超时时间是从⼀个固定的区间(⽐如,150-300ms)中随机选择。这样可以把服务器分散开来以确保在⼤多数情况下会只有⼀个服务器率先结束超时,那么这个时候,它就可以赢得选举并在其他服务器结束超时之前发送⼼跳。
3.3 Raft 协议下的消息复制
每个仲裁队列都有多个副本, 它包含⼀个主和多个从副本. replication factor 为 5的仲裁队列将会有 1个 主副本和 4 个从副本. 每个副本都在不同的 RabbitMQ 节点上
客⼾端(⽣产者和消费者)只会与主副本进⾏交互, 主副本再将这些命令复制到从副本. 当主副本所在的节点下线, 其中⼀个从副本会被选举成为主副本, 继续提供服务.
消息复制和主副本选举的操作, 需要超过半数的副本同意. 当⽣产者发送⼀条消息, 需要超过半数的队列副本都将消息写⼊磁盘以后才会向⽣产者进⾏确认, 这意味着少部分⽐较慢的副本不会影响整个队列的性能.
3.4 仲裁队列的使⽤
①创建仲裁队列
1)使⽤Spring框架代码创建
2)使⽤管理平台创建
创建时选择Type为Quorum, 指定主副本
②创建后观察管理平台
+2表示有两个副本
点进去看队列详情:
对比普通队列:
③接收/发送消息
3.5 宕机演示
① 给仲裁队列 quorum_queue 发送消息
②停掉队列主副本所在的节点
观察其他节点, 可以看到quorum_queue 队列的内容依然存在:
并且, 因为主副本所在节点宕机了, quorum_queue 主副本从rabbit@localhost 转移到了 rabbit3@localhost+1
队列详细信息: 只剩下两个成员了:
4. HAProxy 负载均衡
⾯对⼤量业务访问、⾼并发请求,可以使⽤⾼性能的服务器来提升RabbitMQ服务的负载能⼒.
当单机容量达到极限时, 可以采取集群的策略来对负载能⼒做进⼀步的提升, 但这⾥还存在⼀些问题.
试想如果⼀个集群中有3个节点, 我们在写代码时, 访问哪个节点呢?
答案是访问任何⼀个节点都可以.
这时候就存在两个问题:
- 如果我们访问的是node1, 但是node1挂了, 咱们的程序也会出现问题, 所以最好是有⼀个统⼀的⼊⼝, ⼀个节点故障时, 流量可以及时转移到其他节点.
- 如果所有的客⼾端都与node1建议连接, 那么node1的⽹络负载必然会⼤⼤增加, ⽽其他节点⼜由于没有那么多的负载⽽造成硬件资源的浪费.
引⼊负载均衡之后, 各个客⼾端的连接可以通过负载均衡分摊到集群的各个节点之中, 从⽽避免前⾯的问题.
这⾥讲⼀下使⽤HAProxy来实现负载均衡.
4.1 安装
安装HAProxy
#更新软件包
sudo apt-get update
#查找haproxy
sudo apt list|grep haproxy
#安装haproxy
sudo apt-get install haproxy
验证安装
#查看服务状态
sudo systemctl status haproxy
#查看版本
haproxy -v
#如果要设置HAProxy服务开机⾃启,可以使⽤:
sudo systemctl enable haproxy
修改haproxy.cfg
vim /etc/haproxy/haproxy.cfg
加入以下内容:
# haproxy web 管理界面
listen stats
bind *:8100
mode http
stats enable
stats realm Haproxy\ Statistics
stats uri /
stats auth admin:admin
# 配置负载均衡
listen rabbitmq
bind *:5670
mode tcp
balance roundrobin
server rabbitmq1 127.0.0.1:5672 check inter 5000 rise 2 fall 3
server rabbitmq2 127.0.0.1:5673 check inter 5000 rise 2 fall 3
server rabbitmq3 127.0.0.1:5674 check inter 5000 rise 2 fall 3
解释:
- server rabbitmq1 : 定义RabbitMQ服务的内部标识, 这⾥的rabbitmq1 是指haproxy内部使⽤的, 不是指RabbitMQ的节点名称
- 127.0.0.1:5672 : RabbitMQ真实的IP和端⼝
- check inter 5000 : 定义每隔多少毫秒检查RabbitMQ服务是否可⽤
- rise 2 : 定义RabbitMQ服务在发⽣故障之后,需要多少次健康检查才能被再次确认可⽤.
- fall 3 : 定义需要经历多少次失败的健康检查之后,HAProxy才会停⽌使⽤此RabbitMQ服务
重启HAPROXY
sudo systemctl restart haproxy
查看HAProxy
通过119.91.154.99:8100访问
4.2 使用
①修改配置文件
spring:rabbitmq:addresses: amqp://admin:admin@119.91.154.99:5670/ops
②声明队列 test_cluster
③发送消息
④测试
⑤宕机演示
停⽌其中⼀个节点, 继续测试步骤2的代码:
再次发送:
显⽰队列中有两条数据
⑥集群恢复
观察消息也同步到当前节点了:
相关文章:

RabbitMQ运维
1. 单机多节点 1.1 搭建RabbitMQ ①安装RabbitMQ 略 ②确认RabbitMQ运⾏没问题 #查看RabbitMQ状态 rabbitmqctl status 节点名称: 端口号: 25672:Erlang分布式节点通信的默认端⼝, Erlang是RabbitMQ的底层通信协议.15672: Web管理界⾯的默认端⼝, 通过这个端⼝可以访问R…...

Go语言并发精髓:深入理解和运用go语句
Go语言并发精髓:深入理解和运用go语句 在Go语言的世界里,go语句是实现并发的核心,它简洁而强大,允许程序以前所未有的方式运行多个任务。本文将深入探讨go语句及其执行规则,揭示Go语言并发编程的内在机制,并提供实际案例帮助读者掌握其用法。 1. go语句的基本概念(Wha…...

基于STM32的智能家居系统:MQTT、AT指令、TCP\HTTP、IIC技术
一、项目概述 随着智能家居技术的不断发展,越来越多的家庭开始使用智能设备来提升生活质量和居住安全性。智能家居系统不仅提供了便利的生活方式,还能有效地监测家庭环境,保障家庭安全。本项目以设计一种基于STM32单片机的智能家居系统为目标…...

分糖果(相等分配)
题目:有n种不同口味的糖果,第i种糖果的数量为a[i],现在需要把糖果分给m个人。分给每个人糖果的数量必须是相等的,并且每个人只能选择一种糖果。也就是说,可以把一种糖果分给多个人,但是一个人的糖果不能有多…...

docker构建jdk11
# 建立一个新的镜像文件,配置模板:新建立的镜像是以centos为基础模板 # 因为jdk必须运行在操作系统之上 FROM centos:7.9.2009# 作者名 MAINTAINER yuanhang# 创建一个新目录来存储jdk文件 RUN mkdir /usr/local/java#将jdk压缩文件复制到镜像中&#…...

唐帕科技校园语音报警系统:通过关键词识别,阻止校园霸凌事件
校园霸凌问题已成为全球教育领域的严峻挑战,给受害者带来了身心上的长期创伤。然而,随着科技的发展,尤其是人工智能和语音识别技术的不断进步,我们开始看到创新性解决方案的出现。校园语音报警系统便是其中一种利用技术手段保护学…...

酒店行业数据仓库
重要名词: PMS:酒店管理系统CRS:中央预定系统客户:可以分为会员、散客(自行到店入住)、协议(与酒店长期合作,内部价)、中介预定:可以分为线上预定、线下预定…...

A029-基于Spring Boot的物流管理系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...

Python Day5 进阶语法(列表表达式/三元/断言/with-as/异常捕获/字符串方法/lambda函数
Python 列表推导式是什么 列表推导式是 Python 语言特有的一种语法结构,也可以看成是 Python 中一种独特的数据处理方式, 它在 Python 中用于 转换 和 过滤 数据。 其语法格式如下所示,其中 [if 条件表达式] 可省略。 [表达式 for 迭代变量…...

一文了解Android的核心系统服务
在 Android 系统中,核心系统服务(Core System Services)是应用和系统功能正常运行的基石。它们负责提供系统级的资源和操作支持,包含了从启动设备、管理进程到提供应用基础组件的方方面面。以下是 Android 中一些重要的核心系统服…...

Scala的Array(1)
Scala的Array表示长度不可变的数组,若需要定义可变数组需要倒包 import scala.collection.mutable.ArrayBuffer 下面是关于Array的一些用法: import scala.collection.mutable.ArrayBufferobject test29 { // //不可变数组 Array // def main(args:…...

[Linux] Linux信号捕捉
在Linux中,信号捕捉是通过使用信号处理函数来实现的。信号是操作系统用于通知进程发生某些事件的机制,例如终止进程、外部中断、非法操作等。常用的信号捕捉机制是通过signal()函数或sigaction()函数来注册信号处理程序。 1. 使用signal()函数 signal(…...

Elasticsearch的查询语法——DSL 查询
控制台打印日志: index-name: local_es_staff_info202404021352 DSL:{“size”:10000,“query”:{“bool”:{“must”:[{“terms”:{“emplId”:[“001756”,“000043”,“004193”],“boost”:1.0}}],“adjust_pure_negative”:true,“boost”:1.0}},“…...

开发语言中,堆区和栈区的区别
非javascript 1. 存储方式 栈区:栈区(Stack)是由系统自动分配的内存区域,通常用于存储函数的局部变量、参数、返回地址等。栈区的内存按照先进后出的顺序进行管理。堆区:堆区(Heap)是由程序员…...

驾校增加无人机培训项目可行性技术分析
驾校增加无人机培训项目的可行性技术分析,需要从市场需求、技术基础、政策支持、培训体系构建及运营等多个维度进行综合考量。以下是对这些方面的详细分析: 一、市场需求分析 1. 行业应用广泛:无人机在航拍、农业、环境监测、地理测绘、电力…...

JavaWeb后端开发知识储备1
目录 1.DTO/VO/PO 2.MVC架构/微服务架构 3.JWT令牌流程 4.ThreadLocal 5.接口路径/路径参数 1.DTO/VO/PO 1.1 DTO DTO 即 Data Transfer Object—— 数据传输对象,是用于传输数据的对象,通常在服务层与表现层之间传递数据,DTO 通常用于…...

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
在当今快速发展的农业领域,智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快,智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…...

大数据新视界 -- 大数据大厂之 Impala 存储格式转换:从原理到实践,开启大数据性能优化星际之旅(下)(20/30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

百度搜索AI探索版多线程批量生成TXT原创文章软件-可生成3种类型文章
百度搜索AI探索版是百度推出的一款基于大语言模型文心一言的综合搜索产品。以下是关于百度搜索AI探索版的详细介绍: 产品发布:百度搜索AI探索版在百度世界大会上进行了灰度测试,并面向用户开放体验。 核心功能:与传…...

ubuntu20.04 解决Pytorch默认安装CPU版本的问题
ubuntu20.04 解决Pytorch默认安装CPU版本的问题 在使用Anaconda安装支持CUDA的PyTorch版本时,遇到只能安装CPU版本的PyTorch是一个常见问题。这通常由于Anaconda环境配置、镜像源设置不当或版本匹配问题导致。以下是详尽的解决方案和步骤,以确保能够正确…...

名词解释-2-形状算数实验、潜在空间、3D生成模型
形状算术实验(Shape Arithmetic)是一种在3D生成模型中进行的实验,旨在通过在潜在空间中对形状的潜在向量进行算术操作来实现形状的变换。具体来说,该实验通过选择两个不同的3D形状实例,将其输入到编码器中生成两个潜在…...

Android 使用python统计getevent按键
1、连接ADB 2、开启脚本 作用: 统计时间内相应的event数量 python代码: import subprocess import redef parse_getevent_output():# 启动getevent进程getevent_process subprocess.Popen([adb, shell, getevent, -t, -l], stdoutsubprocess.PIPE,st…...

NVIDIA jetson查看资源占用情况,打印/保存资源使用情况日志
1.jtop jtop这个一般都有安装,只能实时查看 安装方式为 sudo -H pip install jetson-stats运行就是直接 jtop 即可 2.tegrastats 这个是jetson自带的工具,可以保存日志到文件,用于测试资源占用有无异常比较好用,如果资源有异常…...

ssm102“魅力”繁峙宣传网站的设计与实现+vue(论文+源码)_kaic
摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;“魅力”繁峙宣传网站系统当然也不能排除在外,随着网络技术的不断成熟,带动了“魅力”繁峙宣传网站系统的发展&#x…...

逐行加载 HTML 内容并实时显示效果:使用 wxPython 的实现
这篇博客中,我们将详细分析如何使用 wxPython 构建一个简单的桌面应用程序,用于逐行加载并显示 HTML 文件的内容,并在加载完成后通过浏览器组件呈现最终页面。通过该应用,我们可以体验到逐行加载 HTML 内容的视觉效果,…...

UE4 Cook 从UAT传递参数给UE4Editor
需求 一句Cook的命令如下: ${EnginePath}/Engine/Build/BatchFiles/RunUAT.sh BuildCookRun -project${ClientPath}/${ProjectName}.uproject -noP4 -platformIOS -cooksinglepackage -client -clientconfig${CookConfig} -iterate -skipbuild -nocompile -NoMutex…...

【学习日记】notebook添加JAVA支持
作者是个大学生 这个专栏主要收集课时常用的软件 以及女朋友上课用的软件的教程 新开了gitcode 用于上传安装包 环境说明 windows11 java23.0.1 ijava1.1.2 Anaconda-2024.02 需提前配置好java环境 本篇仅对添加支持进行说明 ijava的GitCode链接NotebookAddsSupportForJava:no…...

以太坊系地址衍生算法分层确定性生成逻辑
文章目录 一、前言1.1 衍生算法生成的私钥1.2 随机生成的私钥二、私钥生成及私钥提取2.1 golang如何使用衍生算法生成私钥,然后为用户生成地址2.1.1 实现步骤2.1.2 golang代码示例2.1.3 代码说明2.2 地址交易时,如何提取地址私钥2.2.1 私钥恢复说明2.2.2 golang代码通过助记词…...

【Unity】ScriptableObject的应用:利用配方合成新物体
前一篇已经使用ScriptableObject(SO)类配置可放置物体,本篇探索更多的SO类应用场景。 需求分析 将若干指定物体放在工作台上,可以生成新的物体。 成果展示 Scene部分 准备工作台,放在工作台上的物体全部放在指定PlacedObjects空物体下。 …...

31DNS设置
每天五分钟学Linux | 第三十一课:DNS设置 大家好!欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中,我们学习了如何配置Linux系统的IP地址。今天,我们将探讨如何设置DNS(域名系统)&#…...