分布式文件存储与数据缓存(一)| FastDFS

news2024/11/19 2:30:22

目录

  • 分布式文件系统
  • FastDFS概述_简介
    • FastDFS特性:
    • 分布式文件服务提供商
  • FastDFS概述_核心概念
    • tracker
    • storage
    • client
    • group
  • FastDFS概述_上传机制
    • 内部机制如下
  • FastDFS概述_下载机制
    • 内部机制如下
  • FastDFS环境搭建_Linux
    • 下载安装gcc
    • 下载安装FastDFS
    • 下载安装FastDFS依赖
    • 解压缩依赖tar包
    • 编译并安装libfastcommon
    • 编译并安装FastDFS
    • 进入etc目录下复制配置文件
    • 创建tracker服务
      • 创建tracker目录
      • 修改配置文件
      • 启动tracker服务
      • 检查tracker服务
    • 创建storage服务
      • 创建storage目录
      • 修改配置文件
      • 启动storage服务
      • 查看storage服务
    • 修改Client配置文件
    • 创建日志目录
  • FastDFS指令
    • 上传指令
      • 指令参数
      • 指令使用
    • 下载指令
      • 指令参数
      • 指令使用
    • 查看文件信息指令
      • 指令参数
      • 指令使用
    • 删除指令
      • 指令参数
      • 指令使用
  • SpringBoot操作FastDFS
    • 导入FastDFS依赖jar
    • 配置springboot的application.yml配置文件
    • 上传和下载文件操作
  • 前端文件上传到fastdfs
    • 引入Thymeleaf视图解析器
    • 编写index页面 引入wangEditor富文本编辑器
    • 编写Controller接口
  • FastDFS集成Nginx
    • FastDFS集成Nginx的2个原因
      • 为分布式文件系统提供Http服务支持
      • 解决复制延迟问题
  • FastDFS集成Nginx_环境搭建
    • 下载Fastdfs的Nginx模块包
    • 安装Nginx依赖文件
    • 下载Nginx软件包
    • 配置Nginx服务器
    • 将Fastdfs软件包里面的http.conf和mime.types拷贝到/etc/fdfs目录下
    • 配置Nginx的fastdfs模块,并编辑文件
    • 配置Nginx
    • 启动Ningx服务
    • 查看服务启动情况
    • 启动追踪服务与存储节点服务
    • 上传图片测试
    • 通过浏览器远程访问

分布式文件系统

业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。
在这里插入图片描述

优点:
扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;
高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;
弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。
缺点: 系统复杂度稍高,需要更多服务器

FastDFS概述_简介

FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB <file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。

FastDFS特性:

  • 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
  • 支持相同内容的文件只保存一份,节约磁盘空间
  • 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
  • 支持在线扩容
  • 支持主从文件

分布式文件服务提供商

  1. 阿里的OSS
  2. 七牛云存储
  3. 百度云储存

FastDFS概述_核心概念

在这里插入图片描述
FastDFS服务端有三个角色:跟踪服务器(tracker)、存储服务器(storage)和客户端(client)。

tracker

跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。

storage

存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。

client

客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

group

组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。

在这里插入图片描述

流程:
Tracker相当于FastDFS的大脑,不论是上传还是下载都是通过tracker来分配资源;客户端一般可以使用Ngnix等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷于卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。

FastDFS概述_上传机制

首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。

在这里插入图片描述

内部机制如下

1、选择Tracker server
当集群中不止一个Tracker server时,由于Tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。
2、选择Storage server
当选定Group后,Tracker会在Group内选择一个Storage Server给客户端
3、选择Storage path
当分配好Storage Server后,客户端将向Storage发送写文件请求,Storage将会为文件分配一个数据存储目录。

注意:
剩余存储空间最多的优先。

4、生成Fileid
选定存储目录之后,Storage会为文件生一个Fileid,由StorageServer Ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。
5、生成文件名
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

FastDFS概述_下载机制

客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。

在这里插入图片描述

内部机制如下

1、client询问tracker下载文件的storage,参数为文件标识(组名和文件名)
2、tracker返回一台可用的storage
3、client直接和storage通讯完成文件下载

FastDFS环境搭建_Linux

下载安装gcc

 yum install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget

下载安装FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz

下载安装FastDFS依赖

wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz

解压缩依赖tar包

tar -zxvf V1.0.43.tar.gz -C /usr/local
tar -zxvf V5.11.tar.gz -C /usr/local

编译并安装libfastcommon

cd /usr/local/libfastcommon-1.0.43/
 ./make.sh && ./make.sh install

编译并安装FastDFS

cd /usr/local/fastdfs-6.06
./make.sh && ./make.sh install

进入etc目录下复制配置文件

cd /etc/fdfs/
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf

创建tracker服务

创建tracker目录

mkdir -p /data/fastdfs/tracker

修改配置文件

vim /etc/fdfs/tracker.conf

disabled=false                 #启用配置文件
port=22122                     #设置 tracker的端口号
base_path=/data/fastdfs/tracker #设置 tracker的数据文件和日志目录(需预先创建)
http.server_port=8888           #设置 http 端口号

启动tracker服务

/etc/init.d/fdfs_trackerd start

检查tracker服务

netstat -lntup |grep fdfs

创建storage服务

创建storage目录

mkdir -p /data/fastdfs/base
mkdir -p /data/fastdfs/storage

修改配置文件

vim /etc/fdfs/storage.conf

disabled=false                       #启用配置文件
group_name=group1                     #组名,根据实际情况修改
port=23000                           #设置storage 的端口号
base_path=/data/fastdfs/base         #设置storage 的日志目录(需预先创建)
store_path_count=1                   #存储路径个数,需要和 store_path 个数匹配
store_path0=/data/fastdfs/storage       #存储路径
tracker_server=172.31.16.121:22122    #tracker 服务器的 IP 地址和端口号
http.server_port=8888                 #设置storage上启动的http服务的端口号,如安装的nginx的端口号

启动storage服务

/etc/init.d/fdfs_storaged start

查看storage服务

netstat -lntup |grep fdfs

修改Client配置文件

vim /etc/fdfs/client.conf

connect_timeout=30
network_timeout=60
base_path=/data/fastdfs/client      # 日志路径
tracker_server=192.168.66.100:22122    # 追踪服务器的IP,有多个服务器可以另一行

创建日志目录

mkdir -p /data/fastdfs/client

FastDFS指令

在这里插入图片描述

上传指令

指令参数

fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]

参数含义:

  1. <config_file> :配置文件路径
  2. <local_filename>:本地文件路径
  3. [storage_ip:port]:(可选参数)
  4. [store_path_index] :(可选参数)

指令使用

[root@tracker fdfs]# fdfs_upload_file /etc/fdfs/client.conf 上传的文件路径

上传文件后会返回文件在FastDFS中的唯一文件标识,即卷名+文件名

下载指令

指令参数

fdfs_download_file <config_file> <file_id>[local_filename] [<download_offset><download_bytes>]

参数含义:

  1. <config_file> :配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名
  3. [local_filename] :文件下载地址
  4. <download_offset> :(可选参数)文件下载开始时间
  5. <download_bytes> :(可选参数)文件下载的字节数

指令使用

[root@tracker fdfs]# fdfs_download_file /etc/fdfs/client.conf 上传时返回的唯一文件标识 指定位置

查看文件信息指令

指令参数

fdfs_file_info <config_file> <file_id>

参数含义:

  1. <config_file> :配置文件路径
  2. <file_id>:文件在FastDFS中的唯一文件标识,即卷名+文件名

指令使用

[root@tracker fdfs]# fdfs_file_info /etc/fdfs/client.conf 文件在FastDFS中的唯一文件标识

删除指令

指令参数

fdfs_delete_file <config_file> <file_id>

参数含义:

  1. <config_file> :配置文件路径
  2. <file_id>:文件在FastDFS中的唯一文件标识,即卷名+文件名

指令使用

[root@tracker fdfs]# fdfs_delete_file /etc/fdfs/client.conf 文件在FastDFS中的唯一文件标识

注意:
删除指令使用后,文件在该卷中的所有备份都会被删除,因为卷内的存储节点会相互同步,故慎用。

SpringBoot操作FastDFS

导入FastDFS依赖jar

<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.26.5</version>
</dependency>

配置springboot的application.yml配置文件

#### 分布式文件系统的配置 ####
fdfs:
  # 超时时间
  connect-timeout: 600
  # 连接时间
  so-timeout: 1500
  tracker-list:
    - 192.168.52.136:22122

上传和下载文件操作


@SpringBootTest
class FastfdsDemoApplicationTests {

    // fastdfs 存储节点的客户端对象
    @Autowired
    private FastFileStorageClient fastFileStorageClient;

    @Test
    /**
     * java api 对分布式文件系统上传文件操作
     */
    public void testUpload() throws FileNotFoundException {
        // 1. 获取本地文件
        File file = new File("f:\\2.jpg");
        // 2. 创建传输文件的输入流
        FileInputStream inputStream = new FileInputStream(file);
        // 3. 上传文件
        /*
         * 第一个参数:文件的输入流
         * 第二个参数:文件的大小
         * 第三个参数:文件的扩展名
         * 第四个参数:文件的元数据
         */
        StorePath storePath = fastFileStorageClient.uploadFile(inputStream, file.length(), "jpg", null);
        // 4. 将文件名和卷名一起打印
        System.out.println(storePath.getFullPath());
        System.out.println("+++++++++++++++++++++++++++++");

        System.out.println(storePath.getGroup() + " | " + storePath.getPath());

//        group1 /M00/00/00/wKg0iGX1bSSAdrMgAAexV9rfK9A537.jpg
//         ++++++++++++++++++++++++++++ +
//        group1 | M00/00/00/wKg0iGX1bSSAdrMgAAexV9rfK9A537.jpg

    }

    /**
     * java api 对分布式文件系统下载文件操作
     */
    @Test
    public void testDownload() throws IOException {
        // 1. 下载文件
        /*
         * 第一个参数:文件处于存储节点卷名
         * 第二个参数:文件在存储节点的文件名
         * 第三个参数:下载的回调函数
         */
        byte[] bytes = fastFileStorageClient.downloadFile("group1", "M00/00/00/wKg0iGX1bSSAdrMgAAexV9rfK9A537.jpg", new DownloadByteArray());
        // 2. 创建文件的输出流
        FileOutputStream fileOutputStream = new FileOutputStream("f:\\1.jpg");
        // 3. 使用文件输出流将文件内筒字节数组写出
        fileOutputStream.write(bytes);
        // 4. 刷新输出流
        fileOutputStream.flush();
        // 5. 关闭输出流
        fileOutputStream.close();
    }

}

前端文件上传到fastdfs

引入Thymeleaf视图解析器

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starterthymeleaf</artifactId>
</dependency>
<dependency>
  
<groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starterweb</artifactId>
</dependency>

编写index页面 引入wangEditor富文本编辑器

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>wangEditor demo</title>
</head>
<body>

<div id="div1">
  <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
</div>

<!-- 引入 js -->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/wangeditor@latest/dist/wangEditor.min.js"></script>

<script type="text/javascript">
  var E = window.wangEditor; // 全局变量
  const editor = new E('#div1')
  //设置文件上传的参数名称
  editor.config.uploadFileName = 'file'
  // 配置 server 接口地址
  editor.config.uploadImgServer = '/upload'
  // 限制图片大小和类型
  editor.config.uploadImgMaxSize = 2 * 1024 * 1024 //2M
  editor.config.uploadImgAccept = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']
  // 一次最多上传 5 个图片
  editor.config.uploadImgMaxLength = 5
  editor.create()
</script>

</body>
</html>

编写Controller接口

@RestController
public class UploadController {

    // fastdfs 存储节点的客户端对象
    @Autowired
    private FastFileStorageClient fastFileStorageClient;

    @PostMapping("upload")
    public void upload(MultipartFile file) throws IOException {
        // 1. 判断文件是否为空
        if(file!=null){
            // 2. 获取上传图片名字
            String filename = file.getOriginalFilename();
            // 3. 获取图片后缀
            String fileSuffix = filename.substring(filename.lastIndexOf(".") + 1);
            // 4. 上传图片
            StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), fileSuffix, null);
            // 5. 创建成功会返回文件路径
            System.out.println(storePath.getFullPath());
            // TODO 保存到数据库
        }
    }
}

FastDFS集成Nginx

FastDFS集成Nginx的2个原因

为分布式文件系统提供Http服务支持

为分布式文件系统提供Http服务支持通过Nginx的web服务代理访问分布式文件系统的存储节点,从而实现通过http请求访问存储节点资源。

在这里插入图片描述

解决复制延迟问题

由于FastDFS的同卷的存储节点之间需要同步,当文件尚未同步完成时,访问请求到达改节点,获取的数据将是未同步完的不完整数据,即为复制延迟问题。通过Nginx检测请求的存储节点的数据,若该存储节点的数据尚未同步完成,则将请求转发至数据的原存储节点,从而解决复制延迟问题。

FastDFS集成Nginx_环境搭建

下载Fastdfs的Nginx模块包

cd /usr/local
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz
tar -zxvf V1.22.tar.gz

安装Nginx依赖文件

yum install -y gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel gd-devel epel-release

下载Nginx软件包

wget https://nginx.org/download/nginx-1.19.2.tar.gz
cd nginx-1.19.2/

配置Nginx服务器

#建立Makefile文件,检查Linux系统环境以及相关的关键属性。
./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src/
#编译项目,主要将gcc源代码编译成可执行的目标文件
make
#根据上一步骤编译完成的数据安装到预定的目录中。
make install

将Fastdfs软件包里面的http.conf和mime.types拷贝到/etc/fdfs目录下

cp /usr/local/src/fastdfs-6.06/conf/mime.types /etc/fdfs/
cp /usr/local/src/fastdfs-6.06/conf/http.conf /etc/fdfs/

配置Nginx的fastdfs模块,并编辑文件

#拷贝文件
[root@localhost opt]cp /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
[root@localhost fdfs] vim mod_fastdfs.conf
#保存日志目录
base_path=/data/fastdfs/storage   
#tracker 服务器的 IP 地址以及端口号
tracker_server=192.168.66.100:22122 
#文件url中是否有group 名
url_have_group_name = true      
#存储路径
store_path0=/data/fastdfs/storage  
group_count = 1            #设置组的个数
#然后在末尾添加分组信息,目前只有一个分组,就只写一个
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/storage

配置Nginx

server {
  listen    80;
  server_name  localhost;
   
  location ~ /group[1-3]/M00 {
    alias /data/fastdfs/storage/data;
     ngx_fastdfs_module;
   }
  # 根目录下返回403
  location = / {
     return 403;
   }
  # log file
  access_log  logs/img_access.log access;
}

启动Ningx服务

# 进入sbin目录
[root@tracker nginx]# cd sbin/
# 启动服务 -c:指定配置文件
[root@tracker sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf

查看服务启动情况

[root@tracker sbin]# ps -ef | grep nginx

启动追踪服务与存储节点服务

[root@tracker sbin]# fdfs_trackerd /etc/fdfs/tracker.conf start
[root@tracker sbin]# fdfs_storaged /etc/fdfs/storage.conf start

上传图片测试

[root@tracker fdfs]# fdfs_upload_file /etc/fdfs/client.conf /root/xxxxx.png
group1/M00/00/00/wKhyj1wrIUWAL5ASAAAfA8PiO7Y493.png

通过浏览器远程访问

http://192.168.66.100/group1/M00/00/00/wKhyj1wrIfqAD3NFAAn1fNRE8_M976.png

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

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

相关文章

Transformer代码从零解读【Pytorch官方版本】

文章目录 1、Transformer大致有3大应用2、Transformer的整体结构图3、如何处理batch-size句子长度不一致问题4、MultiHeadAttention&#xff08;多头注意力机制&#xff09;5、前馈神经网络6、Encoder中的输入masked7、完整代码补充知识&#xff1a; 1、Transformer大致有3大应…

由浅到深认识C语言(6):变量的存储类型

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

代码随想录算法训练营第40天 | 343. 整数拆分 ,96.不同的二叉搜索树

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 343. 整数拆分 题目链接&#xff1a;https://leetcode.cn/problems/integer-break/ 思路&#xff1a; 动规五部曲&#xf…

【复现】通天星CMS 安全监控云平台 SQL注入漏洞_64

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 通天星CMSV6拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队&#xff0c;专注于为定位、无线视频终端产品提供平…

sqllab第三关通关笔记

知识点&#xff1a; 通过回显的信息判断原始语句的组成猜测该语句为 select 1,2,3 from 表名 where id (输入) limit 0,1 首先通过测试判断存在什么类型的sql注入 构造id1/0 发现正常输出&#xff1b;说明是字符型的sql注入 好了&#xff0c;下面就测试有什么限制条件 构造…

论文阅读——MoCo

Momentum Contrast for Unsupervised Visual Representation Learning 动量在数学上理解为加权移动平均&#xff1a; yt-1是上一时刻输出&#xff0c;xt是当前时刻输入&#xff0c;m是动量&#xff0c;不想让当前时刻输出只依赖于当前时刻的输入&#xff0c;m很大时&#xff0…

使用Laravel开发项目

如何使用Laravel框架开发项目 一、安装Laravel框架 1.在安装Laravel框架钱我们需要先查看要安装的Laravel框架版本以及版本所需要的安装运行条件。 2.配置好安装环境后再安装Laravel框架 2.1.配置安装环境 1&#xff09;PHP版本 2&#xff09;PHP OpenSSL扩展 3&#xff…

Ubuntu查看ros版本-linux查看ros版本

使用ros带的rosversion命令即可查看自己的ros版本&#xff1a; rosversion -d

C语言葵花宝典之——文件操作

前言&#xff1a; 在之前的学习中&#xff0c;我们所写的C语言程序总是在运行结束之后&#xff0c;就会自动销毁&#xff0c;那如果我们想将一个结果进行长期存储应该如何操作呢&#xff1f;这时候就需要我们用文件来操作。 目录 1、什么是文件&#xff1f; 1.1 程序文件 1.2…

C语言 之 结构体超详细总结

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分78.8)&#xff0c;分…

docker容器镜像管理

目录 一、 Docker的基本组成 二、 容器和镜像的关系 2.1 面向对象角度 2.2 从镜像容器角度 三、镜像命令 3.1 查看当前已有镜像 3.2 查看已有的全部镜像 3.3 查看镜像ID 3.4 镜像删除 四、 容器命令 4.1 下载镜像 4.2 新建和启动容器 run 4.3 交互式 4.…

【体验有奖】用 AI 画春天,函数计算搭建 Stable Diffusion WebUI

人工智能生成内容 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;是当下备受关注的概念之一&#xff0c;是继 PGC 和 UGC 之后的新型生产方式。AIGC 技术的核心思想是利用人工智能算法生成具有一定创意和质量的内容。例如&#xff0c;根据用户的描述或…

字符分类函数(iscntrl、i是space.....)---c语言

目录 一、定义二、字符分类函数2.1 -iscntrl&#xff08;&#xff09;2.1.1定义2.1.2使用举例 2.2 -isspace&#xff08;&#xff09;2.2.1描述2.2.2使用举例 2.3-isdigit()2.3.1描述2.3.2使用举例 2.4-isxdigit()2.4.1描述 2.5-islower()2.5.1描述2.5.2使用举例 2.6-isupper()…

jenkins容器中安装python遇到问题

在Jenkins容器中安装配置Python时遇到问题 执行./configure --prefix/opt/python3/时遇到configure: error: no acceptable C compiler found in $PATH 这个问题就是缺少gcc编译环境。将gcc安装上即可&#xff1a; yum install -y gcc##前提是容器里的系统是cenos才可以&#…

专升本 C语言笔记-06 常用的3种输入输出函数

1.scanf() 与 printf() 的使用 scanf() 格式化输入数据 格式:scanf("格式控制字符串",参数地址列表) scanf("%d,%d,%d",&a,&b,&c); printf("a %d\n",a); printf("b %d\n",b); printf("c %d\n",c); 注意 注…

(网络安全)一款强大的逆向分析工具,开源!

工具介绍 Ghidra 是由美国国家安全局&#xff08;NSA&#xff09;研究部门开发的软件逆向工程&#xff08;SRE&#xff09;套件&#xff0c;用于支持网络安全任务。包括一套功能齐全的高端软件分析工具&#xff0c;使用户能够在各种平台(Windows、Mac OS和Linux)分析编译后的代…

详解VXLAN

海翎光电的小编今天为大家介绍了什么是VXLAN&#xff0c;以及VXLAN的基本概念和工作原理。 什么是VXLAN VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0c;是由IETF定义的NVO3&#xff08;Network Virtualization ov…

深入解析FastAPI多线程:加速代码执行效率

在现代网络应用中&#xff0c;高性能和快速响应是至关重要的&#xff0c;Python 的 FastAPI 框架以其出色的性能和简单易用的特点&#xff0c;成为了许多开发者的首选。然而&#xff0c;在某些场景下&#xff0c;单线程运行可能无法满足需求&#xff0c;这时候就需要考虑使用多…

RPC通信原理(一)

RPC通信原理 RPC的概念 如果现在我有一个电商项目&#xff0c;用户要查询订单&#xff0c;自然而然是通过Service接口来调用订单的实现类。 我们把用户模块和订单模块都放在一起&#xff0c;打包成一个war包&#xff0c;然后再tomcat上运行&#xff0c;tomcat占有一个进程&am…

vue模板语法介绍及内置指令用法

1、文本差值&#xff08;大括号、v-text、v-htm指令&#xff09; 最基本的数据绑定就是文本差值&#xff0c;格式为“Mustache”语法&#xff08;双大括号&#xff09;&#xff1b; 双大括号只能解析文本不能解析html&#xff0c;如需解析html则需使用v-html指令&#xff1b;…