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

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)

接上篇:《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》
链接

文章目录

      • 4.安装RabbitMQ Messaging Topology Operator
    • 裸金属环境部署RabbitMQ
      • 部署单实例
      • 部署集群

4.安装RabbitMQ Messaging Topology Operator

使用 cert-manager 安装Messaging Topology Operator
在k8s集群上安装 cert-manager 版本 1.2.0+。例如,对于版本 1.3.1,请运行:

wget https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.yamlkubectl apply -f cert-manager.yaml

要安装 Operator,请运行以下命令:

wget https://github.com/rabbitmq/messaging-topology-operator/releases/latest/download/messaging-topology-operator-with-certmanager.yamlkubectl apply –f messaging-topology-operator-with-certmanager.yaml

使用生成的自有证书安装Messaging Topology Operator

此方式因涉及自建私有证书,具体步骤可以参考官方文档:
https://www.rabbitmq.com/kubernetes/operator/install-topology-operator#install-with-generated-certificates

使用Kubernetes 内部非默认域名

默认情况下,Kubernetes 内部域名为.cluster.local。kubeadm可以将其配置为其他名称,例如my.cluster.domain。在这种情况下,Messaging Topology Operator可以将自定义域名附加到用于与 RabbitMQ 交互的连接字符串中。

要配置消息传递拓扑操作员以在连接字符串中附加域名,请将环境变量设置MESSAGING_DOMAIN_NAME为您的域名,例如".my.cluster.domain"。

修改Messaging Topology Operator部署清单文件,在Deployment配置段中向spec. template… spec. container. Command增加一个env,名称MESSAGING_DOMAIN_NAME和值为您的域名如:messaging-topology-operator-with-certmanager.yaml

apiVersion: apps/v1
kind: Deployment
metadata:[...]name: messaging-topology-operatornamespace: rabbitmq-system
spec:template:[...]spec:containers:- command:- /managerenv:- name: OPERATOR_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: MESSAGING_DOMAIN_NAMEvalue: "my.cluster.domain"

在这里插入图片描述
Messaging Topology Operator使用
创建queue和Policy
以下清单将在namepace名为rabbitmq-test下,默认虚拟主机中创建一个名为“queue-t1-rabbitmq-test”的队列:

cat queue-t1-rabbitmq-test.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Queue
metadata:name: queue-t1namespace: rabbitmq-test
spec:name: queue-t1-rabbitmq-testautoDelete: falsedurable: truerabbitmqClusterReference:name: rabbitmq-cluster01namespace: rabbitmq-test
kubectl apply -f queue-t1-rabbitmq-test.yaml
queue.rabbitmq.com/queue-t1 createdkubectl get queue -n rabbitmq-test
NAME       AGE
queue-t1   17s

在这里插入图片描述
以下清单将在namepace名为rabbitmq-test下创建名为“policy-example”的policy

cat policy.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Policy
metadata:name: policy-examplenamespace: rabbitmq-test
spec:name: lazy-queuepattern: "^lazy-queue-" # matches any queue begins with "lazy-queue-"applyTo: "queues"definition:queue-mode: lazyrabbitmqClusterReference:name: rabbitmq-cluster01namespace: rabbitmq-test
kubectl apply -f policy.yaml
policy.rabbitmq.com/policy-example createdkubectl get policy -n rabbitmq-test
NAME             AGE
policy-example   54s

在这里插入图片描述
创建exchange和binding
以下清单将在namepace名为rabbitmq-test下创建名为“rabbitmq-test”的exchange
cat exchange.yaml

cat exchange.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Exchange
metadata:name: fanoutnamespace: rabbitmq-test
spec:name: fanout-exchange # name of the exchangetype: fanout # default to 'direct' if not provided; can be set to 'direct', 'fanout', 'headers', and 'topic'autoDelete: falsedurable: truerabbitmqClusterReference:name: rabbitmq-cluster01namespace: rabbitmq-test
kubectl apply -f exchange.yaml
exchange.rabbitmq.com/fanout createdkubectl get exchange -n rabbitmq-test
NAME     AGE
fanout   13s

在这里插入图片描述
以下清单将在namepace名为rabbitmq-test下将名为“rabbitmq-test”的exchange与名为“queue-t1-rabbitmq-test”的queue 进行绑定

cat binding.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Binding
metadata:name: bindingnamespace: rabbitmq-test
spec:source: fanout-exchange # an existing exchangedestination: queue-t1-rabbitmq-test # an existing queuedestinationType: queue # can be 'queue' or 'exchange'routingKey: "queue-t1-rabbitmq-test"rabbitmqClusterReference:name: rabbitmq-cluster01namespace: rabbitmq-test
kubectl apply -f binding.yaml
binding.rabbitmq.com/binding created

创建的binding无法通过kubectl 命令列出,但通过RabbitMQ的管理UI可以看到。
在这里插入图片描述
创建用户及授权
可以使用 Messaging Topology Operator 创建 RabbitMQ 用户并分配用户权限

对账号(admin-user01)、密码(123123.com)进行base64加密:

echo -n 'admin-user01' | base64
YWRtaW4tdXNlcjAxecho -n '123123.com' | base64
MTIzMTIzLmNvbQ==

创建secret

vim secret-admin-user01.yaml
apiVersion: v1
kind: Secret
metadata:name: admin-user-secretnamespace: rabbitmq-test # 指定rabbitmq-cluster01的namespace
type: Opaque
data:username: YWRtaW4tdXNlcjAx  # base64 编码后的用户名password: MTIzMTIzLmNvbQ==  # base64 编码后的密码
kubectl apply -f secret-admin-user01.yaml
secret/admin-user01-secret created

创建Rabbitmq 账号资源,需要引用上面步骤创建的secret

vim my-admin-user01.yaml
apiVersion: rabbitmq.com/v1beta1
kind: User
metadata:name: my-admin-user01namespace: rabbitmq-test
spec:tags:- administratorrabbitmqClusterReference:name: rabbitmq-cluster01 # rabbitmqCluster must exist in the same namespace as this resourcenamespace: rabbitmq-testimportCredentialsSecret:name: admin-user01-secret  # must match the name of the Secret
kubectl apply -f my-admin-user01.yaml
user.rabbitmq.com/my-admin-user01 created

创建Rabbitmq 账号授权资源

vim permission-admin-user10.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Permission
metadata:name: admin-user01-permissionnamespace: rabbitmq-test
spec:vhost: "/"user: "admin-user01" # name of the RabbitMQ userpermissions:write: ".*"configure: ".*"read: ".*"rabbitmqClusterReference:name: rabbitmq-cluster01namespace: rabbitmq-test
kubectl apply -f permission-admin-user10.yaml
permission.rabbitmq.com/admin-user01-permission created

在这里插入图片描述
创建虚拟主机
以下YAML将在名为“rabbitmq-cluster01”的 RabbitmqCluster 中创建名为“test”的虚拟主机:

vim vhost01.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Vhost
metadata:name: test-vhost01 # name of this custom resourcenamespace: rabbitmq-test
spec:name: test01 # name of the vhostrabbitmqClusterReference:name: rabbitmq-cluster01namespace: rabbitmq-test
kubectl apply -f vhost01.yaml
vhost.rabbitmq.com/test-vhost01 created
kubectl get vhost -n rabbitmq-test
NAME           AGE
test-vhost01   2s

在这里插入图片描述
更新
一些自定义资源属性是不可变的,Messaging Topology Operator 实现了验证 webhook 来阻止对不可变字段的更新。禁止的更新将被拒绝。例如:

kubectl apply -f test-queue.yaml
Error from server (Forbidden):
...
Resource: "rabbitmq.com/v1beta1, Resource=queues", GroupVersionKind: "rabbitmq.com/v1beta1, Kind=Queue"
Name: "example", Namespace: "rabbitmq-system"
for: "test-queue.yaml": admission webhook "vqueue.kb.io" denied the request: Queue.rabbitmq.com "example" is forbidden: spec.name: Forbidden: updates on name, vhost, and rabbitmqClusterReference are all forbidden

无法更新的属性已记录在Messaging Topology Operator API 文档中,URL:https://github.com/rabbitmq/messaging-topology-operator/blob/main/docs/api/rabbitmq.com.ref.asciidoc

删除
删除自定义资源会删除 RabbitMQ 集群中相应的资源。Messaging Topology Operator 会在所有自定义资源上设置 kubernetes finalizers。如果对象已在 RabbitMQ 集群中删除,或者 RabbitMQ 集群已删除,Messaging Topology Operator 会删除自定义资源,而不会尝试删除 RabbitMQ 对象。

跨命名空间
默认情况下,Messaging Topology Operator 只协调使用RabbitMQ Cluster Kubernetes Operator 创建的RabbitMQ集群所在namespace下的创建消息拓扑资源请求。如果需要创建的建消息拓扑资源在其他的namesapce,需要在namespace 下添加相关注解annotations.rabbitmq.com/topology-allowed-namespaces

如下图,RabbitMQ集群所在的的namespace为rabbitmq-test,如果需要Messaging Topology Operator 额外协调rabbitmq-01和rabbitmq-02 两个namespace下消息拓扑资源,需要进行如下配置,多个namespace使用逗号分隔,中间不能有空格。可以设置为“*”,则为协调所有namesapce

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:name: rabbitmq-cluster01namespace: rabbitmq-testannotations:rabbitmq.com/topology-allowed-namespaces: "rabbitmq-01,rabbitmq-02"

如果在没有允许的namespace中创建消息拓扑资源,如下图中为“my-app2”,Topology Operator 的pod会有相关日志提示:
在这里插入图片描述
示例如下:
在namespace为my-app2下创建名称为queue-t1的queue, 在rabbitmq中的名称为queue-t1-my-app2

apiVersion: rabbitmq.com/v1beta1
kind: Queue
metadata:name: queue-t1 # name of this custom resource; does not have to the same as the actual queue namenamespace: my-app2
spec:name: queue-t1-my-app2 # name of the queuerabbitmqClusterReference:name: rabbitmq-cluster01namespace: rabbitmq-test

虽然使用kuberct 命令在namespace可以获取到列表,
在这里插入图片描述
但在rabbitmq中没有创建名字为queue-t1-my-app2的queue:
在这里插入图片描述
故障排查
如果无法创建某些 RabbitMQ 拓扑对象,可通过Messaging Topology Operator 的pod日志进行排查。

kubectl -n rabbitmq-system logs -l app.kubernetes.io/name=messaging-topology-operator

另外还可以使用kubectl desribe命令查看资源的详细信息:

kubectl describe queue queue-t1 -n rabbitmq-test
Name:         queue-t1
Namespace:    rabbitmq-test
Labels:       <none>
Annotations:  <none>
API Version:  rabbitmq.com/v1beta1
Kind:         Queue
Metadata:Creation Timestamp:  2024-10-25T09:46:27ZFinalizers:deletion.finalizers.queues.rabbitmq.com
…Vhost:        /
Status:Conditions:Last Transition Time:  2024-10-25T09:46:27ZReason:                SuccessfulCreateOrUpdateStatus:                TrueType:                  ReadyObserved Generation:     2
Events:Type    Reason             Age                 From              Message-                 -                -              -Normal  SuccessfulDeclare  7h2m (x6 over 47h)  queue-controller  Successfully declare queue

裸金属环境部署RabbitMQ

OS及内核:

[root@rbt01 ~]# cat /etc/redhat-release
BigCloud Enterprise Linux For Euler release 21.10 (LTS-SP2)[root@rbt01 ~]# uname -a
Linux rbt01 4.19.90-2107.6.0.0208.16.oe1.bclinux.x86_64 #1 SMP Tue Jul 18 10:06:28 CST 2023 x86_64 x86_64 x86_64 GNU/Linux

Erlang和RabbitMQ版本匹配关系参考官方文档:
https://www.rabbitmq.com/docs/3.13/which-erlang#redhat
在这里插入图片描述
本文档选用Erlang:v26.2.5.4和RabbitMQ: v3.13.7

部署单实例

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

安装Erlang
Erlang官方推荐使用各系统平台预安装包进行安装,Euler 21.10使用以下rmp包进行安装,下载地址:https://github.com/rabbitmq/erlang-rpm/releases/download/v26.2.5.4/erlang-26.2.5.4-1.el7.x86_64.rpm

执行安装及通过验证版本号测试是否安装成功

# 安装
yum install erlang-26.2.5.4-1.el7.x86_64.rpm# 查看版本
erl -version
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 14.2.5.4

部署RabbitMQ
二进制包下载地址:
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz

创建rabbitmq普通用户并设置密码,用于管理rabbitmq

useradd rabbitmq
passwd rabbitmq

解压下载好的二进制安装包到/opt目录下,并做软连接

tar xf rabbitmq-server-generic-unix-3.13.7.tar.xz -C /opt/
cd /opt/
ln -s /opt/rabbitmq_server-3.13.7/ /opt/rabbitmq
ln -s /opt/rabbitmq/sbin/* /usr/local/sbin/

安装完成后,默认没有配置文件,可以从官网下载示例,放到/opt/rabbitmq/etc/rabbitmq下,
https://github.com/rabbitmq/rabbitmq-server/blob/main/deps/rabbit/docs/rabbitmq.conf.example

可以根据实际需要参考下面的官方文档进行参数配置:
https://www.rabbitmq.com/docs/3.13/configure#config-items

修改rabbitmq 目录权限

chown –R rabbitmq:rabbitmq /opt/rabbitmq*

使用rabbitmq账号并启动服务:

su – rabbitmq
rabbitmq-server -detached

查看服务进程及监听端口号,默认会监听5672,25672 两个端口
5672用于接受rabbitmq 客户端连接请求
25672 用于集群模式下集群间通信
在这里插入图片描述
在这里插入图片描述
关闭服务命令:

rabbitmqctl shutdown

启动web管理插件,实现web 浏览器图形界面管理。

rabbitmq-plugins enable rabbitmq_management

启动web管理插件插件后,RabbitMQ会另外启动15672端口用户web服务。
使用服务器IP和15672端口访问web管理页面。
在这里插入图片描述
创建账号密码并设置权限
以下命令创建了admin账号并设置密码为:Admin.123,将其标记为administrator,并设置了对/ 有所有权限

rabbitmqctl add_user admin Admin.123
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

使用admin账号登录web管理页面
在这里插入图片描述
解决web管理界面提示:
⚠ All stable feature flags must be enabled after completing an upgrade. [Learn more]

  1. 导航到特性标志页面:
    在RabbitMQ管理界面的左侧菜单中,找到并点击“Admin”选项。
    在“Admin”页面中,找到并点击“Feature Flags”选项。
  2. 启用特性标志:
    在“Feature Flags”页面中,你会看到一个列表,其中包含了所有可用的特性标志。
    检查每个特性标志的状态,确保所有标记为“stable”(稳定)的特性标志都被启用。如果发现有未启用的稳定特性标志,请将其启用。
    在这里插入图片描述
    列出功能标志:
rabbitmqctl list_feature_flags

要启用功能标志(或所有当前禁用的标志):
rabbitmqctl enable_feature_flag <all | name>
开启detailed_queues_endpoint 功能标志

rabbitmqctl enable_feature_flag detailed_queues_endpoint

Feature Flags介绍:
官方文档:https://www.rabbitmq.com/docs/3.13/feature-flags
功能标记是一种机制,用于控制哪些功能在所有集群节点上被视为已启用或可用。如果启用了功能标记,则其相关功能(或行为)也会启用。如果没有启用,则集群中的所有节点都将禁用该功能(行为)。

功能标志子系统允许不同版本的 RabbitMQ 节点确定它们是否兼容,然后相互通信,尽管它们具有不同的版本,因此可能具有不同的功能集或实现细节。

引入此子系统是为了允许在不关闭整个集群的情况下对集群成员进行滚动升级。

至此RabbitMQ单实例部署完成。

部署集群

服务器列表
(3个节点保持一致)

[root@rbt01 ~]# tail -n 3 /etc/hosts
192.168.18.11 rbt01
192.168.18.12 rbt02
192.168.18.13 rbt03

分别在3个节点按照“单实例部署”步骤部署完成
参考上面章节
所有节点配置主机域名解析

vim /etc/hosts
192.168.18.11 rbt01
192.168.18.12 rbt02
192.168.18.13 rbt03

节点间同步cookie文件
Erlang cookie 是用于RabbitMQ 节点和CLI 工具之间身份验证的共享密钥。该值存储在通常称为 Erlang cookie 文件的文件中。
服务帐户和运行用户使用的 Cookie 文件rabbitmqctl必须同步,CLI 工具才能rabbitmqctl正常运行。集群中的所有节点必须具有相同的 Cookie 值(Cookie 文件内容)。

同步cooker前确保rabbitmq进程是关闭状态。

[root@rbt01 ~]# rabbitmqctl shutdown[root@rbt02 ~]# rabbitmqctl shutdown[root@rbt03 ~]# rabbitmqctl shutdown

在 UNIX 系统上,cookie 通常位于$HOME/.erlang.cookie
如果使用rabbitmq普通用户启动rabbitmq服务,.erlang.cookie文件的路径为:/home/rabbitmq/.erlang.cookie
.erlang.cookie 文件内容可以是自定义的字符串

将rbt01节点上/home/rabbitmq/.erlang.cookie 文件复制到rbt02,rbt03

[root@rbt01 ~]# scp .erlang.cookie rbt02:$PWD
.erlang.cookie                                                                              [root@rbt01 ~]# scp .erlang.cookie rbt03:$PWD
.erlang.cookie                            

并确保所有节点/home/rabbitmq/.erlang.cookie的属主,属组是rabbitmq
权限是400

chown –R rabbit:rabbit /home/rabbitmq/.erlang.cookie
chmod 400 /home/rabbitmq/.erlang.cookie

配置集群方式一,在配置文件中增加如下配置:
/opt/rabbitmq/etc/rabbitmq/rabbitmq.conf

cluster_name = rbt-cluster01
cluster_formation.peer_discovery_backend     = rabbit_peer_discovery_classic_configcluster_formation.classic_config.nodes.1 = rabbit@rbt01
cluster_formation.classic_config.nodes.2 = rabbit@rbt02
cluster_formation.classic_config.nodes.3 = rabbit@rbt03

在所有节点启动服务,集群将自动形成

[rabbitmq@rbt01 ~]$ rabbitmq-server –detached[rabbitmq@rbt02 ~]$ rabbitmq-server –detached[rabbitmq@rbt03 ~]$ rabbitmq-server –detached

在rbt01节点日志中查看有相关日志:

2024-11-05 11:23:41.793897+08:00 [info] <0.734.0> node rabbit@rbt02 up
2024-11-05 11:23:43.066480+08:00 [info] <0.734.0> rabbit on node rabbit@rbt02 up
2024-11-05 11:24:01.294927+08:00 [info] <0.734.0> node rabbit@rbt03 up
2024-11-05 11:24:02.705850+08:00 [info] <0.734.0> rabbit on node rabbit@rbt03 up

配置集群方式二,不需在rabbitmq.conf配置文件定义,使用以下命令配置集群
将rbt02节点加入集群

[rabbitmq@rbt02 ~]$  rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rbt02 ...[rabbitmq@rbt02 ~]$  rabbitmqctl join_cluster rabbit@rbt01
Clustering node rabbit@rbt02 with rabbit@rbt01[rabbitmq@rbt02 ~]$  rabbitmqctl start_app
Starting node rabbit@rbt02 ...

将rbt03节点加入集群

[rabbitmq@rbt03 ~]$ rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rbt03 ...[rabbitmq@rbt03 ~]$ rabbitmqctl join_cluster rabbit@rbt01
Clustering node rabbit@rbt03 with rabbit@rbt01[rabbitmq@rbt03 ~]$ rabbitmqctl start_app
Starting node rabbit@rbt03 ...

查看集群状态

[rabbitmq@rbt01 ~]$ rabbitmqctl cluster_status
Cluster status of node rabbit@rbt01 ...
BasicsCluster name: rabbit@rbt01
Total CPU cores available cluster-wide: 12Disk Nodesrabbit@rbt01
rabbit@rbt02
rabbit@rbt03Running Nodesrabbit@rbt01
rabbit@rbt02
rabbit@rbt03Versionsrabbit@rbt01: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@rbt02: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@rbt03: RabbitMQ 3.13.7 on Erlang 26.2.5.4
…

在这里插入图片描述

相关文章:

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)

接上篇&#xff1a;《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》 链接 文章目录 4.安装RabbitMQ Messaging Topology Operator 裸金属环境部署RabbitMQ部署单实例部署集群 4.安装RabbitMQ Messaging Topology Operator 使用 cer…...

【MySQL】MySQL经典面试题深度解析

文章目录 一、MySQL与C的深度结合1.1 为什么C项目需要MySQL&#xff1f;1.2 典型应用场景 二、基础概念面试题精讲2.1 存储引擎对比2.2 索引原理 三、C专项面试题解析3.1 连接池实现3.2 预处理语句3.3 批量操作优化 四、高级应用面试题剖析4.1 事务隔离级别4.2 锁机制详解4.3 查…...

小程序-基础加强

前言 这一节把基础加强讲完 1. 导入需要用到的小程序项目 2. 初步安装和使用vant组件库 这里还可以扫描二维码 其中步骤四没什么用 右键选择最后一个 在开始之前&#xff0c;我们的项目根目录得有package.json 没有的话&#xff0c;我们就初始化一个 但是我们没有npm这个…...

vscode+CMake+Debug实现 及权限不足等诸多问题汇总

环境说明 有空再补充 直接贴两个json tasks.json {"version": "2.0.0","tasks": [{"label": "cmake","type": "shell","command": "cmake","args": ["../"…...

零基础Vue入门6——Vue router

本节重点&#xff1a; 路由定义路由跳转 前面几节学习的都是单页面的功能&#xff08;都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html&#xff09;&#xff0c;涉及到项目研发都是有很多页面的&#xff0c;这里就需要用到路由&#xff08;vue route…...

【疑海破局】一个注解引发的线上事故

【疑海破局】一个注解引发的线上事故 1、问题背景 在不久前一个阳光明媚的上午,我的思绪正在代码中游走、双手正在键盘上飞舞。突然,公司内部通讯工具上,我被拉进了一个临时工作群,只见群中产品、运营、运维、测试等关键人员全部严阵以待,我就知道大的可能要来了。果不其…...

C语言:函数栈帧的创建和销毁

目录 1.什么是函数栈帧2.理解函数栈帧能解决什么问题3.函数栈帧的创建和销毁的过程解析3.1 什么是栈3.2 认识相关寄存器和汇编指令3.3 解析函数栈帧的创建和销毁过程3.3.1 准备环境3.3.2 函数的调用堆栈3.3.3 转到反汇编3.3.4 函数栈帧的创建和销毁 1.什么是函数栈帧 在写C语言…...

IDEA启动项目慢问题处理

IDEA启动项目慢问题处理 一、问题现象二、问题排查排查点1&#xff1a;idea内存排查点2&#xff1a;应用内存排查点3&#xff1a;shorten command lineclasspath filejar manifest 排查点4&#xff1a;jstack排查 三、问题定位 一、问题现象 多模块工程&#xff0c;启动模块为…...

Denavit-Hartenberg DH MDH坐标系

Denavit-Hartenberg坐标系及其规则详解 6轴协作机器人的MDH模型详细图_6轴mdh-CSDN博客 N轴机械臂的MDH正向建模&#xff0c;及python算法_mdh建模-CSDN博客 运动学3-----正向运动学 | 鱼香ROS 机器人学&#xff1a;MDH建模 - 哆啦美 - 博客园 机械臂学习——标准DH法和改进MDH…...

Unity 快速入门 1 - 界面操作

本项目将快速介绍 Unity 6的基本操作和功能&#xff0c;下载附件的项目&#xff0c;解压到硬盘&#xff0c;例如 D:\Unity Projects\&#xff0c; 注意整个文件路径中只有英文、空格或数字&#xff0c;不要有中文或其他特殊符合。 1. 打开Unity Hub&#xff0c;点击右上角的 O…...

美国网络司令部军事网络指挥框架战略转型与挑战分析

文章目录 前言一、框架核心内容&#xff1a;从分散到集中&#xff0c;构建标准化作战体系二、指挥体系重构&#xff1a;权责明晰与集中化管控三、风险管理创新&#xff1a;从被动防御到主动备战四、对美军网络作战的影响总结 前言 2024年9月&#xff0c;美国网络司令部发布《国…...

9-收纳的知识

[ComponentOf(typeof(xxx))]组件描述&#xff0c;表示是哪个实体的组件 [EntitySystemOf(typeof(xxx))] 系统描述 [Event(SceneType.Demo)] 定义事件&#xff0c;在指定场景的指定事件发生后触发 [ChildOf(typeof(ComputersComponent))] 标明是谁的子实体 [ResponseType(na…...

Linux 压缩打包

Linux压缩打包 文章目录 Linux压缩打包压缩的意义和原理压缩的意义压缩的原理压缩与解压缩的好处压缩打包命令.zipzip 命令用法unzip 的用法.gzgzip 的用法gunzip 的用法.bz2bzip2 的用法bunzip2 的用法.xzxz 命令用法tar04-Linux压缩打包课后习题压缩的意义和原理 压缩的意义…...

排序算法--堆排序

堆排序是一种高效的排序算法&#xff0c;适合大规模数据排序&#xff0c;尤其适用于需要实时获取最大&#xff08;或最小&#xff09;值的场景。 // 交换两个元素的值 void swap(int* a, int* b) {int temp *a;*a *b;*b temp; }// 调整堆&#xff0c;使其满足堆的性质 void …...

51c视觉~CV~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/13241694 一、CV创建自定义图像滤镜 热图滤镜 这组滤镜提供了各种不同的艺术和风格化光学图像捕捉方法。例如&#xff0c;热滤镜会将图像转换为“热图”&#xff0c;而卡通滤镜则提供生动的图像&#xff0c;这些图像看起来…...

【数据结构】(6) LinkedList 链表

一、什么是链表 1、链表与顺序表对比 不同点LinkedListArrayList物理存储上不连续连续随机访问效率O(N)O(1&#xff09;插入、删除效率O(1)O(N) 3、链表的分类 链表根据结构分类&#xff0c;可分为单向/双向、无头结点/有头节点、非循环/循环链表&#xff0c;这三组每组各取…...

使用 Axios 获取用户数据并渲染——个人信息设置

目录 1. HTML 部分&#xff08;前端页面结构&#xff09; HTML 结构解析&#xff1a; 2. JavaScript 部分&#xff08;信息渲染逻辑&#xff09; JavaScript 解析&#xff1a; 3. 完整流程 4. 总结 5. 适用场景 本文将介绍如何通过 Axios 从服务器获取用户信息&#xff0…...

【hudi】基于hive2.1.1的编译hudi-1.0.0源码

hudi版本1.0.0 需要使用较低版本的hive&#xff0c;编译hudi只需要修改下类即可&#xff1a; org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat 一、复制org.apache.hadoop.hive.common.StringInternUtils 找个hive2.3.9的源码包&#xff0c;创建包路径&#xff0c…...

物联网领域的MQTT协议,优势和应用场景

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;作为轻量级发布/订阅协议&#xff0c;凭借其低带宽消耗、低功耗与高扩展性&#xff0c;已成为物联网通信的事实标准。其核心优势包括&#xff1a;基于TCP/IP的异步通信机制、支持QoS&#xff08;服务质量&…...

MyBatis 调优指南:释放持久层性能潜力

MyBatis 作为一款优秀的持久层框架&#xff0c;以其灵活性和易用性深受开发者喜爱。然而&#xff0c;随着应用规模扩大和数据量增长&#xff0c;MyBatis 的性能问题也逐渐显现。本文将深入探讨 MyBatis 调优策略&#xff0c;帮助您释放持久层性能潜力。 一、 SQL 语句优化 避免…...

Unity扩展编辑器使用整理(一)

准备工作 在Unity工程中新建Editor文件夹存放编辑器脚本&#xff0c; Unity中其他的特殊文件夹可以参考官方文档链接&#xff0c;如下&#xff1a; Unity - 手册&#xff1a;保留文件夹名称参考 (unity3d.com) 一、菜单栏扩展 1.增加顶部菜单栏选项 使用MenuItem&#xff…...

注册中心不知选哪个?Zookeeper、Eureka、Nacos、Consul和Etcd 5种全方位剖析对比

本文给大家讲解 5 种常用的注册中心&#xff0c;对比其流程和原理&#xff0c;无论是面试还是技术选型&#xff0c;都非常有帮助。 对于注册中心&#xff0c;在写这篇文章前&#xff0c;我其实只对 ETCD 有比较深入的了解&#xff0c;但是对于 Zookeeper 和其他的注册中心了解甚…...

Windows下怎么安装FFFmpeg呢?

在Windows下使用Open-webui报错&#xff0c;说Couldnt find ffmpeg or avconv,解决open-webui报错Couldn‘t find ffmpeg or avconv-CSDN博客于是尝试解决问题&#xff0c;那么Windows下怎么安装FFFmpeg呢&#xff1f; 尝试了两种方法。 第一种方法pip安装&#xff08;失败&…...

CSS 基础:层叠、优先级与继承

CSS 基础&#xff1a;层叠、优先级与继承 一、层叠&#xff08;Cascade&#xff09;示例&#xff1a;层叠的顺序 二、优先级&#xff08;Specificity&#xff09;优先级规则示例&#xff1a;优先级的比较 三、继承&#xff08;Inheritance&#xff09;哪些属性会被继承&#xf…...

《翻转组件库之发布》

背景 继《翻转组件库之打包》_杨晓风-linda的博客-CSDN博客之后&#xff0c;组件库已经可以正常构建&#xff0c;那如何像elementUI等组件库那样&#xff0c;用npm安装&#xff0c;按照既定的用法使用即可呢&#xff1f;本篇便为你揭晓 资料相关 1、npm官方文档&#xff1a;…...

Spring Boot + Spring AI快速体验

Spring AI快速体验 1 什么是Spring AI 主要功能 2 快速开始 2.1 版本说明2.2 配置文件2.3 pom依赖 2.3.1 spring maven仓库2.3.2 核心依赖 2.4 定义ChatClient2.5 启动类2.6 测试 3 参考链接 1 什么是Spring AI Spring AI是Spring的一个子项目&#xff0c;是Spring专门面向于…...

windows linux常用基础命令

windows基础命令 cd …/ &#xff08;访问D盘 直接D: 进入目录cd…\baidudu) color 2 改变颜色 dir 浏览当前目录中有什么内容 例如 dir windows可以浏览windows中有什么文件 cls 清屏 cd windows 可以跳转到c盘目录的下面 cd…/可以返回到上一级目录 ./当前目录 cd \ 直…...

ZooKeeper单节点详细部署流程

ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…...

【AI日记】25.02.06

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Backpack Prediction Challenge 读书 书名&#xff1a;理解公司&#xff1a;产权、激励与治理作者&#xff1a;张维迎下图感想&#xff1a;哲学家、思想家比如卢梭…...

税费学习之:附加税费

好的&#xff01;我将从 **税收本质、历史沿革、用途逻辑、企业影响** 四个维度综合分析&#xff0c;用项目管理中的实际场景说明为什么需要缴纳附加税费。 --- ### **一、附加税费的本质与构成** #### **1. 定义** 附加税费是 **以增值税、消费税为基数征收的附加税**&…...

数据库开发常识(10.6)——SQL性能判断标准及索引误区(1)

10.6. 数据库开发常识 作为一名专业数据库开发人员,不但需要掌握数据库开发相关的语法和功能实现,还要掌握专业数据库开发的常识。这样,才能在保量完成工作任务的同时,也保质的完成工作任务,避免了为应用的日后维护埋下性能和稳定性方面的隐患。可遗憾的是,现实中,很大…...

网络原理一>数据链路层协议->以太网协议

目录 以太网协议的结构&#xff1a;类型&#xff1a;ARP请求应答报文&#xff1a;CRC&#xff1a;MTU: 为什么需要mac地址&#xff1a;mac地址和IP地址的区别&#xff1a; 以太网协议的结构&#xff1a; 以太网是数据链路层和物理层的主要协议 源IP&#xff0c;目的IP就不多说…...

Android 约束布局ConstraintLayout整体链式打包居中显示

Android 用约束布局ConstraintLayout实现将多个控件视作一个整体居中显示&#xff0c;使用 app:layout_constraintHorizontal_chainStyle"packed"实现 chain 除了链条方向有横向和竖向区分外&#xff0c; chain链条上的模式有 3种 spread - 元素将被展开&#…...

云计算行业分析

云计算作为数字经济的核心基础设施&#xff0c;未来十年将持续重塑全球科技格局&#xff0c;并渗透到几乎所有行业的数字化转型中。 一、云计算的发展潜力 1. 技术融合驱动爆发式创新 AI与云计算的深度耦合 - **智能云服务**&#xff1a;云厂商将提供预训练模型、自动化ML工…...

深入浅出DeepSeek LLM 以长远主义拓展开源语言模型

深入浅出地讲解DeepSeek LLM 以长远主义拓展开源语言模型 &#x1f31f; 1. 什么是 DeepSeek LLM&#xff1f; 大家想象一下&#xff0c;你在游戏里要打造一个超级英雄角色&#xff0c;选择最强的装备、技能点和升级策略。那么&#xff0c;DeepSeek LLM 就是 AI 界的“超级英雄…...

用Python获取股票数据并实现未来收盘价的预测

获取数据 先用下面这段代码获取上证指数的历史数据&#xff0c;得到的csv文件数据&#xff0c;为后面训练模型用的 import akshare as ak import pandas as pd# 获取上证指数历史数据 df ak.stock_zh_index_daily(symbol"sh000001")# 将数据保存到本地CSV文件 df.…...

[openwrt]openwrt slaac only模式下部分终端无法获取到IPv6 DNS

问题描述 OpenWrt 中,如果启用了 RA 单播(ra_unicast),但部分终端无法获取到 DNS 信息 问题分析 RA 单播的局限性 并非所有终端都完全支持通过单播接收 RA 消息。部分终端可能无法正确解析单播 RA 中的 RDNSS(Recursive DNS Server)选项,从而导致无法获取 DNS 信息。终…...

【redis】数据类型之list

Redis的List数据类型是一个双向链表&#xff0c;支持在链表的头部&#xff08;left&#xff09;和尾部&#xff08;right&#xff09;进行元素的插入&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;操作。这使得List既可以用作栈&#xff08;stack&#xff09;…...

电脑连接wifi但是浏览器打开不了网页,使用手机热点能正常使用

电脑连接wifi但是浏览器打开不了网页&#xff0c;使用手机热点能正常使用 打开控制面板 打开网络和Internet&#xff08;查看网络状态和任务&#xff09; 点击更改适配器设置 双击WLAN 点击属性并双击打开Internet 协议版本4&#xff08;TCP/IPv4&#xff09; 将自动…...

el-table中的某个字段最多显示两行,超出部分显示“...详情”,怎么办

文章目录 背景需求需求分析 解决方案在线体验灵感来源我的实现方案 总结 背景 需求 比如&#xff0c;有如下一个表格&#xff0c;请你实现它&#xff1a; 要求&#xff1a; 最多显示两行超出部分显示为&#xff1a;“…详情”点击详情&#xff0c;展开全部内容 说明&#x…...

Vue el-input密码输入框 按住显示密码,松开显示*;阻止浏览器密码回填,自写密码输入框;校验输入非汉字内容;文本框聚焦到内容末尾;

输入框功能集合 <template><div style"padding: 10px"><!-- 密码输入框 --><el-input:type"inputType"v-model"password"placeholder"请输入密码"auto-complete"new-password"id"pwd"style…...

尚硅谷课程【笔记】——大数据之Shell【一】

课程视频&#xff1a;【【尚硅谷】Shell脚本从入门到实战】 一、Shell概述 为什么要学习Shell&#xff1f; 1&#xff09;需要看懂运维人员的Shell程序 2&#xff09;偶尔编写一些简单的Shell程序来管理集群、提高开发效率 什么是Shell&#xff1f; 1&#xff09;Shell是一…...

4年测试|20-30K|金山办公|大模型测开3轮面经

一面时间&#xff1a;面试时长一小时左右 二面时间&#xff1a;面试时长基本满一小时 HR面时间&#xff1a;面试流程上全部结束了&#xff0c;内容如下&#xff1a; 前言&#xff1a; 岗位&#xff1a;自己想投递base珠海&#xff0c;金山办公的HR捞了下。why choose Zhuha…...

【负载均衡式在线OJ】实现负载均衡

目录 管理服务器 增加负载 && 减少负载 重置负载 && 获得负载 负载均衡 添加配置信息 什么是负载均衡 如何实现&#xff1f; 管理服务器 增加负载 && 减少负载 客户端访问一次服务器&#xff0c;负载就加1。客户端结束访问服务器&#xff0c;…...

网络安全-防御 第一次作业(由于防火墙只成功启动了一次未补截图)

防火墙安全策略课堂实验报告 一、拓扑 本实验拓扑包含预启动设备、DMZ区域&#xff08;含OA Server和Web Server&#xff09;、防火墙&#xff08;FW1&#xff09;、Trust区域&#xff08;含办公区PC和生产区PC&#xff09;等。具体IP地址及连接关系如给定拓扑图所示&#xf…...

大数据挖掘--两个角度理解相似度计算理论

文章目录 0 相似度计算可以转换成什么问题1 集合相似度的应用1.1 集合相似度1.1文档相似度1.2 协同过滤用户-用户协同过滤物品-物品协同过滤 1.2 文档的shingling--将文档表示成集合1.2.1 k-shingling1.2.2 基于停用词的 shingling 1.3 最小哈希签名1.4 局部敏感哈希算法&#…...

【Mybatis Plus】JSqlParser解析sql语句

【Mybatis Plus】JSqlParser解析sql语句 【一】JSqlParser 是什么【二】JSqlParser 的安装步骤【三】使用场景【1】sql语句解析【2】SQL 语句转换【3】SQL 语句生成【4】SQL 语句验证 【四】在使用 JSqlParser 时&#xff0c;如何处理 SQL 注入攻击&#xff1f;【1】使用预编译…...

vue3 + ElementPlus 封装列表表格组件包含分页

在前端开发中&#xff0c;封装组件是必不可少的。今天就来封装一个通用的列表表格组件&#xff0c;包含分页功能&#xff0c;可以提高代码的复用性和可维护性。 1. 组件设计 Props&#xff1a; tableData&#xff1a;表格数据。columns&#xff1a;表格列配置。total&#xff…...

springboot3整合knife4j详细版,包会!(不带swagger2玩)

1. 引入依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version> </dependency>2. 配置文件 简短必要版 # 配置springd…...

Vue2自定义指令实现优雅的前端埋点方案

背景介绍 在前端开发中&#xff0c;埋点是一个非常常见的需求。通常我们需要记录用户的操作行为&#xff0c;以便于后续的数据分析和问题排查。传统的埋点方式往往是在每个需要埋点的地方都写一段上报代码&#xff0c;这样不仅代码重复度高&#xff0c;而且维护起来也比较麻烦…...