RabbitMQ(集群相关部署)

RabbitMQ

集群部署

环境准备:阿里云centos8 服务器,3台服务器,分别进行安装;

下载Erlang

ErlangRabbitMQ版本对照:https://www.rabbitmq.com/which-erlang.html

  1. 创建yum库配置文件
vim /etc/yum.repos.d/rabbitmq.repo
  1. 内容
# 内容 - 来自官方文档:https://www.rabbitmq.com/docs/install-rpm
# In /etc/yum.repos.d/rabbitmq.repo
##
## Zero dependency Erlang RPM
##
[modern-erlang]
name=modern-erlang-el8
# uses a Cloudsmith mirror @ yum.novemberain.com in addition to its Cloudsmith upstream.
# Unlike Cloudsmith, the mirror does not have any traffic quotas
baseurl=https://yum1.novemberain.com/erlang/el/8/$basearch
        https://yum2.novemberain.com/erlang/el/8/$basearch
        https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/rpm/el/8/$basearch
repo_gpgcheck=1
enabled=1
gpgkey=https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key
gpgcheck=1
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1
type=rpm-md

[modern-erlang-noarch]
name=modern-erlang-el8-noarch
# uses a Cloudsmith mirror @ yum.novemberain.com.
# Unlike Cloudsmith, it does not have any traffic quotas
baseurl=https://yum1.novemberain.com/erlang/el/8/noarch
        https://yum2.novemberain.com/erlang/el/8/noarch
        https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/rpm/el/8/noarch
repo_gpgcheck=1
enabled=1
gpgkey=https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key
       https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc
gpgcheck=1
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1
type=rpm-md

[modern-erlang-source]
name=modern-erlang-el8-source
# uses a Cloudsmith mirror @ yum.novemberain.com.
# Unlike Cloudsmith, it does not have any traffic quotas
baseurl=https://yum1.novemberain.com/erlang/el/8/SRPMS
        https://yum2.novemberain.com/erlang/el/8/SRPMS
        https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/rpm/el/8/SRPMS
repo_gpgcheck=1
enabled=1
gpgkey=https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key
       https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc
gpgcheck=1
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1


##
## RabbitMQ Server
##

[rabbitmq-el8]
name=rabbitmq-el8
baseurl=https://yum2.novemberain.com/rabbitmq/el/8/$basearch
        https://yum1.novemberain.com/rabbitmq/el/8/$basearch
        https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/rpm/el/8/$basearch
repo_gpgcheck=1
enabled=1
# Cloudsmith's repository key and RabbitMQ package signing key
gpgkey=https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key
       https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc
gpgcheck=1
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1
type=rpm-md

[rabbitmq-el8-noarch]
name=rabbitmq-el8-noarch
baseurl=https://yum2.novemberain.com/rabbitmq/el/8/noarch
        https://yum1.novemberain.com/rabbitmq/el/8/noarch
        https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/rpm/el/8/noarch
repo_gpgcheck=1
enabled=1
# Cloudsmith's repository key and RabbitMQ package signing key
gpgkey=https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key
       https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc
gpgcheck=1
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1
type=rpm-md

[rabbitmq-el8-source]
name=rabbitmq-el8-source
baseurl=https://yum2.novemberain.com/rabbitmq/el/8/SRPMS
        https://yum1.novemberain.com/rabbitmq/el/8/SRPMS
        https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/rpm/el/8/SRPMS
repo_gpgcheck=1
enabled=1
gpgkey=https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key
gpgcheck=0
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1
type=rpm-md
  1. 更新yum库
# --nobest表示所需安装包即使不是最佳选择也接受
yum update -y --nobest
  1. 进行安装
yum install -y erlang

安装RabbitMQ

ErlangRabbitMQ版本对照:https://www.rabbitmq.com/which-erlang.html

# 导入GPG密钥,如失败多重试几次
rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc'
rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key'
rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key'

# 下载 RPM 包
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.0/rabbitmq-server-3.13.0-1.el8.noarch.rpm

# 安装
rpm -ivh rabbitmq-server-3.13.0-1.el8.noarch.rpm

进行配置

# 启用管理界面插件
rabbitmq-plugins enable rabbitmq_management

# 启动 RabbitMQ 服务:
systemctl start rabbitmq-server

# 将 RabbitMQ 服务设置为开机自动启动
systemctl enable rabbitmq-server

# 新增登录账号密码 - 用户名 密码
rabbitmqctl add_user yan 123456

# 设置登录账号权限,该用户设置角色是administrator管理员。再设置权限
rabbitmqctl set_user_tags yan administrator
rabbitmqctl set_permissions -p / yan ".*" ".*" ".*"

# 配置所有稳定功能 flag 启用
rabbitmqctl enable_feature_flag all

# 重启RabbitMQ服务生效
systemctl restart rabbitmq-server

# 停止RabbitMQ服务
rabbitmqctl stop_app

首尾配置

# 删除yum库配置文件,避免下次yum安装在执行一遍
rm -rf /etc/yum.repos.d/rabbitmq.repo

# 分别在不同服务器修改主机名称
vim /etc/hostname
# 分别起名 node1、node2、node3
# 例子:机器1,该文件/etc/hostname 下 填写node1
#      机器2,该文件/etc/hostname 下 填写node2
#      机器3,该文件/etc/hostname 下 填写node3

集群配置

机器1配置:

  1. 分别在3台机器设置IP 地址到对应主机名称的映射

    修改文件/etc/hosts,追加如下内容:

    ip1 node01
    ip2 node02
    ip3 node03
    
  2. 查看该MQ的Cookie值并记录

    cat /var/lib/rabbitmq/.erlang.cookie
    # 并记录该值,后续机器2,机器3上的cookie值保持一致
    
  3. 重置节点应用

    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl start_app
    

机器2配置:

  1. 分别在3台机器设置IP 地址到对应主机名称的映射

    修改文件/etc/hosts,追加如下内容:

    ip1 node01
    ip2 node02
    ip3 node03
    
  2. 查看该MQ的Cookie值并记录

    cat /var/lib/rabbitmq/.erlang.cookie
    # 把机器1上的cookie值复制到这里,与机器1保持一致
    
  3. 重置节点应用,并加入集群

    rabbitmqctl stop_app
    rabbitmqctl reset
    # 加入集群,去node01机器上找rabbit的程序,进行加入
    rabbitmqctl join_cluster rabbit@node01
    rabbitmqctl start_app
    

机器3配置:

  1. 分别在3台机器设置IP 地址到对应主机名称的映射

    修改文件/etc/hosts,追加如下内容:

    ip1 node01
    ip2 node02
    ip3 node03
    
  2. 查看该MQ的Cookie值并记录

    cat /var/lib/rabbitmq/.erlang.cookie
    # 把机器1上的cookie值复制到这里,与机器1保持一致
    
  3. 重置节点应用,并加入集群

    rabbitmqctl stop_app
    rabbitmqctl reset
    # 加入集群,去node01机器上找rabbit的程序,进行加入
    rabbitmqctl join_cluster rabbit@node01
    rabbitmqctl start_app
    
  4. 查看集群状态

    rabbitmqctl cluster_status
    # 也可以在图形化界面上,查看集群节点,在Nodes这里查看集群节点
    

负载均衡

一般MQ的服务端口5672、UI管理界面端口15672

浏览器访问,某个端口,通过HAProxy工具,进行分流每个节点的15672端口上,进行管理UI上的负载均衡;

服务端访问,某个端口,通过HAProxy工具,进行分流每个节点的5672端口上,进行服务端的负载均衡;

安装HAProxy

yum install -y haproxy
# 查看安装的版本
haproxy -v
# 启动该程序
systemctl start haproxy
# 设置该服务开机自动启动
systemctl enable haproxy

修改配置文件

  1. 修改配置文件

    vim /etc/haproxy/haproxy.cfg
    

    文件内容:

    # 在最后一行添加该内容,该部分配置UI管理器上的负载均衡
    # 起MQ的UI的名字(rabbitmq_ui_frontend),前端部分配置
    frontend rabbitmq_ui_frontend
    # 绑定一个地址,端口号,外部浏览器访问该IP地址和端口后,然后通过HAProxy进行转发
    bind 192.168.xxx.xxx:22222
    # http协议
    mode http
    # 默认的后端服务名,使用下面的名字
    default_backend rabbitmq_ui_backend
    
    # 起MQ的服务端的名字(rabbitmq_ui_backend)
    backend rabbitmq_ui_backend
    # http协议
    mode http
    # 启用轮询的负载均衡
    balance roundrobin
    option httpchk GET /
    # 分别设置,不同的MQ服务节点的IP地址
    server rabbitmq_ui1 192.168.xxx.1:15672 check
    server rabbitmq_ui2 192.168.xxx.2:15672 check
    server rabbitmq_ui3 192.168.xxx.3:15672 check
    
    # 配置服务端(生产者、消费者)的负载均衡
    # 服务端(生产者、消费者)的名字
    frontend rabbitmq_frontend
    # 绑定一个地址,端口号,服务端(生产者、消费者)访问该IP地址和端口后,然后通过HAProxy进行转发
    bind 192.168.xxx.xxx:11111
    # tcp协议
    mode tcp
    default_backend rabbitmq_backend
    # 与上面的名字保持一致
    backend rabbitmq_backend
    # tcp协议
    mode tcp
    # 启用轮询的负载均衡
    balance roundrobin
    # 分别设置,不同的MQ服务节点的IP地址
    server rabbitmq1 192.168.xxx.1:5672 check
    server rabbitmq2 192.168.xxx.2:5672 check
    server rabbitmq3 192.168.xxx.3:5672 check
    
  2. 设置SELinux策略,允许HAProxy拥有权限连接任意端口:

    # 保存上面的配置文件,执行下面
    setsebool -P haproxy_connect_any=1
    

    SELinux是Linux系统中的安全模块,它可以限制进程的权限以提高系统的安全性。在某些情况下,SELinux可能会阻止HAProxy绑定指定的端口,这就需要通过设置域(domain)的安全策略来解决此问题。通过执行setsebool -P haproxy_connect_any=1命令,您已经为HAProxy设置了一个布尔值,允许HAProxy连接到任意端口。这样,HAProxy就可以成功绑定指定的socket,并正常工作。

  3. 重启HAProxy

    systemctl restart haproxy
    

配置成功

# 访问MQ管理UI页面:
http://192.168.xxx.xxx:22222
# 生产者、消费者服务连接MQ
  rabbitmq:
    host: 192.168.xxx.xxx
    port: 11111
    username: guest
    password: 123456
# 可通过生产者发送消息,监听消费者是否接受到消息

仲裁队列

仲裁队列是3.8版本以后才有的新功能,是主从模式,支持主从数据同步,在添加队列,队列类型为Quorum就是仲裁队列。

创建交换机

与之前创建普通交换机一致

创建仲裁队列
在这里插入图片描述

绑定交换机

与之前的一致

验证,停止某个节点

# 停止rabbit应用
rabbitmqctl stop_app
# 我们在某个节点进行停止MQ,然后生产者发送消息,查看消费者是否可以接受到,判断集群的数据一致性
# 默认,主节点挂掉,默认重新选举新的主节点

流式队列

流式队列是3.9版本以后才有的新功能,每个消息都分配一个偏移量,该消息被消费掉也不会被删除,可以重复消费;类似Kafka,但没有达到Kafka的效果。

前提准备 - 安装相关插件

# 启用Stream插件
rabbitmq-plugins enable rabbitmq_stream

# 重启rabbit应用
rabbitmqctl stop_app
rabbitmqctl start_app

# 查看插件状态
rabbitmq-plugins list

负载均衡配置

frontend rabbitmq_stream_frontend
bind 192.168.xxx.100:33333
mode tcp
default_backend rabbitmq_stream_backend

backend rabbitmq_stream_backend
mode tcp
balance roundrobin
# 它的端口是5552
server rabbitmq1 192.168.xxx.1:5552 check
server rabbitmq2 192.168.xxx.1:5552 check
server rabbitmq3 192.168.xxx.2:5552 check

JAVA相关代码

// 引包
<dependencies>
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>stream-client</artifactId>
        <version>0.15.0</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.30</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
</dependencies>

创建Stream,不需要创建交换机

// 代码创建
Environment environment = Environment.builder()
        .host("192.168.xxx.1")
        .port(33333)
        .username("用户名")
        .password("密码")
        .build();

environment.streamCreator().stream("stream.atguigu.test2").create();
environment.close();

通过管理UI页面创建的话,队列类型选择:Stream

生产者

Environment environment = Environment.builder()
        .host("192.168.xxx.1")
        .port(33333)
        .username("用户名")
        .password("密码")
        .build();

Producer producer = environment.producerBuilder()
        // 队列名称
        .stream("stream.test")
        .build();
// 消息内容
byte[] messagePayload = "hello rabbit stream".getBytes(StandardCharsets.UTF_8);

CountDownLatch countDownLatch = new CountDownLatch(1);
producer.send(
        producer.messageBuilder().addData(messagePayload).build(),
        confirmationStatus -> {
            if (confirmationStatus.isConfirmed()) {
                System.out.println("[生产者端]the message made it to the broker");
            } else {
                System.out.println("[生产者端]the message did not make it to the broker");
            }
            countDownLatch.countDown();
        });

countDownLatch.await();
producer.close();
environment.close();

消费者

Environment environment = Environment.builder()
        .host("192.168.xxx.1")
        .port(33333)
        .username("用户名")
        .password("密码")
        .build();
environment.consumerBuilder()
    	// 队列名称
        .stream("stream.test")
    	// 这个是消费端起名字
        .name("stream.test.consumer")
        .autoTrackingStrategy()
        .builder()
        .messageHandler((offset, message) -> {
            // 接受消息
            byte[] bodyAsBinary = message.getBodyAsBinary();
            String messageContent = new String(bodyAsBinary);
            System.out.println("[消费者端]messageContent = " + messageContent + " Offset=" + offset.offset());
        })
        .build();

指定偏移量消费

// 指定Offset消费
Environment environment = Environment.builder()
        .host("192.168.xxx.1")
        .port(33333)
        .username("用户名")
        .password("密码")
        .build();

CountDownLatch countDownLatch = new CountDownLatch(1);
Consumer consumer = environment.consumerBuilder()
        .stream("stream.test")
        .offset(OffsetSpecification.first())
        .messageHandler((offset, message) -> {
            byte[] bodyAsBinary = message.getBodyAsBinary();
            String messageContent = new String(bodyAsBinary);
            System.out.println("[消费者端]messageContent = " + messageContent);
            countDownLatch.countDown();
        })
        .build();

countDownLatch.await();
consumer.close();

Federation插件

它是MQ在不同的Broker节点之间进行消息传递而无须建立集群,可以实现跨集群的数据同步。

Federation交换机

  1. 前提准备:启用该插件、分为上游和下游,创建2个独立的MQ服务;

    # 使用docker进行安装MQ1服务
    docker run -d \
    --name rabbitmq-shenzhen \
    -p 51000:5672 \
    -p 52000:15672 \
    -v rabbitmq-plugin:/plugins \
    -e RABBITMQ_DEFAULT_USER=guest \
    -e RABBITMQ_DEFAULT_PASS=123456 \
    rabbitmq:3.13-management
    
    # 使用docker进行安装MQ2服务
    docker run -d \
    --name rabbitmq-shanghai \
    -p 61000:5672 \
    -p 62000:15672 \
    -v rabbitmq-plugin:/plugins \
    -e RABBITMQ_DEFAULT_USER=guest \
    -e RABBITMQ_DEFAULT_PASS=123456 \
    rabbitmq:3.13-management
    
  2. 启用插件

    # 分别在2台MQ服务,进行安装该插件
    rabbitmq-plugins enable rabbitmq_federation
    rabbitmq-plugins enable rabbitmq_federation_management
    

    安装完插件,在右侧菜单栏可看到

  3. 添加上游连接端点

    下游的MQ服务,进行操作,点击右侧Federation Upstreams,进行添加,需要起一个上游的连接点名字,(federation-upstreams),URL填写:amqp://用户名:密码@访问ip:端口 (是上游的可访问的地址)

    在这里插入图片描述

  4. 创建控制策略

    进行配置,在下游的MQ服务,进行操作

    在这里插入图片描述

  5. 验证

    # 需要满足:
    # 普通交换机和联邦交换机名称要一致
    # 交换机名称要能够和策略正则表达式匹配上
    # 发送消息时,两边使用的路由键也要一致
    # 队列名称不要求一致
    

    在这里插入图片描述
    生产者(上游)发送消息、消息会被上游(MQ)的队列接收到,然后下游(MQ)的队列也会接受到消息;

    满足不同集群进行数据同步;

Federation队列

Federation队列和Federation交换机的最核心区别就是:

  • Federation Police作用在交换机上,就是Federation交换机
  • Federation Police作用在队列上,就是Federation队列

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Soong 构建系统

背景 Soong 构建系统在Android 7.0开始引入&#xff0c;目的是取代Make。它利用Kati GNU Make 和Ninja构建系统组件来构建Android Soong是用Go语言写的&#xff0c;go环境在prebuilts/go环境下&#xff0c;Soong在编译时&#xff0c;解析bp文件&#xff0c;转化成Ninja文件&am…

互联网留给网站建设的,也就一个门缝了,抓紧往高端进发吧。

高端定制网站具有以下价值&#xff1a; 独特性&#xff1a;高端定制网站能够根据企业的品牌形象和定位进行设计&#xff0c;呈现独特的风格和用户体验。这有助于提升企业的品牌形象和差异化竞争力&#xff0c;使企业在竞争激烈的市场中脱颖而出。用户体验&#xff1a;高端定制…

vue-使用Worker实现多标签页共享一个WebSocket

文章目录 前言一、SharedWorker 是什么SharedWorker 是什么SharedWorker 的使用方式SharedWorker 标识与独占 二、Demo使用三、使用SharedWorker实现WebSocket共享 前言 最近有一个需求&#xff0c;需要实现用户系统消息时时提醒功能。第一时间就是想用WebSocket进行长连接。但…

14-47 剑和诗人21 - 2024年如何打造AI创业公司

​​​​​ 2024 年&#xff0c;随着人工智能继续快速发展并融入几乎所有行业&#xff0c;创建一家人工智能初创公司将带来巨大的机遇。然而&#xff0c;在吸引资金、招聘人才、开发专有技术以及将产品推向市场方面&#xff0c;人工智能初创公司也面临着相当大的挑战。 让我来…

下一代 CLI 工具,使用Go语言用于构建令人惊叹的网络应用程序

大家好&#xff0c;今天给大家分享一个创新的命令行工具Gowebly CLI&#xff0c;它专注于使用Go语言来快速构建现代Web应用程序。 Gowebly CLI 是一款免费开源软件&#xff0c;有助于在后端使用 Go、在前端使用 htmx 和 hyperscript 以及最流行的 CSS 框架轻松构建令人惊叹的 W…

Maven Nexus3 私服搭建、配置、项目发布指南

maven nexus私服搭建 访问nexus3官方镜像库,选择需要的版本下载:Docker Nexus docker pull sonatype/nexus3:3.49.0 创建数据目录并赋权 sudo mkdir /nexus-data && sudo chown -R 200 /nexus-data 运行(数据目录选择硬盘大的卷进行挂载) docker run -d -p 808…

AI集成工具平台一站式体验,零门槛使用国内外主流大模型

目录 0 写在前面1 AI艺术大师1.1 绘画制图1.2 智能作曲 2 AI科研助理2.1 学术搜索2.2 自动代码 3 AI智能对话3.1 聊天机器人3.2 模型竞技场 4 特别福利 0 写在前面 人工智能大模型浪潮滚滚&#xff0c;正推动着千行百业的数智化进程。随着技术演进&#xff0c;2024年被视为是大…

数据库开发:mysql基础一

文章目录 数据库开发Day15&#xff1a;MySQL基础&#xff08;一&#xff09;一、MySQL介绍与安装【1】MySQL介绍&#xff08;5&#xff09;启动MySQL服务&#xff08;6&#xff09;修改root登陆密码 二、SQL简介三、数据库操作四、数据表操作4.1、数据库数据类型4.2、创建数据表…

tomcat原理、结构、设计模式

1 what 一种web服务器&#xff0c;运行java servlet、jsp技术&#xff0c;能为java web提供运行环境并通过http协议处理客户端请求。即tomcat http服务器 servlet容器。同类产品有jetty Web应用&#xff1a;Web应用是指通过Web浏览器访问的应用程序&#xff0c;它使用Web技术…

c#类型转换和常见集合类型

目录 1. 整数转换&#xff0c;整数和字符串&#xff0c;字符串和整数之间的转换怎么实现&#xff1f; 2. 日期转换&#xff0c;获取当前日期&#xff0c;字符串转日期&#xff0c;日期转字符串怎么实现&#xff1f; 3. 举例一维、二维、三维数组 4. 需求&#xff1a;有个88…

【嵌入式单片机】之RS-232、RS-485、RS-422比较

1. RS422是什么 RS422,正式名称为TIA/EIA-422,是一种串行通信标准,专为实现长距离、高可靠性的数据传输而设计。它采用差分信号传输技术,通过两对双绞线实现全双工通信,即发送和接收可以同时进行。RS422在工业自动化和远程监控系统中曾经扮演着重要角色,以其出色的抗干扰…

p标签文本段落中因编辑器换行引起的空格问题完美解决方案

目录 1.修改前的代码&#xff1a;2.修改后的代码3.总结 在HTML文档中&#xff0c;如何要在&#xff08;p标签&#xff09;内写一段很长的文本段落&#xff0c;并且没有 换行。由于IDE或者编辑器界面大小有限或需要在vue中逻辑处理动态显示文本&#xff0c;一行写完太长&#x…

14-46 剑和诗人20 – 减少幻觉的提示词工程

​​​​​ 概述 幻觉或“编造”是大型语言模型 (LLM) 的常见故障模式&#xff0c;它们会产生事实上不正确或无意义的内容。幻觉背后的一些主要原因是&#xff1a; 当模型不确定真正的答案时&#xff0c;它会试图通过捏造信息来提供过度的帮助。该模型缺乏适当的基础、背景和…

YOLOv5、v7、v8如何修改检测框文字颜色和大小

YOLOv5和YOLOv8默认的标签文字颜色为白色&#xff0c;但是在亮度较大的图片中文字不明显&#xff0c;就需要对标签文字的颜色进行修改 一、YOLOv5 打开X:\Anaconda\envs\your-env\Lib\site-packages\ultralytics\utils\plotting.py X代表你的anaconda安装的盘&#xff0c;yo…

格蠹汇编阅读理解

一、调试工具使用方式 WinDbg常用命令&#xff1a; 执行 lm 命令&#xff0c;可以看到进程中有几个模块。执行~命令列一下线程。用!heap 命令列一下堆。执行!address 命令可以列出用户态空间中的所有区域。搜索吧&#xff01;就从当前进程用户态空间的较低地址开始搜&#xf…

基于大数据技术Hadoop的气象分析可视化大屏设计和实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

Android - 手势

Android 提供特殊类型的触摸屏事件&#xff0c;例如捏合、双击、滚动、长按和退缩。 这些都被称为手势。 Android 提供了 GestureDetector 类来接收运动事件并告诉我们这些事件是否对应手势。 要使用它&#xff0c;您需要创建一个 GestureDetector 对象&#xff0c;然后使用 Ge…

SpringBoot源码阅读(1)——环境搭建

SpringBoot官网 官网 https://spring.io/projects/spring-boot 代码仓库 github&#xff1a;https://github.com/spring-projects/spring-boot gitee: https://gitee.com/mirrors/spring-boot 下载代码 git clone https://gitee.com/mirrors/spring-boot.git下载的代码中有些…

如何看自己电脑的ip地址?这些方法教你搞定

在数字化时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。对于每一个接入网络的设备来说&#xff0c;IP地址就像是一个独特的身份证&#xff0c;它标识着设备在网络中的位置。对于电脑用户而言&#xff0c;了解如何查看自己电脑的IP地址&#xff0c;不仅有助于我们更…

满足信创环境运行的国产FTP服务器是什么样的?

2018 年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;我国科技尤其是上游核心技术受制于人的现状对我 国经济发展提出了严峻考验。在全球产业从工业经济向数字经济升级的关键时期&#xff0c;中国明确 “数字中国”建设战略&#xff0c; 抢占数字经济产业链制高点。 在…