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

SpringBoot项目集成MinIO

最近在学习MinIO,所以想让自己的SpringBoot项目集成MinIO,在网上查阅资料,并进行操作的过程中遇到一些问题,所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。

一. MinIO的下载安装以及基本使用

1. 下载地址:https://dl.min.io/server/minio/release/windows-amd64/minio.exe

2. 下载好后需要手动创建data文件夹用于存储MinIO中的数据。

3. 键入cmd

4. 设置MinIO的一些变量

set MINIO_ROOT_USER=admin

set MINIO_ROOT_PASSWORD=admin123

set MINIO_ACCESS_KEY=admin

set MINIO_SECRET_KEY=admin123

下面是我踩的坑,如果只设置了MINIO_ROOT_USER和MINIO_ROOT_PASSWORD的值,而不设置MINIO_ACCESS_KEY和MINIO_SECRET_KEY的值,当启动minio服务的时候就会报以下异常:

所以一定要设置好后面两个变量的值。

5. 启动minio服务

> minio.exeserver data

启动后就会出现minio服务的地址,按住ctrl再点击即可访问该网址。

6.进入登录页面后,输入对应的用户名和密码,也就是之前设置的MINIO_ROOT_USER和MINIO_ROOT_PASSWORD的值。

7. 进入主界面后,点击左侧导航栏中的Buckets,然后点击Create Bucket。

8. 创建好之后,点击左侧导航栏中的Object Browser就可以看到创建好的桶了。

9. 进入该桶,点击upload,上传一个文件,桶的默认权限是private,所以外界访问不到,需要修改访问权限为public,但是要注意安全问题。

10. 点击左侧导航栏中的Buckets,进入该桶,修改权限为public,这样外界就可以访问上传的文件了。

二. SpringBoot集成MinIO

  1. 引入依赖
io.minio minio 7.0.2

2. 编写配置文件

server:
port: 8081
spring:

配置文件上传大小限制

servlet:
multipart:
max-file-size: 200MB
max-request-size: 200MB
minio:
host: http://127.0.0.1:9000
url: m i n i o . h o s t / {minio.host}/ minio.host/{minio.bucket}/
access-key: minioadmin
secret-key: minioadmin
bucket: public

3. 添加配置文件

package com.suwell.serv.ocr.component;
?
import io.minio.MinioClient;
import io.minio.ObjectStat;
import io.minio.PutObjectOptions;
import io.minio.Result;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.util.UriUtils;
?
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
?
?
@Component
public class MinioConfig implements InitializingBean {
?? ?@Value(value = "${minio.bucket}")? ?private String bucket;
?? ?@Value(value = "${minio.host}")? ?private String host;
?? ?@Value(value = "${minio.url}")? ?private String url;
?? ?@Value(value = "${minio.access-key}")? ?private String accessKey;
?? ?@Value(value = "${minio.secret-key}")? ?private String secretKey;
?? ?private MinioClient minioClient;
?? ?@Override? ?public void afterPropertiesSet() throws Exception {? ? ? ?Assert.hasText(url, "Minio url 为空");? ? ? ?Assert.hasText(accessKey, "Minio accessKey为空");? ? ? ?Assert.hasText(secretKey, "Minio secretKey为空");? ? ? ?this.minioClient = new MinioClient(this.host, this.accessKey, this.secretKey);?  }
?
?
?? ?/**? ? * 上传? ? */? ?public String putObject(MultipartFile multipartFile) throws Exception {? ? ? ?// bucket 不存在,创建? ? ? ?if (!minioClient.bucketExists(this.bucket)) {? ? ? ? ? ?minioClient.makeBucket(this.bucket);? ? ?  }? ? ? ?try (InputStream inputStream = multipartFile.getInputStream()) {? ? ? ? ? ?// 上传文件的名称? ? ? ? ? ?String fileName = multipartFile.getOriginalFilename();? ? ? ? ? ?// PutObjectOptions,上传配置(文件大小,内存中文件分片大小)? ? ? ? ? ?PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);? ? ? ? ? ?// 文件的ContentType? ? ? ? ? ?putObjectOptions.setContentType(multipartFile.getContentType());? ? ? ? ? ?minioClient.putObject(this.bucket, fileName, inputStream, putObjectOptions);? ? ? ? ? ?// 返回访问路径? ? ? ? ? ?return this.url + UriUtils.encode(fileName, StandardCharsets.UTF_8);? ? ?  }?  }
?? ?/**? ? * 文件下载? ? */? ?public void download(String fileName, HttpServletResponse response){? ? ? ?// 从链接中得到文件名? ? ? ?InputStream inputStream;? ? ? ?try {? ? ? ? ? ?MinioClient minioClient = new MinioClient(host, accessKey, secretKey);? ? ? ? ? ?ObjectStat stat = minioClient.statObject(bucket, fileName);? ? ? ? ? ?inputStream = minioClient.getObject(bucket, fileName);? ? ? ? ? ?response.setContentType(stat.contentType());? ? ? ? ? ?response.setCharacterEncoding("UTF-8");? ? ? ? ? ?response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));? ? ? ? ? ?byte[] buffer = new byte[1024];? ? ? ? ? ?int length;? ? ? ? ? ?while ((length = inputStream.read(buffer)) > 0) {? ? ? ? ? ? ? ?response.getOutputStream().write(buffer, 0, length);? ? ? ? ?  }? ? ? ? ? ?inputStream.close();? ? ?  } catch (Exception e){? ? ? ? ? ?e.printStackTrace();? ? ? ? ? ?System.out.println("有异常:" + e);? ? ?  }?  }
?? ?/**? ? * 列出所有存储桶名称? ? *? ? * @return? ? * @throws Exception? ? */? ?public List<String> listBucketNames()? ? ? ? ? ?throws Exception {? ? ? ?List<Bucket> bucketList = listBuckets();? ? ? ?List<String> bucketListName = new ArrayList<>();? ? ? ?for (Bucket bucket : bucketList) {? ? ? ? ? ?bucketListName.add(bucket.name());? ? ?  }? ? ? ?return bucketListName;?  }
?? ?/**? ? * 查看所有桶? ? *? ? * @return? ? * @throws Exception? ? */? ?public List<Bucket> listBuckets()? ? ? ? ? ?throws Exception {? ? ? ?return minioClient.listBuckets();?  }
?? ?/**? ? * 检查存储桶是否存在? ? *? ? * @param bucketName? ? * @return? ? * @throws Exception? ? */? ?public boolean bucketExists(String bucketName) throws Exception {? ? ? ?boolean flag = minioClient.bucketExists(bucketName);? ? ? ?if (flag) {? ? ? ? ? ?return true;? ? ?  }? ? ? ?return false;?  }
?? ?/**? ? * 创建存储桶? ? *? ? * @param bucketName? ? * @return? ? * @throws Exception? ? */? ?public boolean makeBucket(String bucketName)? ? ? ? ? ?throws Exception {? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?if (!flag) {? ? ? ? ? ?minioClient.makeBucket(bucketName);? ? ? ? ? ?return true;? ? ?  } else {? ? ? ? ? ?return false;? ? ?  }?  }
?? ?/**? ? * 删除桶? ? *? ? * @param bucketName? ? * @return? ? * @throws Exception? ? */? ?public boolean removeBucket(String bucketName)? ? ? ? ? ?throws Exception {? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?if (flag) {? ? ? ? ? ?Iterable<Result<Item>> myObjects = listObjects(bucketName);? ? ? ? ? ?for (Result<Item> result : myObjects) {? ? ? ? ? ? ? ?Item item = result.get();? ? ? ? ? ? ? ?// 有对象文件,则删除失败? ? ? ? ? ? ? ?if (item.size() > 0) {? ? ? ? ? ? ? ? ? ?return false;? ? ? ? ? ? ?  }? ? ? ? ?  }? ? ? ? ? ?// 删除存储桶,注意,只有存储桶为空时才能删除成功。? ? ? ? ? ?minioClient.removeBucket(bucketName);? ? ? ? ? ?flag = bucketExists(bucketName);? ? ? ? ? ?if (!flag) {? ? ? ? ? ? ? ?return true;? ? ? ? ?  }
?? ? ?  }? ? ? ?return false;?  }
?? ?/**? ? * 列出存储桶中的所有对象? ? *? ? * @param bucketName 存储桶名称? ? * @return? ? * @throws Exception? ? */? ?public Iterable<Result<Item>> listObjects(String bucketName) throws Exception {? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?if (flag) {? ? ? ? ? ?return minioClient.listObjects(bucketName);? ? ?  }? ? ? ?return null;?  }
?? ?/**? ? * 列出存储桶中的所有对象名称? ? *? ? * @param bucketName 存储桶名称? ? * @return? ? * @throws Exception? ? */? ?public List<String> listObjectNames(String bucketName) throws Exception {? ? ? ?List<String> listObjectNames = new ArrayList<>();? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?if (flag) {? ? ? ? ? ?Iterable<Result<Item>> myObjects = listObjects(bucketName);? ? ? ? ? ?for (Result<Item> result : myObjects) {? ? ? ? ? ? ? ?Item item = result.get();? ? ? ? ? ? ? ?listObjectNames.add(item.objectName());? ? ? ? ?  }? ? ?  }? ? ? ?return listObjectNames;?  }
?? ?/**? ? * 删除一个对象? ? *? ? * @param bucketName 存储桶名称? ? * @param objectName 存储桶里的对象名称? ? * @throws Exception? ? */? ?public boolean removeObject(String bucketName, String objectName) throws Exception {? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?if (flag) {? ? ? ? ? ?List<String> objectList = listObjectNames(bucketName);? ? ? ? ? ?for (String s : objectList) {? ? ? ? ? ? ? ?if(s.equals(objectName)){? ? ? ? ? ? ? ? ? ?minioClient.removeObject(bucketName, objectName);? ? ? ? ? ? ? ? ? ?return true;? ? ? ? ? ? ?  }? ? ? ? ?  }? ? ?  }? ? ? ?return false;?  }
?? ?/**? ? * 文件访问路径? ? *? ? * @param bucketName 存储桶名称? ? * @param objectName 存储桶里的对象名称? ? * @return? ? * @throws Exception? ? */? ?public String getObjectUrl(String bucketName, String objectName) throws Exception {? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?String url = "";? ? ? ?if (flag) {? ? ? ? ? ?url = minioClient.getObjectUrl(bucketName, objectName);? ? ?  }? ? ? ?return url;?  }
?
}

4. 编写测试类进行测试

package com.suwell.serv.ocr.controller;
?
import com.suwell.serv.ocr.component.MinioConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
?
import javax.servlet.http.HttpServletResponse;
import java.util.List;
?
@RestController
@CrossOrigin
@RequestMapping("/test")
public class MinioController {
?? ?@Autowired? ?MinioConfig minioConfig;
?? ?// 上传? ?@PostMapping("/upload")? ?public Object upload(@RequestParam("file") MultipartFile multipartFile) throws Exception {? ? ? ?return this.minioConfig.putObject(multipartFile);?  }
?? ?// 下载文件? ?@GetMapping("/download")? ?public void download(@RequestParam("fileName")String fileName, HttpServletResponse response) {? ? ? ?this.minioConfig.download(fileName,response);?  }
?? ?// 列出所有存储桶名称? ?@PostMapping("/list")? ?public List<String> list() throws Exception {? ? ? ?return this.minioConfig.listBucketNames();?  }
?? ?// 创建存储桶? ?@PostMapping("/createBucket")? ?public boolean createBucket(String bucketName) throws Exception {? ? ? ?return this.minioConfig.makeBucket(bucketName);?  }
?? ?// 删除存储桶? ?@PostMapping("/deleteBucket")? ?public boolean deleteBucket(String bucketName) throws Exception {? ? ? ?return this.minioConfig.removeBucket(bucketName);?  }
?? ?// 列出存储桶中的所有对象名称? ?@PostMapping("/listObjectNames")? ?public List<String> listObjectNames(String bucketName) throws Exception {? ? ? ?return this.minioConfig.listObjectNames(bucketName);?  }
?? ?// 删除一个对象? ?@PostMapping("/removeObject")? ?public boolean removeObject(String bucketName, String objectName) throws Exception {? ? ? ?return this.minioConfig.removeObject(bucketName, objectName);?  }
?? ?// 文件访问路径? ?@PostMapping("/getObjectUrl")? ?public String getObjectUrl(String bucketName, String objectName) throws Exception {? ? ? ?return this.minioConfig.getObjectUrl(bucketName, objectName);?  }
}

5. 使用postman进行本地测试

6. 最后查看public桶中是否有刚才上传的文件就可以了。如果有则表明你的项目已经成功集成minio了。

以上就是springboot项目如何集成minio的全部内容了,如果对你有帮助我会感到非常荣幸。

相关文章:

SpringBoot项目集成MinIO

最近在学习MinIO&#xff0c;所以想让自己的SpringBoot项目集成MinIO,在网上查阅资料&#xff0c;并进行操作的过程中遇到一些问题&#xff0c;所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。 一. MinIO的下载安装以及基本使用 1. 下载地址&#xff1a;https://d…...

第30篇 基于ARM A9处理器用C语言实现中断<六>

Q&#xff1a;怎样设计基于ARM A9处理器的C语言程序在数码管上滚动显示字符&#xff1f; A&#xff1a;使用A9 Private Timer中断源&#xff0c;控制字符滚动的速度&#xff1b;按键产生中断可以控制字符暂停/继续滚动。 本实验在DE1-SoC开发板的6个七段数码管*HEX5~HEX0*上…...

Flutter 中的单例模式

传统&#xff1a; class RouterManager {// 单例模式static final RouterManager _instance RouterManager._internal();factory RouterManager() {return _instance;}RouterManager._internal(); }传递参数进行初始化时&#xff1a; class RouterManager {// 私有静态实例&a…...

8.python文件

文章目录 1.**文件**1.1**文件是什么**1.2**文件路径**1.3**文件操作**1.3.1**打开文件**1.3.2**关闭文件**1.3.3**写文件**1.3.4**读文件** 1.4**关于中文的处理**1.5**使用上下文管理器** 大家好&#xff0c;我是晓星航。今天为大家带来的是 python文件 相关的讲解&#xff0…...

2025vue4.x全栈学习关键技术分析线路图

关键升级点说明‌&#xff1a; ‌编译优化‌ &#xff1a;Vue 4.x采用WASM编译提速300% ‌智能工具链‌ &#xff1a;Vite插件市场新增AI代码审查模块 ‌跨平台能力‌ &#xff1a;Uni-App支持原生ARCore/ARKit调用 ‌安全增强‌ &#xff1a;默认启用WebAuthn生物认证…...

革新之力:数字科技——重塑未来的超越想象之旅

在21世纪的科技浪潮中&#xff0c;数字科技如同一股不可阻挡的洪流&#xff0c;正以前所未有的速度和广度改变着我们的生活、工作乃至整个社会的结构。它不仅是技术的简单迭代&#xff0c;更是对人类社会认知边界的拓宽&#xff0c;对经济模式、社会治理、文化形态等多方面的深…...

超级详细,知识图谱系统的理论详解+部署过程

知识图谱系统(Knowledge Graph System)是一种用于表示、存储、查询和推理知识的系统。它通过结构化的方式将现实世界中的实体、概念及其相互关系组织成一个图结构,从而帮助机器理解和处理复杂的知识。 知识图谱的核心组成部分 实体(Entities): 实体是知识图谱中的节点,…...

电路笔记 (信号): opa tips 放大器反馈电阻并联电容抑制高频噪声的详细推导(传递函数分析)

1. 高频噪声传递函数分析 &#xff08;1&#xff09;电路结构 输入信号通过 R 1 R_1 R1​ 和 C NI C_{\text{NI}} CNI​ 的并联组合连接到运放的同相输入端。反馈电阻 R 2 R_2 R2​ 连接在运放的输出端和反相输入端之间。 Layer 1 - 30p R2 R1 R3R1//R2 IN OUT 反向放大电…...

DeepSeek安装部署笔记(一)

Ollamaopen-WebUI部署 DeepSeek安装部署笔记第一步 Ollama安装1.安装ollama&#xff1a;官网https://ollama.com/下载2.上面安装完成&#xff0c;在cmd命令行&#xff1a; 第二步 给DeepSeek添加OpenWebUI界面&#xff08;重点&#xff09;1.安装conda&#xff1a;用它来管理py…...

【JavaEE进阶】Spring MVC(4)-图书管理系统案例

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 图书管理系统 创建书籍类BookInfo import lombok.Data;import java.math.BigDecimal;Data //这个类基本上是和数据库对应起来的 public class BookInfo {private Integer id…...

Ubuntu部署ktransformers

准备工作 一台服务器 CPU&#xff1a;500G GPU&#xff1a;48G&#xff08;NVIDIA4090&#xff09; 系统&#xff1a;Ubuntu20.04&#xff08;github的文档好像用的是22.04&#xff09; 第一步&#xff1a;下载权重文件 1.下载hfd wget https://hf-mirror.com/hfd/hfd.s…...

助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全

在数字化转型的浪潮中&#xff0c;越来越多的企业选择私有化部署AI技术&#xff0c;以保障数据安全、提升业务效率并实现自主可控。DeepSeek作为行业领先的AI开源技术&#xff0c;其技术可以支持企业私有化部署&#xff0c;企业需要一站式服务私有化部署&#xff0c;涵盖硬件采…...

面试官询问项目前后端人员配比之高分示范回答

面试官询问项目前后端人员配比之高分示范回答 以下是对两个项目前后端人员配置的精准分析,结合 技术复杂度、协作效率、风险控制 三个维度设计回答,突出合理性与团队协作意识: 一、《x能x服》项目(Vue重构) 1. 人员配置与分工 前端:1人(独立开发) 负责旧系统业务逻辑…...

MyBatis中的日志和映射器说明

1.MyBatis中的日志 1.1 什么是日志 ​ 在我们编写应用的时候&#xff0c;有一些信息需要及时查看&#xff0c;查看的时候有时需要输出到控制台&#xff0c;有时需要输出到文件。MyBatis也需要日志&#xff0c;一般情况下&#xff0c;使用log4j进行日志管理。 1.2 在MyBatis中…...

深入了解 Pinia:Vue 的下一代状态管理工具 (上篇)

引言 在现代前端开发中&#xff0c;状态管理是构建复杂应用的关键。Vue 生态系统中&#xff0c;Vuex 一直是官方推荐的状态管理工具。然而&#xff0c;随着 Vue 3 的发布&#xff0c;一个新的状态管理工具——Pinia&#xff0c;逐渐崭露头角。Pinia 不仅继承了 Vuex 的优点&am…...

Unity 中导入的VRM模型渲染为VRoid风格

按照前篇Unity VRoidBlenderUnity 3D人物模型导入使用-CSDN博客 导入到Unity之后,可以按需调整模型在场景中的渲染表现, 但是按照教程中完成的情况, 整个模型没有进行材质区分, 仅用一个材质表现整个模型, 导致不能给不同部位进行渲染调整. 这里我希望能够在Unity中获得跟VRoi…...

【ELK】【Elasticsearch 】DSL 和 DQL

1. DSL 查询&#xff08;Query DSL&#xff09; 全称&#xff1a;Domain Specific Language&#xff08;领域特定语言&#xff09;。 定义&#xff1a;Elasticsearch 提供的一种基于 JSON 的查询语言&#xff0c;用于构建复杂的查询逻辑。 特点&#xff1a; 支持多种查询类型…...

最新版本Exoplayer扩展FFmpeg音频软解码保姆级教程

ExoPlayer 是一个开源的 Android 媒体播放库&#xff0c;由 Google 开发和维护&#xff0c;用于替代 Android 系统自带的 MediaPlayer。它提供了更强大的功能、更好的性能和更高的灵活性&#xff0c;适用于各种复杂的媒体播放场景。所以被广泛用于各种播放器场景。 最近项目中…...

面对低消费欲人群,我们如何开发其需求?

在市场增量放缓的当下&#xff0c;开发深度开发各层次的人群已经成为现实需求。低消费欲人群并非“没有需求”&#xff0c;而是更谨慎、更理性。他们可能对价格敏感&#xff0c;但对实用性、情感共鸣和生活品质的追求依然存在。就让我们从以下四个角度&#xff0c;拆解如何激发…...

《算法基础入门:最常用的算法详解与应用(持续更新实战与面试题)》

1. 排序算法 排序算法是将一组数据按特定的顺序排列起来的算法&#xff0c;常见的有&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;选择排序&#xff08;Selection Sort&#xff09;插入排序&#xff08;Insertion Sort&#xff09;归并排序&#xff08;Merge So…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...