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

高性能、可扩展、分布式对象存储系统MinIO的介绍、部署步骤以及代码示例

详细介绍

MinIO 是一款流行的开源对象存储系统,设计上兼容 Amazon S3 API,主要用于私有云和边缘计算场景。它提供了高性能、高可用性以及易于管理的对象存储服务。以下是 MinIO 的详细介绍及优缺点:

  1. 架构与特性:

    • 开源与跨平台:MinIO 开源免费(Apache v2.0许可),支持在Linux、Windows、macOS等多平台上部署。
    • 分布式存储:MinIO 可以以分布式方式部署,通过纠删码(Erasure Coding)技术实现数据冗余,即使部分硬盘故障也能恢复数据,通常配置为允许丢失N/2数量的磁盘而保持数据可恢复。
    • Amazon S3兼容性:全面兼容Amazon S3的v2和v4 API,使得基于S3的应用程序和服务可以无缝地切换到MinIO。
    • 高性能:设计用于大规模工作负载,能够处理极高的并发读写请求,并且在现代硬件上性能表现优异。
    • 安全性:提供多种安全措施,包括服务器端加密(SSE)、客户端加密、身份验证(使用JWT或自定义认证机制)以及访问策略控制。
  2. 优势:

    • 成本效益:相比商业对象存储解决方案,MinIO无需支付额外许可费用,降低了存储成本。
    • 简单易用:安装配置相对简单,用户界面友好,可通过命令行工具、Web UI或者SDK进行管理和操作。
    • 可扩展性:水平扩展能力出色,可以根据需要添加节点来增加容量和性能。
    • 数据保护:采用纠删码技术确保数据可靠性,同时支持校验和checksum保证数据完整性。
  3. 前端使用场景下的优缺点:

    • 优点
      • 对于Webpack工程化构建的项目,由于其运行环境包含Node.js,因此可以通过API直接上传文件至MinIO服务器。
      • 兼容AWS SDK,方便开发者调用已有的S3接口代码进行开发。
    • 缺点
      • 不适用于Vite这类纯浏览器模块加载器构建的项目,因为无法利用Node.js原生模块。
      • 前端直传时缺乏对上传进度的直观反馈,用户体验欠佳。
      • 配置信息如端口、账号密码等如果硬编码在前端,存在安全隐患,不易维护和扩展。
  4. 整体优缺点:

    • 优点
      • 高性能、高可靠性和易于扩展
      • 良好的兼容性,对于已经使用AWS S3生态系统的组织来说迁移成本较低
      • 开源社区活跃,不断更新和改进
    • 缺点
      • 相对于大型企业级存储解决方案,可能缺少一些高级功能和专业支持
      • 在某些特定应用场景下(比如前面提到的前端直接对接时的安全和体验问题),需要额外的开发工作来完善解决方案
      • 对于不熟悉S3 API的团队,可能存在一定的学习曲线。

MinIO是一个强大的、面向云原生应用的理想存储解决方案,尤其适合那些寻求低成本、高可用和灵活扩展的私有云存储需求的组织。不过,在实际使用中需注意权衡其优缺点,并根据具体业务场景采取合适的策略和技术手段来克服潜在挑战。

官网:MinIO | High Performance, Kubernetes Native Object Storage

MinIO的部署步骤

MinIO在不同系统和环境上的部署方式有一些差异,但基本理念是类似的,即通过容器化或直接安装的方式运行一个兼容S3 API的对象存储服务。下面将简要介绍如何在Kubernetes、Docker、CentOS、Windows及macOS等系统上部署MinIO的Server端,并提供一些关于Client端连接的基本指导。

Kubernetes (k8s) 部署 MinIO Server

  1. 创建MinIO StatefulSet或Deployment:

    Yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:name: minio-deployment
    spec:replicas: 4 # 根据需求设置副本数量以实现高可用性selector:matchLabels:app: miniotemplate:metadata:labels:app: miniospec:containers:- name: minioimage: minio/minio:latestargs: ["server", "/data"]ports:- containerPort: 9000env:- name: MINIO_ACCESS_KEYvalue: "your-access-key"- name: MINIO_SECRET_KEYvalue: "your-secret-key"volumeMounts:- mountPath: /dataname: minio-datavolumes:- name: minio-datapersistentVolumeClaim:claimName: minio-pvc # 需要预先创建并绑定到实际PV
  2. 使用kubectl apply命令应用YAML配置文件来创建StatefulSet或Deployment资源,该配置文件通常会指定镜像、持久卷(PV)和持久卷声明(PVC)、端口映射以及所需环境变量。
  3. 配置Service资源: 创建一个Service资源以暴露MinIO服务,并可以通过ClusterIP、NodePort或者LoadBalancer方式对外提供访问。

  4. 初始化MinIO集群(如果需要): 如果你打算部署分布式MinIO,需要确保正确配置了启动参数和环境变量,以便各个Pod能够相互发现并组成集群。

Docker部署 MinIO Server

  1. 拉取镜像

    docker pull minio/minio
  2. 运行容器: 单节点实例:

    docker run -p 9000:9000 -p 9001:9001 --name minio \
    -e "MINIO_ACCESS_KEY=youraccesskey" \
    -e "MINIO_SECRET_KEY=yoursecretkey" \
    -v /path/to/data:/data \          #新版目录已经更改为/mnt/data
    minio/minio server /data

    分布式模式下,需要额外的环境变量来定义集群模式和其他集群成员。

docker-compose.yaml

version: '3.9'  # 使用最新的Docker Compose版本以利用新特性services:minio:image: minio/minio:RELEASE.2024-01-05T22-17-24Z.fips  # 使用最新稳定版镜像(或指定特定版本)container_name: minioports:- "19000:9000"  # 根据实际需求决定是否暴露9001端口,用于HTTPS访问时需要- "19001:9001"  # 根据实际需求决定是否暴露9001端口,用于HTTPS访问时需要environment:MINIO_ROOT_USER: youradminaccountMINIO_ROOT_PASSWORD: youradminpassword#MINIO_BROWSER: off  # (可选)关闭Web浏览器界面,如果只通过API访问#MINIO_OPTS: server --address ":9000"  # (可选)自定义启动参数,比如启用多节点集群模式等volumes:- /your pathto/minio_data:/data  # 确保宿主机目录存在并有合适的权限command: server /data --console-address ":9001"  --address ":9000" # 指定控制台监听的静态端口为9001

podman

podman run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"podman run --name my-mc --hostname my-mc -it --entrypoint /bin/bash --rm minio/mc
[root@my-mc /]# mc alias set myminio/ https://my-minio-service MY-USER MY-PASSWORD
[root@my-mc /]# mc ls myminio/mybucket

CentOS 上直接安装 MinIO Server

  1. 安装依赖

    sudo yum install -y epel-release
    sudo yum install -y mc httpd-tools
  2. 下载并解压MinIO二进制包: 下载最新版本的MinIO二进制包,解压并移动至 /usr/local/bin 目录或自己指定目录,自定义目录时建议将目录加入系统环境的PATH。

  3. 运行MinIO: 类似于Docker中的数据卷挂载,你需要提供一个本地目录作为存储路径:

    mkdir -p /mnt/minio/data
    nohup minio server /mnt/minio/data &

Windows部署 MinIO Server

注意事项:

  1. 步骤1:下载MinIO Server

    访问MinIO官方下载页面获取适用于Windows操作系统的可执行文件:下载地址:MinIO | Code and downloads to create high performance object storage

  2. 步骤2:解压并安装

  3. 下载完成后,解压缩文件到你希望存放MinIO服务程序的位置,例如 C:\develop\minio

  4. 步骤3:创建数据存储目录

    为了持久化存储数据,需要在本地硬盘上创建一个目录用于保存上传的文件。比如,在 D:\minio-data 创建存储目录。

    步骤4:启动MinIO Server

    打开命令提示符(CMD)窗口,以管理员身份运行,并切换到MinIO可执行文件所在的目录:

    cd C:\develop\minio

    然后使用以下命令启动MinIO Server,将 <MINIO_ACCESS_KEY><MINIO_SECRET_KEY> 替换为自定义的访问密钥和私有密钥,并指定存储数据的目录:

    .\minio.exe server D:\minio-data --address ":9000" --access-key <MINIO_ACCESS_KEY> --secret-key <MINIO_SECRET_KEY>

    步骤5:环境配置(可选)

    如果需要设置域名或其他高级选项,可以使用环境变量进行配置。例如,设置MINIO_DOMAIN环境变量:

    set MINIO_DOMAIN=my-minio-server.local

    然后用包含环境变量的方式启动MinIO服务。

    步骤6:验证与访问

  5. MinIO Server默认监听9000端口,所以可以通过浏览器访问 http://localhost:9000 进入Web管理界面。
  6. 使用之前设定的访问密钥和私有密钥登录(初始默认值是 minioadmin 和 minioadmin)。
  7. 请确保防火墙或安全组规则允许9000端口的访问。在生产环境中,请务必更改默认的访问密钥和私有密钥,确保系统安全性。如果需要在分布式模式下部署MinIO,请参考官方文档关于集群部署的具体步骤。对于多节点部署,还需要额外的配置参数来定义集群成员以及纠删码等信息。

powershell方式:

## 安装minio,先直接拉取exe
Invoke-WebRequest -Uri "https://dl.min.io/server/minio/release/windows-amd64/minio.exe" -OutFile "C:\minio.exe"
setx MINIO_ROOT_USER admin
setx MINIO_ROOT_PASSWORD password
C:\minio.exe server F:\Data --console-address ":9001"## client
Invoke-WebRequest -Uri "https://dl.minio.io/client/mc/release/windows-amd64/mc.exe" -OutFile "C:\mc.exe"
C:\mc.exe alias set myminio/ http://MINIO-SERVER MYUSER MYPASSWORD

macOS部署 MinIO Server

  1. 安装Homebrew(如果尚未安装):

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  2. 使用Homebrew安装MinIO

    brew install minio/stable/minio
  3. 运行MinIO: 在终端中运行MinIO服务器指向一个本地目录:

    mkdir -p ~/minio-storage
    minio server ~/minio-storage
Client端连接与使用:

对于客户端连接,无论在哪种环境下部署的MinIO服务器,都可以使用以下步骤进行连接:

  1. 设置环境变量(可选,用于简化命令行操作):

    export MINIO_ENDPOINT=http://localhost:9000
    export MINIO_ACCESS_KEY=youraccesskey
    export MINIO_SECRET_KEY=yoursecretkey
  2. 使用MinIO客户端工具mc: 安装mc(minio/mc),然后使用以下命令连接到MinIO服务器:

    mc alias set myminio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY
  3. 验证连接: 运行 mc ls myminio 来查看桶列表,如果一切正常,您应该能看到服务器上的存储桶信息。

请注意,在生产环境中,请务必替换上述示例中的“youraccesskey”和“yoursecretkey”为您的实际访问密钥和私有密钥,并且根据实际情况调整网络配置和持久化存储设置。同时,务必确保遵循最佳安全实践,如限制公网访问、启用SSL加密等。

 浏览器访问:

访问和管理MinIO服务器

启动MinIO服务器后,可以通过浏览器或通过S3 API来访问和管理MinIO服务器。

python示例代码:

以下是一个使用Python编写的示例代码,展示了如何使用MinIO的Python SDK与MinIO服务器进行交互。

import boto3# 创建MinIO客户端
s3 = boto3.client('s3',endpoint_url='http://localhost:9000',aws_access_key_id='YOUR_ACCESS_KEY',aws_secret_access_key='YOUR_SECRET_KEY')# 列出所有桶
response = s3.list_buckets()
for bucket in response['Buckets']:print(bucket['Name'])# 创建一个桶
s3.create_bucket(Bucket='mybucket')# 上传文件
s3.upload_file('myfile.txt', 'mybucket', 'myfile.txt')# 下载文件
s3.download_file('mybucket', 'myfile.txt', 'downloaded_file.txt')# 删除文件
s3.delete_object(Bucket='mybucket', Key='myfile.txt')# 删除桶
s3.delete_bucket(Bucket='mybucket')

以上代码使用了boto3库来与MinIO服务器进行交互。需要注意的是,endpoint_url参数应该指向正确的MinIO服务器地址,aws_access_key_idaws_secret_access_key参数应该设置为正确的访问密钥。

nodejs示例:

安装MinIO Node.js SDK

首先,在你的Node.js项目中安装MinIO SDK:

npm install minio

示例代码

1. 初始化MinIO客户端
const Minio = require('minio');// 创建一个MinIO客户端实例
var minioClient = new Minio.Client({endPoint: 'your-minio-server-endpoint',port: 9000, // 默认端口为9000,如果自定义了端口,请修改useSSL: false, // 如果是https连接,则设置为trueaccessKey: 'your-access-key',secretKey: 'your-secret-key'
});// 检查连接
minioClient.ping((err) => {if (err) throw err;console.log('Connected to MinIO server successfully.');
});
2. 创建一个存储桶
minioClient.makeBucket('my-bucket', 'us-west-1', function(err) {if (err) return console.log(err);console.log('Bucket created successfully');
});
3. 上传一个文件到存储桶
// 读取本地文件
const fs = require('fs');
fs.readFile('local-file.txt', (err, data) => {if (err) throw err;// 上传文件到MinIOminioClient.putObject('my-bucket', 'remote-file.txt', data, data.length, 'application/text', function(err, etag) {if (err) return console.log(err);console.log("File uploaded successfully.");});
});
4. 列出存储桶内的所有对象
minioClient.listObjectsV2('my-bucket', '', true, function(err, objects) {if (err) return console.log(err);for (let obj of objects) {console.log(obj.name);}
});

请确保替换上述代码中的your-minio-server-endpointyour-access-keyyour-secret-key为你实际的MinIO服务器地址、访问密钥和私有密钥。同时,根据需要调整存储桶名称、本地文件路径以及远程对象名。

相关文章:

高性能、可扩展、分布式对象存储系统MinIO的介绍、部署步骤以及代码示例

详细介绍 MinIO 是一款流行的开源对象存储系统&#xff0c;设计上兼容 Amazon S3 API&#xff0c;主要用于私有云和边缘计算场景。它提供了高性能、高可用性以及易于管理的对象存储服务。以下是 MinIO 的详细介绍及优缺点&#xff1a; 架构与特性&#xff1a; 开源与跨平台&am…...

oracle重启数据库lsnrctl重启监听

oracle重启数据库lsnrctl重启监听 su到oracle用户下,命令 su - oracle切换需要启动的数据库实例&#xff1a; export ORACLE_SIDorcl进入Sqlplus控制台&#xff0c;命令&#xff1a; sqlplus /nolog以系统管理员登录&#xff0c;命令&#xff1a; connect / as sysdba如果是…...

08、Kafka ------ 消息存储相关的配置-->消息过期时间设置、查看主题下的消息存活时间等配置

目录 消息存储相关的配置★ 消息的存储介绍★ 消息过期时间及处理方式演示&#xff1a;log.cleanup.policy 属性配置 ★ 修改指定主题的消息保存时间演示&#xff1a;将 test2 主题下的消息的保存时间设为10个小时1、先查看test2主题下的配置2、然后设置消息的保存时间3、然后再…...

JAVA基础学习笔记-day15-File类与IO流

JAVA基础学习笔记-day15-File类与IO流 1. java.io.File类的使用1.1 概述1.2 构造器1.3 常用方法1、获取文件和目录基本信息2、列出目录的下一级3、File类的重命名功能4、判断功能的方法5、创建、删除功能 2. IO流原理及流的分类2.1 Java IO原理2.2 流的分类2.3 流的API 3. 节点…...

WPF ComboBox限制输入长度

在WPF中&#xff0c;你可以通过两种方式来限制ComboBox的输入长度&#xff1a; 使用PreviewTextInput事件&#xff1a;你可以在这个事件的处理程序中检查输入文本的长度&#xff0c;如果超过最大长度则阻止输入。 <ComboBox PreviewTextInput"ComboBox_PreviewTextIn…...

windows配置网络IP地址的方法

在Windows系统中配置网络IP地址&#xff0c;可以按照以下步骤进行&#xff1a; 打开“控制面板”&#xff0c;选择“网络和Internet”选项。在“网络和Internet”窗口中&#xff0c;单击“网络和共享中心”选项。在“网络和共享中心”窗口中&#xff0c;单击“更改适配器设置”…...

windows配置电脑网络IP的方法

通过控制面板配置IP地址&#xff1a; 打开控制面板&#xff1a; 可以通过在开始菜单中搜索“控制面板”来打开控制面板。选择“网络和Internet”或“网络和共享中心”&#xff1a; 在控制面板中&#xff0c;根据 Windows 版本不同&#xff0c;选中对应的选项进入网络设置。点击…...

MySQL,原子性rename

RENAME TABLE old_table TO backup_table, new_table TO old_table;...

FPGA之按键消抖

目录 1.原理 2.代码 2.1 key_filter.v 2.2 tb_key_filter.v 1.原理 按键分为自锁式按键和机械按键&#xff0c;图左边为自锁式按键 上图为RS触发器硬件消抖&#xff0c;当按键的个数比较多时常常使用软件消抖。硬件消抖会使用额外的器件占用电路板上的空间。 思路就是使用延…...

国内知名的技术平台

1、csdn&#xff0c;中文最大的技术交流平台 2、iteye&#xff0c;程序员的交流平台&#xff0c;归属csdn 3、cnblogs&#xff0c;这个也不错 4、简书也不错...

C#操作注册表

说明 今天用C#开发了一个简单的服务&#xff0c;需要设置成为自启动&#xff0c;网上有很多方法&#xff0c;放到启动运行等&#xff0c;但是今天想介绍一个&#xff0c;通过修改注册表实现&#xff0c;同时介绍一下操作注册表。 private void TestReg(){//仅对当前用户有效 H…...

Unity中BRP下的深度图

文章目录 前言一、在Shader中使用1、在使用深度图前申明2、在片元着色器中 二、在C#脚本中开启摄像机深度图三、最终效果 前言 在之前的文章中&#xff0c;我们实现了URP下的深度图使用。 Unity中URP下使用屏幕坐标采样深度图 在这篇文章中&#xff0c;我们来看一下BRP下深度…...

物联网的感知层、网络层与应用层分享

物联网的概念在很早以前就已经被提出&#xff0c;20世纪末期在美国召开的移动计算和网络国际会议就已经提出了物联网(Internet of Things)这个概念。 最先提出这个概念的是MIT Auto-ID中心的Ashton教授&#xff0c;他在研究RFID技术时&#xff0c;便提出了结合物品编码、互联网…...

kafka KRaft 集群搭建

kafka KRaft集群安装 包下载 https://downloads.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgzkafka集群构建好后的数据目录结构 [rootlocalhost data]# tree /data/kafka /data/kafka ├── kafka-1 # 节点1源码目录 ├── kafka-2 # 节点2源码目录 ├── kafka-3 # 节点…...

oracle角色管理

常用角色 CONNECT,RESOURCE,DBA,EXP_FULL_DATABASE,IMP_FULL_DATABASE 1角色可以自定义&#xff0c;语法与创建用户一样 CREATE role role1 IDENTIFIED by 123; 2授权权限给角色 --自定义角色 CREATE role role1 IDENTIFIED by 123; --授权权限给角色 GRANT create view, …...

汽车信息安全--芯片厂、OEM安全启动汇总(2)

目录 1.STM32 X-CUBE-SBSFU 2.小米澎湃OS安全启动 3.小结 在汽车信息安全--芯片厂、OEM安全启动汇总-CSDN博客,我们描述了芯驰E3的安全启动机制,接下来我们继续看其他芯片、OEM等安全启动机制。 1.STM32 X-CUBE-SBSFU 该产品全称Secure Boot and Secure...

HarmonyOS 开发基础(五)Button

HarmonyOS 开发基础&#xff08;五&#xff09;Button Entry Component struct Index {build() {Row() {Column() {// Button&#xff1a;ArkUI 的基础组件 按钮组件// label 参数&#xff1a;文字型按钮Button(我是按钮)// width&#xff1a;属性方法&#xff0c;设置组件的宽…...

带前后端H5即时通讯聊天系统源码

带有前后端的H5即时通讯聊天系统源码。该源码是一个开源的即时通信demo&#xff0c;需要前后端配合使用。它的主要目的是为了促进学习和交流&#xff0c;并为大家提供开发即时通讯功能的思路。尽管该源码提供了许多功能&#xff0c;但仍需要进行自行开发。该项目最初的开发初衷…...

vsCode输出控制台中文乱码解决

在tasks.json里的args中添加 "-fexec-charsetGBK", // 处理mingw中文编码问题 "-finput-charsetUTF-8",// 处理mingw中文编码问题...

「服务器」4.新手小白如何安装服务器环境-宝塔

刚开始初始化好的服务器&#xff0c;使用了阿里云客户端&#xff0c;看着网络脚本乱装&#xff0c;后来决定宝塔环境发现有重复的环境&#xff0c;遂决定重新初始化一下&#xff0c;然后重头干起。 重置服务器 将服务器关闭运行状态后&#xff0c;点击重新初始化云盘即可重新初…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...