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

RabbitMQ实战启程:从原理到部署的全方位探索(上)

文章目录

  • 一、RabbitMQ简介
    • 1.1、概述
    • 1.2、特性
  • 二、RabbitMQ原理架构
  • 三、RabbitMQ应用场景
    • 3.1 简单模式
    • 3.2 工作模式
    • 3.3 发布订阅
    • 3.4 路由模式
    • 3.5 主题订阅模式
  • 四、同类中间件对比
  • 五、RabbitMQ部署
    • 5.1 单机部署
      • 5.1.1 安装erlang
      • 5.1.2 安装rabbitmq
    • 5.2 集群部署(镜像模式)
      • 5.2.1 配置节点
      • 5.2.2 创建集群
    • 5.3 K8s部署
      • 5.3.1 创建yaml文件
      • 5.3.2 申请资源清单(启动各个yaml文件)
      • 5.3.3 访问Rabbirmq页面
  • 六、常用命令

一、RabbitMQ简介

1.1、概述

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

1.2、特性

**可伸缩性:**集群服务
**消息持久化:**从内存持久化消息到硬盘,再从硬盘加载到内存

解决什么问题:

  1. 进程间的通讯。程序间解耦(耦合)。
  2. web高并发。来不及进行同步处理。”too many connections”(同步 异步切换)

二、RabbitMQ原理架构

在这里插入图片描述
在这里插入图片描述
中间的Broker表示RabbitMQ服务,每个Broker里面至少有一个Virtual host虚拟主机,每个虚拟主机中有自己的Exchange交换机、Queue队列以及Exchange交换机与Queue队列之间的绑定关系Binding。producer(生产者)和consumer(消费者)通过与Broker建立Connection来保持连接,然后在Connection的基础上建立若干Channel信道,用来发送与接收消息

名词解释:

  1. exchange:它指定消息按什么规则,路由到哪个列队 给消息分类
  2. queue:消息载体,每个消息都会被投递到一个或多个列队里面。
  3. binding:exchange和queue按照规则绑定
  4. connections:producer和consumer用TCPconnections链接到rabbitMQ
  5. channels:TCP中的虚拟链接。(不损耗端口号)
  6. Routing key 路由关键字(消息路由)
  7. Send Message 发送消息
  8. Receive Message 收消息
  9. Broker 缓存代理

三、RabbitMQ应用场景

3.1 简单模式

做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B

应用场景:将发送的电子邮件放到消息队列,然后邮件服务在队列中获取邮件并发送给收件人、聊天等

3.2 工作模式

  1. 一条消息只会被一个消费者接收;
  2. rabbit采用轮询的方式将消息是平均发送给消费者的;
  3. 消费者在处理完某条消息后,才会收到下一条消息。

应用场景:对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。

3.3 发布订阅

  1. 每个消费者监听自己的队列。
  2. 生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息

应用场景:用户通知,当用户充值成功或转账完成系统通知用户,通知方式有短信等多种方法 。比如邮件群发,群聊天,广告等。

3.4 路由模式

  1. 每个消费者监听自己的队列,并且设置routingkey。
  2. 生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。

应用场景:如在商品库存中增加了1台iphone13,iphone13促销活动消费者指定routing key为iphone13,只有此促销活动会接收到消息,其它促销活动不关心也不会消费此routing key的消息

3.5 主题订阅模式

根据主题(Topics)来接收消息,将路由key和某模式进行匹配,此时队列需要绑定在一个模式上,#匹配一个词或多个词,*只匹配一个词。

应用场景:同上,iphone促销活动可以接收主题为iphone的消息,如iphone12、iphone13等

四、同类中间件对比

特性ActiveMQRabbitMQRockerMQKafka
producer-comsumer(生产消费)支持支持支持
pubkish-subscribe(发布订阅)支持支持支持支持
request-reply(请求应答)支持支持
API完整性
多语言支持支持,
JAVA优先
无关JAVA支持,
JAVA优先
单机吞吐量万级万级万级十万级
消息延时毫秒微秒毫秒毫秒
可用性高(主从)高(主从)高(分布式)高(分布式)
消息丢失理论上不会丢失理论上不会丢失
消息重复可控制理论上会有重复
文档完整性
提供快速入门
社区活跃度
商业支持阿里云
成熟度成熟成熟比较成熟成熟日志领域
特点功能齐全,被大量
开源项目使用
由于Erlang语言开发,性能好各环节分布式设计,
多种消费模式
可靠性、可扩展、
持久性、性能高
协议OPENWITE、STOP、
REST、XMPP、AMQP
AMQP自定义(社区提供JMS)PLAINTEXT、SSL、SASL_PLAINTEXT、SASL_SSL
持久化内存、文件、数据库内存、文件磁盘文件磁盘、文件
事务支持支持支持支持
负载均衡支持支持支持支持
管理界面一般有web console实现
优点成熟的产品,
已经在很多项目得到应用。
有较多文档,各种协议支持较好,多重语言的成熟客户端
由于Erlang语言开发,mq性能好,管理页面丰富,多种语言支持,amqp客户端可用模型简单,接口易用,阿里大规模应用性能好,支持多种消费,开发都较活跃性能卓越、可用性非常高、
日志领域比较成熟、功能简单、web界面友好
缺点会莫名丢失消息,
目前社区对重心版本不是太活跃,5.x维护较少,不适合大规模队列
由于Erlang语言开发,难度较大,不支持动态扩容产品文档匮乏,没有在mq核心去实现JMS等接口,对已有系统不能完美兼容消息失败不支持重试、消息顺序可能会导致消息乱序、社区更新较慢

五、RabbitMQ部署

5.1 单机部署

5.1.1 安装erlang

yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel ncurses-devel  
wget https://github.com/erlang/otp/releases/download/OTP-24.0/otp_src_24.0.tar.gz 
tar -xzvf /otp_src_24.0.tar.gz 
cd /otp_src_24.0 
./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe  
make && make install

5.1.2 安装rabbitmq

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.10.5/rabbitmq-server-3.10.5-1.el8.noarch.rpm 
rpm -ivh --nodeps rabbitmq-server-3.10.5-1.el8.noarch.rpm 
添加开机启动RabbitMQ服务 
chkconfig rabbitmq-server on 
启动RabbitMQ服务 
rabbitmq-server start 
后台启动RabbitMQ服务 
rabbitmq-server -detached 
停止RabbitMQ服务 
rabbitmqctl stop 
查看RabbitMQ服务状态 
rabbitmqctl status 
添加帐号:name 密码:
passwd rabbitmqctl add_user name passwd 
赋予其administrator角色 
rabbitmqctl set_user_tags name administrator 
删除角色 
rabbitmqctl delete_user Username 
设置权限
rabbitmqctl set_permissions -p / name ".*" ".*" ".*" 
查看用户的权限 
rabbitmqctl list_user_permissions username 

启动成功后,rabbitMQ的相关文件所在位置

  1. 相关命令 :/usr/lib/rabbitmq/bin/
  2. 相关的日志:/var/log/rabbitmq/
  3. 相关的配置 : /etc/rabbitmq/
  4. 设置的用户权限等元数据信息:/var/lib/rabbitmq/mnesia/

http://ip:15672/ 尝试访问rabbitmq的web页面
可能会遇到报错情况,Node的错误,大概的意思就是说,hosts中的地址和node中的地址不一样,不匹配导致的。修改hosts文件中的本机的IP地址,hosts中的本机的计算机名称和Node的节点的名称保持一致即可。
在这里插入图片描述

5.2 集群部署(镜像模式)

普通模式:普通集群模式,就是将 RabbitMQ 部署到多台服务器上,每个服务器启动一个 RabbitMQ 实例,多个实例之间进行消息通信。
此时我们创建的队列 Queue,它的元数据(主要就是 Queue 的一些配置信息)会在所有的 RabbitMQ 实例中进行同步,但是队列中的消息只会存在于一个 RabbitMQ 实例上,而不会同步到其他队列。
当我们消费消息的时候,如果连接到了另外一个实例,那么那个实例会通过元数据定位到 Queue 所在的位置,然后访问 Queue 所在的实例,拉取数据过来发送给消费者。
这种集群可以提高 RabbitMQ 的消息吞吐能力,但是无法保证高可用,因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,就可以继续访问了;如果消息队列没做持久化,那么消息就丢了。

在这里插入图片描述
镜像模式:它和普通集群最大的区别在于 Queue 数据和原数据不再是单独存储在一台机器上,而是同时存储在多台机器上。也就是说每个 RabbitMQ 实例都有一份镜像数据(副本数据)。每次写入消息的时候都会自动把数据同步到多台实例上去,这样一旦其中一台机器发生故障,其他机器还有一份副本数据可以继续提供服务,也就实现了高可用。
在这里插入图片描述

5.2.1 配置节点

  1. 配置两台机器的hosts
    vim /etc/hosts修改后使用
  2. 停止服务
rabbitmqctl stop
  1. 设置erlang cookie

这里将第一台的该文件复制到 其他节点,由于这个文件权限是400,为方便传输,先修改权限,所以需要先修改该文件权限为 777。
集群各节点的cookie必须保持一致,否则无法通信。
erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。
注意.erlang.cookie的目录,也有可能在/var/lib/rabbitmq/.erlang.cookie
将权限和所属用户/组修改回来
node2:

chmod 400 /root/.erlang.cookie
  1. 启动个节点
rabbitmq-server –detached

查看集群状态

[root@test-1]# rabbitmqctl cluster_status 
Cluster status of node rabbit@mq1 ... 
Basics 
Cluster name: rabbit@mq1.example.local    #集群名称 
Disk Nodes    #磁盘节点 
rabbit@mq1 
Running Nodes    #运作中节点
rabbit@mq1 
Versions    #版本 
rabbit@mq1: 
RabbitMQ 3.9.0 on Erlang 24.0.4 

5.2.2 创建集群

rabbitmqctl stop_app    #停止 app 服务 
rabbitmqctl reset    #清空元数据 
rabbitmqctl join_cluster rabbit@mq1 --ram    #将rabbitmq-server2添加到集群当中,并成为内存节点,不加--ram默认是磁盘节点 
rabbitmqctl start_app    #启动 app 服务 
rabbitmqctl stop_app    #停止 app 服务 
rabbitmqctl reset    #清空元数据
rabbitmqctl join_cluster rabbit@mq1 --ram    #
将rabbitmq-server2添加到集群当中,并成为内存节点,不加--ram默认是磁盘节点 
rabbitmqctl start_app    #启动 app 服务  
​
将集群设置为镜像模式(只要在其中一台节点执行以下命令即可) rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
http://ip:15672/尝试访问rabbitmq的web页面

在这里插入图片描述

5.3 K8s部署

5.3.1 创建yaml文件

包括(comfigmap、secret、rbac、sts、svc)五个yaml文件
Comfigmap:

apiVersion: v1
kind: ConfigMap
metadata:name: rabbitmq-confignamespace: test
data:enabled_plugins: |[rabbitmq_management,rabbitmq_peer_discovery_k8s].
#启用插件rabbitmq_management和rabbitmq_peer_discovery_k8srabbitmq.conf: |cluster_formation.peer_discovery_backend  = rabbit_peer_discovery_k8scluster_formation.k8s.host = kubernetes.default.svc.cluster.localcluster_formation.k8s.address_type = hostname################################################## rabbit-mq is rabbitmq-cluster's namespace##################################################cluster_formation.k8s.hostname_suffix = .rabbitmq-headless.rabbit-mq.svc.cluster.localcluster_formation.node_cleanup.interval = 30cluster_formation.node_cleanup.only_log_warning = truecluster_partition_handling = autohealqueue_master_locator=min-masterscluster_formation.randomized_startup_delay_range.max = 2vm_memory_high_watermark.absolute = 1GBdisk_free_limit.absolute = 2GBloopback_users.guest = false

Secret.yaml:
用来存储rabbitmq的用户名、密码及erlang.cookie。
erlang创建步骤:erlang是集群之间互访的秘钥
首先需要生成一个erlang.cookie的文件: echo $(openssl rand -base64 32) > erlang.cookie
然后再生成base64的值 如:echo -n ‘v/sWCz4uKETUvneRyJVn87Jg15si2eGaWg54Yvefhrk=’ |base64

 apiVersion: v1
kind: Secret
metadata:name: devsecretnamespace: test
type: Opaque
data:rabbitDefaulUser: "YWRtaW4="  # echo -n 'admin' |base64rabbitDefaultPass: "YWRtaW4="erlang.cookie: "di96VHZ4VmhOY1Uxc3dzTG4zOHdyMmk2S1IrTG82L2xqUEdTTFUwYmdwVDRBPQ=="

Rbac.yaml:

apiVersion: v1
kind: ServiceAccount  #集群访问apiserver的凭证
metadata:name: rabbitmqnamespace: test
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: endpoint-readernamespace: test
rules:
- apiGroups: [""]resources: ["endpoints"]verbs: ["get"]
---
kind: RoleBinding  #将角色绑定
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: endpoint-readernamespace: test
subjects:
- kind: ServiceAccountname: rabbitmq
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: endpoint-reader

Statefulset.yaml:
要提前创建好挂载目录

apiVersion: apps/v1
kind: StatefulSet
metadata:name: rabbitmqnamespace: test
spec:serviceName: rabbitmq-headlessselector:matchLabels:app: rabbitmq  #在apps/v1中,需与 .spec.template.metadata.label 相同,用于hostname传播访问podreplicas: 3  #副本数3template:metadata:labels:app: rabbitmqspec:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: "app"operator: Invalues:- rabbitmqtopologyKey: "kubernetes.io/hostname"serviceAccountName: rabbitmqterminationGracePeriodSeconds: 10containers:- name: rabbitmqimage: rabbitmq:latestimagePullPolicy: Neverresources:limits:cpu: 1memory: 500Mirequests:cpu: 1memory: 500MivolumeMounts:- name: config-volumemountPath: /etc/rabbitmq- name: rabbitmq-datamountPath: /var/lib/rabbitmq/mnesiaports:- name: httpprotocol: TCPcontainerPort: 15672- name: amqpprotocol: TCPcontainerPort: 5672livenessProbe:exec:command: ["rabbitmq-diagnostics", "status"]initialDelaySeconds: 60periodSeconds: 60timeoutSeconds: 5readinessProbe:exec:command: ["rabbitmq-diagnostics", "status"]initialDelaySeconds: 20periodSeconds: 60timeoutSeconds: 5env:- name: RABBITMQ_DEFAULT_USERvalueFrom:secretKeyRef:key: rabbitDefaulUsername: devsecret                     #登陆用户名和密码都存储在一个secret对象中- name: RABBITMQ_DEFAULT_PASSvalueFrom:secretKeyRef:key: rabbitDefaultPassname: devsecret- name: RABBITMQ_ERLANG_COOKIEvalueFrom:secretKeyRef:name: devsecretkey: erlang.cookie- name: HOSTNAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: MY_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: RABBITMQ_USE_LONGNAMEvalue: "true"- name: K8S_SERVICE_NAMEvalue: "rabbitmq-headless"- name: RABBITMQ_NODENAMEvalue: rabbit@$(HOSTNAME).$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.local- name: K8S_HOSTNAME_SUFFIXvalue: .$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.localvolumes:- name: config-volumeconfigMap:name: rabbitmq-configitems:- key: rabbitmq.confpath: rabbitmq.conf- key: enabled_pluginspath: enabled_plugins- name: rabbitmq-datahostPath:path: /root/rabbitmq/datatype: Directory

Service.yaml

kind: Service
apiVersion: v1
metadata:name: rabbitmq-headlessnamespace: test
spec:clusterIP: NonepublishNotReadyAddresses: trueports:- name: amqpport: 5672- name: httpport: 15672selector:app: rabbitmq---
kind: Service
apiVersion: v1
metadata:namespace: testname: rabbitmq-service
spec:ports:- name: httpprotocol: TCPport: 15672nodePort: 30672  #管理web界面- name: amqpprotocol: TCPport: 5672targetPort: 5672nodePort: 30671selector:app: rabbitmqtype: NodePort

5.3.2 申请资源清单(启动各个yaml文件)

kubectl apply -f rabbitmq-configmap.yaml
kubectl apply -f rabbitmq-secret.yaml
kubectl apply -f rabbitmq-rbac.yaml
kubectl apply -f rabbitmq-sts.yaml
kubectl apply -f rabbitmq-svc.yaml

在这里插入图片描述

5.3.3 访问Rabbirmq页面

http://ip:30672/尝试访问rabbitmq的web页面(需要手动创建用户并授权)
在这里插入图片描述

六、常用命令

  1. 用户管理
        A. 查看用户列表:rabbitmqctl list_users;
        B. 添加用户:rabbitmqctl add_user ;
        C. 修改密码:rabbitmqctl change_password ;
        D. 删除用户:rabbitmqctl delete_user ;
        E. 设置用户角色:
        rabbitmqctl set_user_tags <tag1,tag2>,角色有
        management:用户可以访问management管理插件;
        administrator:所有权限;
        monitoring:用户可以访问management管理插件,查看所有连接、通道以及与节点相关的信息;
        policymaker:用户可以访问management管理插件,并管理他们有权访问的vhost的策略和参数;
  2. 节点与应用管理
        A. 启动rabbitmq应用程序:rabbitmqctl start_app;
        B. 关闭rabbitmq应用程序,但Erlang VM保持运行:rabbitmqctl stop_app;
        C. 关闭所有应用和节点:rabbitmqctl stop;
        D. 将Rabbitmq节点返回到原始状态,包括删除数据:rabbitmqctl reset;
  3. 集群节点
        A. 查看集群状态:rabbitmqctl cluster_status;
        B. 添加节点:rabbitmqctl join_cluster {–ram|–disk} rabbit@node;
        C. 移除节点:rabbitmqctl forget_cluster_node rabbit@node,注意先关闭应用程序rabbitmqctl stop_app;
        D. 节点健康检查:rabbitmqctl node_health_check;
  4. 插件管理
        A. 显示所有插件:rabbitmq-plugins list;
        B. 启用指定的插件:rabbitmq-plugins enable rabbitmq_management rabbitmq_mqtt rabbitmq_prometheus;
  5. 查看有效配置
    A. rabbitmqctl environment

相关文章:

RabbitMQ实战启程:从原理到部署的全方位探索(上)

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1 简单模式3.2 工作模式3.3 发布订阅3.4 路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1 单机部署5.1.1 安装erlang5.1.2 安装rabbitmq 5.2 集群部署&#xff08;镜…...

【论文复现】轻松利用自适应特征融合实现去雾

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 智慧医疗 介绍创新点网络结构特征提取阶段自适应融合阶段图像重建阶段上下文增强模块CEM特征融合模块AFM 结果分析 提示 论文题目&#xff1…...

【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用

1. hbase-phoenix的应用 1.1 概述&#xff1a; 上面我们学会了hbase的操作和原理&#xff0c;以及外部集成的mr的计算方式&#xff0c;但是我们在使用hbase的时候&#xff0c;有的时候我们要直接操作hbase做部分数据的查询和插入&#xff0c;这种原生的方式操作在工作过程中还…...

高级java每日一道面试题-2024年11月09日-缓存中间件篇-Redis和Memecache有什么区别?

如果有遗漏,评论区告诉我进行补充 面试官: Redis和Memecache有什么区别? 我回答: 一、基础特性 数据类型支持 Redis: 支持多种数据类型&#xff0c;包括字符串&#xff08;String&#xff09;、哈希&#xff08;Hash&#xff09;、列表&#xff08;List&#xff09;、集合…...

vscode 关闭绑定元素 隐式具有“any”类型这类错误

在vue的项目里面&#xff0c;经常看到any类型的报错&#xff0c;真的很烦的 在tsconfig.json中配置以下参数 “noImplicitAny”: false 就可以了 出现类型“never”上不存在属性“userName”。ts-plugin(2339) 配置该参数 modeuleResolution : node "compilerOptions&qu…...

手机ip地址异常怎么解决

在现代社会中&#xff0c;手机已成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;都离不开网络的支持。然而&#xff0c;有时我们会遇到手机IP地址异常的问题&#xff0c;这不仅会影响我们的网络体验&#xff0c;还可能带来安全隐患。本文…...

【售前方案】工业园区整体解决方案,智慧园区方案,智慧城市方案,智慧各类信息化方案(ppt原件)

基于云计算、物联网、移动通信计算的智慧园区集中运营管理平台是一个高度集成化、智能化的管理系统&#xff0c;它利用先进的技术手段对园区进行全方位的监控和管理。 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审…...

37.超级简易的计算器 C语言

超级简单&#xff0c;简单到甚至这个计算器输入都比较反人类 但是足够简单 有输入功能有Switch语句支持四种运算还能检查除数是不是0还能打印出完整的式子 #define _CRT_SECURE_NO_WARNINGS// 禁用安全警告 #include <stdio.h>int main() {double num1, num2;// 声明两…...

防火墙----iptables

防火墙是位于内部网和外部网之间的屏障&#xff0c;他按照系统管理员预先定义好的规则来控制数据包的进出 一、iptables简介 防火墙会从以上至下的顺序来读取配置的策略规则&#xff0c;在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为&#xff08;即放行或阻止&…...

若点集A=B则A必能恒等变换地变为B=A这一几何常识推翻直线(平面)公理

黄小宁 关键词&#xff1a;“更无理”复数 复平面z各点z的对应点z1的全体是z1面。z面平移变为z1面就使x轴⊂z面沿本身平移变为ux1轴。R可几何化为R轴&#xff0c;R轴可沿本身平移变为R′轴&#xff0c;R′轴可沿本身平移变为R″轴&#xff0c;...。直线公理和平面公理使几百年…...

网络安全之WINDOWS端口及病毒编写

目录 一、常见端口和服务 二、Windows病毒编写 声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判…...

Flink 开发工程应加载哪些依赖

在我们要开发Flink程序时,就会涉及到应该加载哪些Flink jar的问题。本章内容就是向你展示如何配置你的项目,添加必要的依赖。 每个应用程序都会依赖一些 Flink libraries,比如至少依赖 Flink APIs库,如果使用了connector,则还需要依赖connector相关的库,比如kafka、jdbc…...

wordpress建外贸独立站常用的多语言插件

WordPress是一个功能强大的内容管理系统&#xff0c;对于外贸独立站来说&#xff0c;多语言支持是非常重要的功能。以下是一些常用的WordPress多语言插件&#xff1a; 1. WPML (WordPress Multilingual) 这是最流行且功能最全面的多语言插件之一。它支持翻译整个网站&#xf…...

[SpB]如何开始使用 Spring Boot?

如何开始使用 Spring Boot&#xff1f; Spring Boot 简化了 Java 项目开发&#xff0c;你只需要专注于业务逻辑&#xff0c;底层的很多配置和功能由 Spring Boot 自动帮你处理。下面是你如何快速上手 Spring Boot 的步骤&#xff0c;以及如何通过 IDEA 了解 Spring Boot 的功能…...

蓝桥杯模拟

【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#xff0c;在提交答案时只…...

数字化转型企业架构设计手册(交付版),企业数字化转型建设思路、本质、数字化架构、数字化规划蓝图(PPT原件获取)

1、企业架构现状分析 2、企业架构内容框架 3、企业架构设计方法 3.1 、业务架构设计方法 3.2 、数据架构设计方法 3.3 、应用架构设计方法 3.4 、技术架构设计方法 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&…...

2. langgraph中的react agent使用 (在react agent添加历史消息)

1. 导入必要的库 首先&#xff0c;我们需要导入所需的库。这里我们使用 langchain_openai 来与 智谱AI 模型进行交互&#xff0c;并使用 langchain_core.tools 来定义自定义工具。 from langchain_openai import ChatOpenAI from typing import Literal from langchain_core.…...

MySQL社区版的启动与连接

1.启动&#xff1a; 注意&#xff1a;MySQL是默认开机自启的 方式一&#xff1a; 1.WinR 的命令行中直接输入services.msc 2.在服务中找到数据库名称&#xff0c;然后鼠标右键点击启动 方式二&#xff1a; 1.在开始选项中搜索“cmd”命令提示符&#xff0c;使用管理员身份运行 …...

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing

tips&#xff1a; 本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title&#xff1a; Content-Aware Scalable Deep Compressed Sensing Journal&#xff1a; TIP 2022 代码链接&#xff1a; https://github.com/Guaishou74851/CASNet…...

物理hack

声明 声明 文章只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致力于网络安全领域&#xff0c;目前作为一名学习者&#xff0c;很荣…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...