分布式文件系统FastDFS实战

news2024/12/23 14:55:19

1. 分布式文件系统应用场景

  • 互联网海量非结构化数据的存储需求:
    1. 电商网站:海量商品图片
    2. 视频网站:海量视频文件
    3. 网盘:海量文件
    4. 社交网站:海量图片

2.FastDFS介绍

https://github.com/happyfish100/fastdfs

2.1简介

  • FastDFS 是一个开源的高性能分布式文件系统(DFS)。它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB< file_size< 500MB)为载体的在线服务
  • FastDFS设计是用来存储小文件的,过大的文件处理方案是拆分为小文件,可跟踪小文件的上传情况。如果应用场景都是外理大文件,可以选择其他分布式文件系统方案会更合适。

2.2 特性

  • FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
  • 优点:
    1. 文件不分块存储,文件和系统中的文件一一对应。
    2. 对文件内容做hash处理,避免出现重复文件,节约磁盘空间。
    3. 下载文件支持HTTP协议,可基于内置Web Server或外部Web Server。
    4. 支持在线扩容,动态添加卷。
    5. 支持文件冗余备份和负载均衡。
    6. 存储服务器上可以保存文件属性 (meta-data)。
    7. V2.0 网络通信采用libevent,支持高并发访问,整体性能更好。
  • 缺点:
    1. 直接按文件存储,可直接查看文件内容,缺乏文件安全性。
    2. 数据同步无校验,存在静默IO问题,降低系统可用性。
    3. 单线程数据同步,仅适合存储小文件 (4KB到500MB之间)。
    4. 备份数根据存储分卷(分组)决定,缺乏文件备份数设置灵活性。
    5. 单个挂载点异常会导致整个存储节点下线。
    6. 缺乏多机房容灾机制。
    7. 静态的负载均衡机制。
  • 优点与缺点并存,但针对中小型系统已经完全足够使用了。

2.3. 角色

  • Tracker Server: 跟踪服务器,主要做调度工作,起到均衡的作用。负责管理所有的 storage servergroup,每个 storage 在启动后会连接Tracker,告知自己所属 group 等信息,并保持周期性心跳。
  • Storage Server: 存储服务器,主要提供容量和备份服务;以 group 为单位,每个group 内可以有多台 storage server,数据互为备份。
  • client: 客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
    在这里插入图片描述
  • Tracker相当于一个调度中心,上传和下载都通过它来进行分配指定
  • Storage cluster部分,由Volume1、Volume2…VolumeK组成,它们称为卷(或者叫做组),卷与卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。

2.4. 存储策略:

  • 为了支持大容量,存储节点 (服务器) 采用了分卷 (或分组) 的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
  • 在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

2.5. 上传过程:

  • 当服务启动之后,Storage Server会定期的向Tracker Server发送存储信息如果Tracker Server是集群形式,则每个Tracker之间的关系是对等的,客户端上传时选择任意一个Tracker即可。
  • 整体流程:当客户端请求Tracker进行上传操作时,会获取存储服务器相关信息,主要包括IP和端口。根据返回信息上传文件,通过存储服务器写入磁盘,并返回给客户端file_id、路径信息、文件名等信息。
  • 对应流程图如下:

在这里插入图片描述

  • 其中,当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server
  • 当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid最后根据以上的信息生成文件名存储文件。
  • 生成的文件名基本格式如下:
    在这里插入图片描述
  • 组名:文件上传后所在的 storage 组名称,在文件上传成功后有 storage 服务器返回,需要客户端自行保存。
  • 虚拟磁盘路径storage 配置的虚拟路径,与磁盘选项 store_path*对应。如果配置了store_path0 则是 M00,如果配置了store_path1则是M01,以此类推。
  • 数据两级目录storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
  • 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含源存储 服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

2.6文件同步

  • 写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server
  • 每个storage写文件后,同时会写一份binlogbinlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步,进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
  • storage的同步进度会作为元数据的一部分汇报到traker上,tracke在选择读storage的时候会以同步进度作为参考。

2.7下载过程

  • 跟上传一样,在下载时客户端可以选择任意Tracker server
  • 客户端带文件名信息请求TrackerTracker从文名中解析出文件的group、大小、创建时间等信息,然后选择一个storage用来服务处理请求,返回对应文件。
  • 对应流程图如下:
    在这里插入图片描述
  • 如果是基于Web的http请求,此处的Client可以是Nginx代理服务。下面这张图更加形象的描述了相关的流程。

在这里插入图片描述

3.FastDFS环境搭建

3.1环境准备

3.1.1. 使用的系统软件

名称说明
centos7.X
libfastcommonFastDFS分离出的一些公用函数包
FastDFSFastDFS本体
fastdfs-nginx-moduleFastDFS和nginx的关联模块
nginxnginx-1.16.1

3.1.2. 编译环境:

yum  -y   install git gcc gcc-c++ make automake autoconf 1ibtool pcre pcre-devel zlib zlib-devel openssl-devel  wget  vim   

3.1.3. 磁盘目录

说明位置
所有安装包/usr/local/soft/
数据存储位置/data/fastdfs/

3.1.4. 安装libfastcommon

mkdir  /usr/local/soft/
cd   /usr/local/soft
#下载libfastcommon源码包
wget  https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
tar -xf libfastcommon-1.0.7.tar.gz
cd libfastcommon-1.0.7 
#编译安装:
./make.sh && ./make.sh insta11

3.1.5. 安装FastDFS

cd   /usr/local/soft
#下载fastdfs源码包
wget   https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
cd fastdfs-5.05/
#编译安装
./make.sh && ./make.sh insta11


#供nginx访问使用
cp -r  /usr/local/soft/fastdfs-5.05/conf/http.conf  /etc/fdfs/
cp -r  /usr/local/soft/fastdfs-5.05/conf/mime.types /etc/fdfs/
	

3.1.6. 安装fastdfs-nginx-module

fastdfs-nginx-module下载

在这里插入图片描述

#下载nginx模块:
tar -xf fastdfs-nginx-module_v1.16.tar.gz

cp  -r /usr/local/soft/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

3.1.7. 安装nginx

#下载nginx源码
wget  https://nginx.org/download/nginx-1.16.1.tar.gz
tar -xf nginx-1.16.1.tar.gz
cd nginx-1.16.1/
#预编译添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/soft/fastdfs-nginx-module/src/
#编译安装
make && make install
  • 编译时报错如下:
In file included from /usr/local/soft/fastdfs-nginx-module/src//common.c:26:0,
                 from /usr/local/soft/fastdfs-nginx-module/src//ngx_http_fastdfs_module.c:6:
/usr/include/fastdfs/fdfs_define.h:15:27: fatal error: common_define.h: No such file or directory
 #include "common_define.h"
                           ^
compilation terminated.

在这里插入图片描述

  • 解决方法如下:
    fastdfs-nginx-module/src/configCORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" 去掉local
    修改如下:
vim /usr/local/soft/fastdfs-nginx-module/src/config
...

CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
...
  • 继续安装nginx
cd  /usr/local/soft/nginx-1.16.1
#预编译添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/soft/fastdfs-nginx-module/src/
#编译安装
make && make install

3.2. 单机部署

  • 服务器IP地址:192.168.2.10
#添加域名方便管理
vim /etc/hosts
192.168.2.10   fastdfs.com

3.2.1. tracker配置:

mkdir  -p /data/fastdfs/
cp -r  /etc/fdfs/tracker.conf.sample  /etc/fdfs/tracker.conf
vim  /etc/fdfd/tracker.conf
修改如下:
base_path=/data/fastdfs/
  • tracker.conf配置文件详解:
disabled=false   #标识是否禁用,这里设置为 false 表示启用

bind_addr=     #绑定地址,留空表示绑定所有可用地址   

port=22122   #监听端口号

connect_timeout=30     #连接超时时间,单位为秒

network_timeout=60     #网络超时时间,单位为秒

base_path=/data/fastdfs/    #存储文件的基本路径

max_connections=256       #最大连接数

accept_threads=1      #接受连接的线程数

work_threads=4     #工作线程数

store_lookup=2     #存储查找方式

store_group=group2   #存储组名

store_server=0      #存储服务器编号
 
store_path=0      #存储路径编号  

download_server=0      #下载服务器编号

reserved_storage_space = 10%    #保留存储空间的百分比

log_level=info    #日志级别,这里设置为 info

run_by_group=      #运行用户组

run_by_user=      #运行用户名

allow_hosts=*     #允许连接的主机,这里设置为全部允许

sync_log_buff_interval = 10    #同步日志缓冲间隔,单位为秒

check_active_interval = 120    #检查活跃状态的间隔时间,单位为秒

thread_stack_size = 64KB    #线程栈大小  

storage_ip_changed_auto_adjust = true       #存储 IP 变化自动调整的开关,这里设置为 true

storage_sync_file_max_delay = 86400   #存储同步文件最大延迟时间,单位为秒

storage_sync_file_max_time = 300   #存储同步文件最大时间,单位为秒

use_trunk_file = false    #是否使用扩展文件

slot_min_size = 256    #槽位最小尺寸

slot_max_size = 16MB   #槽位最大尺寸

trunk_file_size = 64MB   #扩展文件大小

trunk_create_file_advance = false   #是否提前创建扩展文件

trunk_create_file_time_base = 02:00   #扩展文件创建时间的基准,这里设置为凌晨 2 点

trunk_create_file_interval = 86400   #扩展文件创建间隔,单位为秒

trunk_create_file_space_threshold = 20G   #扩展文件空间阈值

trunk_init_check_occupying = false   #初始化检查扩展文件占用情况的开关

trunk_init_reload_from_binlog = false   #是否从 binlog 重载初始化数据

trunk_compress_binlog_min_interval = 0   #扩展文件压缩的最小时间间隔,单位为秒

use_storage_id = false    #是否使用存储 ID

storage_ids_filename = storage_ids.conf    #存储 ID 配置文件名

id_type_in_filename = ip     #文件名中的 ID 类型,这里设置为 IP

store_slave_file_use_link = false   #从节点是否使用链接方式

rotate_error_log = false    #是否轮转错误日志

error_log_rotate_time=00:00    #错误日志轮转时间

rotate_error_log_size = 0     #错误日志轮转大小

log_file_keep_days = 0    #保留日志文件的天数

use_connection_pool = false    #是否使用连接池

connection_pool_max_idle_time = 3600   #连接池最大空闲时间,单位为秒

http.server_port=8080     #HTTP 服务器监听端口号

http.check_alive_interval=30    #检查存活状态的间隔时间,单位为秒

http.check_alive_type=tcp    #检查存活状态的类型,这里设置为 TCP

http.check_alive_uri=/status.html   #检查存活状态的 URI

3.2.2. storage配置

cp -r /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
vim /etc/fdfs/storage.conf
...
port=23000    #storage服务端口,默认23000一般不修改
base_path=/data/fastdfs/  #数据和日志文件存放根目录
store_path0=/data/fastdfs/  #第一存储目录
tracker_server=fastdfs.com:22122  #tracker服务IP和端口号
http.server_port=8888  #http访问文件的端口(默认8888,和nginx保持一致)
  • 配置文件详解:
disabled=false  #标识是否禁用,这里设置为 false 表示启用

group_name=group1  #FastDFS 的分组名称

bind_addr=  #绑定地址,留空表示绑定所有可用地址

client_bind=true  #客户端是否绑定地址的开关,这里设置为 true

port=23000  #监听端口号

connect_timeout=30  #连接超时时间,单位为秒

network_timeout=60  #网络超时时间,单位为秒

heart_beat_interval=30  #心跳间隔时间,单位为秒

stat_report_interval=60  #状态报告间隔时间,单位为秒

base_path=/data/fastdfs/ #存储文件的基本路径

max_connections=256  #最大连接数

buff_size = 256KB  #缓冲区大小

accept_threads=1  #接受连接的线程数

work_threads=4  #工作线程数

disk_rw_separated = true  #磁盘读写是否分离的开关,这里设置为 true

disk_reader_threads = 1  #磁盘读取线程数

disk_writer_threads = 1  #磁盘写入线程数

sync_wait_msec=50  #同步等待时间,单位为毫秒

sync_interval=0  #同步间隔时间,单位为秒

sync_start_time=00:00  #同步开始时间

sync_end_time=23:59  #同步结束时间
write_mark_file_freq=500  #写入标记文件的频率

store_path_count=1  #存储路径个数

store_path0=/data/fastdfs/  #存储路径

subdir_count_per_path=256  #每个存储路径的子目录个数

tracker_server=fastdfs.com:22122  #Tracker 服务器地址

log_level=info  #日志级别,这里设置为 info

run_by_group=  #运行用户组

run_by_user=  #运行用户名

allow_hosts=*  #允许连接的主机,这里设置为全部允许

file_distribute_path_mode=0  #文件分布路径模式

file_distribute_rotate_count=100  #文件分布轮转计数

fsync_after_written_bytes=0  #写入多少字节后执行 fsync

sync_log_buff_interval=10  #同步日志缓冲间隔,单位为秒

sync_binlog_buff_interval=10  #同步二进制日志缓冲间隔,单位为秒

sync_stat_file_interval=300  #同步统计文件间隔,单位为秒

thread_stack_size=512KB  #线程栈大小

upload_priority=10  #上传优先级

if_alias_prefix=  #接口别名前缀

check_file_duplicate=0  #检查文件重复性的开关

file_signature_method=hash  #文件签名方法

key_namespace=FastDFS  #键命名空间

keep_alive=0  #保持连接的时间,单位为秒

use_access_log = false  #是否使用访问日志

rotate_access_log = false  #是否轮转访问日志

access_log_rotate_time=00:00  #访问日志轮转时间

rotate_error_log = false  #是否轮转错误日志

error_log_rotate_time=00:00  #错误日志轮转时间

rotate_access_log_size = 0  #访问日志轮转大小

rotate_error_log_size = 0  #错误日志轮转大小

log_file_keep_days = 0  #保留日志文件的天数

file_sync_skip_invalid_record=false  #是否跳过无效记录进行文件同步的开关

use_connection_pool = false  #是否使用连接池

connection_pool_max_idle_time = 3600  #连接池最大空闲时间,单位为秒

http.domain_name=  #HTTP 服务器的域名

http.server_port=8888  #HTTP 服务器监听端口号

3.2.3. 启动服务

#启动tracker服务:
/usr/bin/fdfs_trackerd  /etc/fdfs/tracker.conf
#启动storage服务:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
# 重启storage服务:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf  restart  

3.2.4. client测试:

cp -r /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
vim /etc/fdfs/client.conf
...
base_path=/data/fastdfs  #存储文件路径
tracker_server=fastdfs.com:22122  #指定tracker服务IP地址和端口号
...
#测试上传图片,下载一张图片上传至/root/下
ls
anaconda-ks.cfg  pcindex_small.png
#上传图片:
fdfs_upload_file /etc/fdfs/client.conf  /root/pcindex_small.png
group1/M00/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png    --这是存放图片的路径
#查看一下图片:
ls /data/fastdfs/data/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png
/data/fastdfs/data/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png

#删除图片:
fdfs_delete_file /etc/fdfs/client.conf   group1/M00/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png

#查看图片是否存在:
ls /data/fastdfs/data/00/00/

3.2.5. 配置nginx访问

#修改mod_fastdfs.conf
vim /etc/fdfs/mod_fastdfs.conf

tracker_server=fastdfs.com:22122   #Tracker 服务器的地址和端口号
url_have_group_name = true    #URL 是否包含分组名称的开关,设置为 true 表示 URL 包含分组名称
store_path0=/data/fastdfs   #存储路径的配置。FastDFS 是一个分布式文件系统,数据会保存在多个存储路径中。store_path0 表示第一个存储路径,/data/fastdfs 是具体的路径。可以根据实际情况配置多个存储路径,每个存储路径使用不同的 store_pathX 配置项,例如 store_path1=/path/to/another/store

#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
...
server {
        listen       8888;  #该端口为storage.conf中的http.server_port相同
        server_name  localhost;
        location  ~/group[0-9]/  {
            ngx_fastdfs_module;
        }
#启动nginx
/usr/local/nginx/sbin/nginx
#重启nginx
/usr/local/nginx/sbin/nginx  -s reload
#停止nginx
/usr/local/nginx/sbin/nginx  -s  stop

3.2.6. 测试:

#上传一张图片
fdfs_upload_file /etc/fdfs/client.conf  /root/pcindex_small.png
group1/M00/00/00/wKgCCmUQYGmAC88HAAAYqekVITI560.png

  • 打开浏览器访问:http://192.168.2.10:8888/group1/M00/00/00/wKgCCmUQYGmAC88HAAAYqekVITI560.png
    在这里插入图片描述

3.3. 集群部署:

  • 集群IP地址:192.168.2.10,192.168.2.20,192.168.2.30

3.3.1. 修改hosts内容和主机名

  • 注意每台服务器都需要修改如下:
vim /etc/hosts

192.168.2.10   fastdfs.com
192.168.2.20   fastdfs2.com
192.168.2.30   fastdfs3.com


#在每台服务器执行如下命令修改主机名,注意不同服务器的网卡不同需要根据现场情况修改:
hostname `cat /etc/hosts|grep $(ifconfig ens33|grep broadcast|awk '{print $2}')|awk '{print $2}'`;su
  • 每台部署Fastdfs,这里就不重新写了,具体怎么部署可以看上面的内容

3.3.2. tracker配置

  • 每台都需要配置
vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122 # tracker服务器端口(默认22122,一般不修改)
base_path=/data/fastdfs # 存储日志和数据的根目录

3.3.3. storage配置

  • 每台都需要配置
vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000 # storage服务端口(默认23000,一般不修改)
base_path=/data/fastdfs # 数据和日志文件存储根目录
store_path0=/data/fastdfs # 第一个存储目录
tracker_server=fastdfs.com:22122 # 服务器1
tracker_server=fastdfs2.com:22122 # 服务器2
tracker_server=fastdfs3.com:22122 # 服务器3
http.server_port=8888 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)

3.3.4. 启动服务

#启动tracker服务:
/usr/bin/fdfs_trackerd  /etc/fdfs/tracker.conf
#启动storage服务:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

3.3.4. client 测试:

  • 在任意一台都可以测试:
vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/data/fastdfs
tracker_server=fastdfs.com:22122 # 服务器1
tracker_server=fastdfs2.com:22122 # 服务器2
tracker_server=fastdfs3.com:22122 # 服务器3

# 下载一张图片上传至/root/下
[root@fastdfs ~]# ls
28e70ebf91667f0c9b04be96bc730c49.jpeg  anaconda-ks.cfg  pcindex_small.png

#上传图片
fdfs_upload_file /etc/fdfs/client.conf  /root/28e70ebf91667f0c9b04be96bc730c49.jpeg
group1/M00/00/00/wKgCCmUWboKAJ2IPAAEnsjF1S3g58.jpeg

#任意一台验证:
ls /data/fastdfs/data/00/00/
wKgCCmUQYGmAC88HAAAYqekVITI560.png  wKgCCmUWboKAJ2IPAAEnsjF1S3g58.jpeg

3.3.5. 配置nginx访问

vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=fastdfs.com:22122 # 服务器1
tracker_server=fastdfs2.com:22122 # 服务器2
tracker_server=fastdfs3.com:22122 # 服务器3
url_have_group_name=true
store_path0=/data/fastdfs

#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
server {
   listen 8888; ## 该端口为storage.conf中的http.server_port相同
   server_name localhost;
   location ~/group[0-9]/ {
       ngx_fastdfs_module;
    }
   error_page 500 502 503 504 /50x.html;
   location = /50x.html {
   root html;
   }
}

#启动nginx
/usr/local/nginx/sbin/nginx -s reload
ngx_http_fastdfs_set pid=25197

3.3.6. 测试刚才上传的图片

  • 打开浏览器访问:http://192.168.2.10:8888/group1/M00/00/00/wKgCCmUWboKAJ2IPAAEnsjF1S3g58.jpeg
    在这里插入图片描述

3.3. 7. 检测集群:

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
# 会显示会有几台服务器 有3台就会 显示 Storage 1-Storage 3的详细信息

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

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

相关文章

Spring Boot中配置文件介绍及其使用教程

目录 一、配置文件介绍 二、配置简单数据 三、配置对象数据 四、配置集合数据 五、读取配置文件数据 六、占位符的使用 一、配置文件介绍 SpringBoot项目中&#xff0c;大部分配置都有默认值&#xff0c;但如果想替换默认配置的话&#xff0c;就可以使用application.prop…

Unity如何实现TreeView

前言 最近有一个需求,需要实现一个TreeView的试图显示,开始我一直觉得这么通用的结构,肯定有现成的UI组件或者插件可以使用,结果,找了好久,都没有找到合适的插件,有两个效果差强人意。 最后在回家的路上突然灵光一闪,想到了一种简单的实现方式,什么插件都不用,仅使用…

react create-react-app v5配置 px2rem (暴露 eject方式)

环境信息&#xff1a; create-react-app v5 “react”: “^18.2.0” “postcss-plugin-px2rem”: “^0.8.1” 配置步骤&#xff1a; 我这个方式是 npm run eject 暴露 webpack配置的方法 1.安装 postcss-plugin-px2rem 和 lib-flexible cnpm install postcss-plugin-px2rem…

RV1126笔记四十一:RV1126移植LIVE555

若该文为原创文章,转载请注明原文出处。 RV1126的SDK有提供了一个librtsp.a封装好的RTSP推流库,但不开源,还有个确定延时长,所以想自己写一个RTSP的推流,但不想太麻烦,所以使用Live555。 记录下移植过程和测试结果。 live555需要用到的包有 openssl 和live555 一、 编…

基于SpringBoot的服装生产管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 登录界面的实现 系统主界面的实现 用户管理模块的实现 人事安排管理模块的实现 工资管理模块的实现 考勤管理模块的实现 样板管理模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 本协力服装厂服装生…

队列的使用以及模拟实现(C++版本)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

AR智能眼镜:提升现场服务技能、效率与盈利能力的利器(一)

随着技术的不断进步&#xff0c;现场服务组织正朝着远程支持转变&#xff0c;用以解决技能差距和生产力问题&#xff0c;提高员工培训和操作效率&#xff0c;同时为企业提高利润率&#xff0c;创造竞争优势。 本文将探讨增强现实&#xff08;AR&#xff09;、辅助现实&#xf…

后台管理系统: 商品管理

商品管理之三级联动静态组件 先做俩个卡片组件&#xff0c;分开距离 三级联动很多地方都用到了它&#xff0c;我们可以封装成一个组件 注册为一个全局组件 <div><el-form :inline"true" class"demo-form-inline"><el-form-item label&qu…

数据集笔记:纽约花旗共享单车od数据

花旗共享单车公布的其共享单车轨迹数据&#xff0c;包括2013年-2021年曼哈顿、布鲁克林、皇后区和泽西城大约14500辆自行车和950个站点的共享单车轨迹数据 数据地址&#xff1a;Citi Bike System Data | Citi Bike NYC | Citi Bike NYC 性别&#xff08;0未知&#xff1b;1男&…

Idea引入thymeleaf失败解决方法

报错 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.Fri Sep 29 09:42:00 CST 2023 There was an unexpected error (typeNot Found, status404). 原因&#xff1a;html没有使用thymeleaf 首先要引入…

pmp考试有包过班吗?靠谱吗?

PMP考试是全球范围内最为知名和认可的项目管理专业认证考试之一。对于想要在项目管理领域取得突破和进步的人来说&#xff0c;PMP认证是非常重要的一项资格。然而&#xff0c;对于很多考生来说&#xff0c;他们可能会关心一个问题&#xff1a;PMP考试有包过班吗&#xff1f;靠谱…

四川玖璨电子商务有限公司抖音培训引领电商新潮

近年来&#xff0c;随着电子商务的迅猛发展&#xff0c;抖音这个社交媒体平台也逐渐成为了商家必争之地。四川玖璨电子商务有限公司抖音培训&#xff0c;为你解锁电商流量密码&#xff0c;助你一飞冲天&#xff01; 一、抖音电商&#xff1a;下一个电商蓝海 作为拥有海量用户的…

操作系统相关杂项

系列文章目录 文章目录 系列文章目录前言一、dlopen, dlerror, dlclose直接执行动态库中的某个函数/某段代码 Linux共享库的组织共享库的构造和析构函数 动态链接堆栈初始化C全局构造与析构模拟实现库函数 freadsyscallsyscall 原理基于int的Linux的经典系统调用实现 前言 一、…

idea Springboot 图书管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 图书管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#…

基于Java实现的民宿预订管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

yolox相关

yolox YOLOXYOLOX-DarkNet53yolov3作为baseline输入端Strong data augmentationMosaic数据增强MixUp数据增强注意 BackboneNeckPrediction层Decoupled headDecoupled Head 细节 Anchor-freeAnchor Based方式Anchor Free方式标签分配初步筛选精细化筛选 SimOTASimOTA Other Back…

Thymeleaf快速入门(Spring版)

文章目录 Thymeleaf快速入门&#xff08;Spring版&#xff09;1、Thymeleaf概述2、Thymeleaf快速入门3、Thymeleaf基础语法3.1 th属性3.2 标准表达式语法3.2.1 变量表达式3.2.2 选择表达式3.2.3 URL表达式3.2.3 链接表达式3.2.4 国际化表达式3.2.5 片段引用表达式 Thymeleaf快速…

机器学习——一元线性回归构造直线,并给出损失函数

目 录 Question 问题分析 1.概念补充 2.流程分析 3.注意 具体实现 最终成果 代码 思考&#xff1a; Question 在二维平面有n个点&#xff0c;如何画一条直线&#xff0c;使得所有点到该直线距离之和最短 如果能找到&#xff0c;请给出其损失函数 问题分析 1.概念…

BASH shell脚本篇2——条件命令

这篇文章介绍下BASH shell中的条件相关的命令&#xff0c;包括&#xff1a;if, case, while, until, for, break, continue。之前有介绍过shell的其它基本命令&#xff0c;请参考&#xff1a;BASH shell脚本篇1——基本命令 1. If语句 if语句用于在顺序执行语句的流程中执行条…

visio将形状、图形、文字、符合进行任意角度旋转(已解决)

第一步&#xff1a;选择一个形状&#xff0c;并选定它&#xff0c;如下图 第二步&#xff1a;在视图中&#xff0c;按顺序点击 会弹出一个位置框&#xff0c;如下图。 这里设置 角度的值 为 35deg&#xff0c;按“回车键”&#xff0c;如下图