SpringBoot整合jasypt加密和解密yml配置文件

使用场景

在微服务架构中,配置管理是一个重要的问题。通常,我们会在配置文件中存放一些敏感信息,如数据库连接字符串、API 密钥等。这些敏感信息如果明文存储在配置文件中,存在较大的安全隐患。为了提高安全性,我们需要对这些敏感信息进行加密。jasypt-spring-boot 是一个简单而强大的库,可以帮助我们在 Spring Boot 应用中轻松实现配置文件的加密和解密。

开源地址:https://github.com/ulisesbocchio/jasypt-spring-boot

jasypt简介

  • Jasypt(Java Simplified Encryption)是一个专注于简化Java加密操作的开源工具。它提供了一种简单而强大的方式来处理数据的加密和解密,使开发者能够轻松地保护应用程序中的敏感信息,如数据库密码、API密钥等。
  • Jasypt的设计理念是简化加密操作,使其对开发者更加友好。它采用密码学强度的加密算法,支持多种加密算法,从而平衡了性能和安全性。其中,Jasypt的核心思想之一是基于密码的加密(Password Based Encryption,PBE),通过用户提供的密码生成加密密钥,然后使用该密钥对数据进行加密和解密。此外,Jasypt还引入了盐(Salt)的概念,通过添加随机生成的盐值,提高了加密的安全性,防止相同的原始数据在不同的加密过程中产生相同的结果,有效抵御彩虹表攻击。
  • Jasypt的功能非常丰富,包括加密属性文件、Spring Framework集成、加密Hibernate数据源配置、URL加密的Apache Wicket集成等。它还可以与Acegi Security(即Spring Security)整合,用于加密任务与应用程序,如加密密码、敏感信息和数据通信,以及创建完整检查数据的sums等。此外,Jasypt还提供了一个开放的API,使得任何Java Cryptography Extension都可以使用它。
  • 在Spring Boot应用中,Jasypt Spring Boot Starter是一个方便的集成工具,可以简化加密功能的配置。它支持多种加密算法,包括对称加密和非对称加密,可以根据实际需求选择合适的加密方式。通过使用Jasypt Spring Boot Starter,可以轻松地将加密功能集成到Spring Boot应用中,无需手动配置复杂的加密相关的代码和配置文件。

jasypt的优点

  1. 提供简单的单向(摘要)和双向加密技术。
  2. 用于任何JCE提供程序的开放API,而不仅仅是默认的Java VM提供程序。
  3. 为您的用户密码提供更高的安全性。
  4. 二进制加密支持。Jasypt允许对二进制文件(字节数组)进行摘要和加密。
  5. 数值加密支持。除了文本和二进制文件,它还允许对数值进行摘要和加密(BigInteger和BigDecimal,加密Hibernate持久性时支持其他数字类型)。
  6. 完全线程安全。
  7. 支持加密/摘要池,以在多处理器/多核系统中实现高性能。
  8. 包括库的轻量级(“精简”)版本,以便在移动平台等大小受限的环境中具有更好的可管理性。

SpringBoot使用jasypt

1.建表语句、数据库数据

CREATE TABLE `emp` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(16) COLLATE utf8mb4_general_ci NOT NULL,`gender` enum('male','female') COLLATE utf8mb4_general_ci NOT NULL,`age` int NOT NULL,`salary` float(10,2) DEFAULT NULL,`dep` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,`notes` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (1, '关羽', 'male', 20, 8000.00, '技术部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (2, '张飞', 'male', 25, 12000.00, '技术部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (3, '赵云', 'male', 19, 6800.00, '技术部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (4, '马超', 'male', 26, 11000.00, '技术部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (5, '黄忠', 'female', 48, 15000.00, '技术部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (6, '夏侯惇', 'male', 36, 34000.00, '技术部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (7, '典韦', 'male', 19, 6500.00, '技术部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (8, '吕布', 'female', 20, 9000.00, '技术部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (9, '周瑜', 'female', 32, 36000.00, '技术部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (10, '文丑', 'male', 27, 24000.00, '技术部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (11, '刘备', 'male', 32, 4000.00, '市场部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (12, '诸葛亮', 'male', 27, 2700.00, '市场部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (13, '庞统', 'male', 37, 4200.00, '市场部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (14, '徐庶', 'male', 36, 4000.00, '市场部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (15, '荀彧', 'male', 25, 2400.00, '市场部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (16, '荀攸', 'male', 25, 2400.00, '市场部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (17, '鲁肃', 'male', 43, 4300.00, '市场部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (18, '司马懿', 'female', 44, 5000.00, '市场部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (19, '杨修', 'male', 19, 800.00, '市场部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (20, '丁仪', 'male', 49, 3500.00, '市场部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (21, '宋江', 'male', 30, 4000.00, '人事部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (22, '吴用', 'male', 38, 3000.00, '人事部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (23, '扈三娘', 'female', 42, 2500.00, '人事部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (24, '顾大嫂', 'female', 38, 3300.00, '人事部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (25, '孙二娘', 'female', 32, 2400.00, '人事部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (26, '丁得孙', 'male', 32, 2800.00, '人事部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (27, '柴进', 'male', 30, 4200.00, '财务部', NULL);
INSERT INTO `mytools`.`emp` (`id`, `name`, `gender`, `age`, `salary`, `dep`, `notes`) VALUES (28, '卢俊义', 'male', 44, 4000.00, '财务部', NULL);

2.在pom.xml引入依赖包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--jasypt依赖--><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version></dependency>

jasypt-spring-boot-3.0.5底层使用jasypt-1.9.3。在引入jasypt-spring-boot后,相关依赖包会自动引入。
在这里插入图片描述

3.配置数据库文件(先不进行加密)

spring:datasource:url: jdbc:mysql://localhost:3306/mytools?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falsedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456

4.java代码

enrtity

package com.zhubayi.jasyptdemo.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;/*** @author zhubayi* @Description */
@TableName(value = "emp")
public class Emp {@TableId(value = "id", type = IdType.AUTO)private Integer id;@TableField(value = "`name`")private String name;@TableField(value = "gender")private Object gender;@TableField(value = "age")private Integer age;@TableField(value = "salary")private Double salary;@TableField(value = "dep")private String dep;@TableField(value = "notes")private String notes;/*** @return id*/public Integer getId() {return id;}/*** @param id*/public void setId(Integer id) {this.id = id;}/*** @return name*/public String getName() {return name;}/*** @param name*/public void setName(String name) {this.name = name;}/*** @return gender*/public Object getGender() {return gender;}/*** @param gender*/public void setGender(Object gender) {this.gender = gender;}/*** @return age*/public Integer getAge() {return age;}/*** @param age*/public void setAge(Integer age) {this.age = age;}/*** @return salary*/public Double getSalary() {return salary;}/*** @param salary*/public void setSalary(Double salary) {this.salary = salary;}/*** @return dep*/public String getDep() {return dep;}/*** @param dep*/public void setDep(String dep) {this.dep = dep;}/*** @return notes*/public String getNotes() {return notes;}/*** @param notes*/public void setNotes(String notes) {this.notes = notes;}
}

mapper

@Mapper
public interface EmpMapper extends BaseMapper<Emp> {
}

service

import com.zhubayi.jasyptdemo.entity.Emp;
import com.baomidou.mybatisplus.extension.service.IService;/*** @author zhubayi* @Description */
public interface EmpService extends IService<Emp>{}

serviceImpl

import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhubayi.jasyptdemo.mapper.EmpMapper;
import com.zhubayi.jasyptdemo.entity.Emp;
import com.zhubayi.jasyptdemo.service.EmpService;
/*** @author zhubayi* @Description */
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService{}

controller

package com.zhubayi.jasyptdemo.controller;import com.zhubayi.jasyptdemo.entity.Emp;
import com.zhubayi.jasyptdemo.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @author zhubayi* @Description*/
@RestController
@RequestMapping("/emp")
public class EmpController {@Autowiredprivate EmpService empService;@GetMapping("/list")public List<Emp> list(){return empService.list();}
}

5.访问接口

地址:http://127.0.0.1:8080/emp/list
在这里插入图片描述

6.配置文件加密

jasypt:encryptor:#  采用的加密算法algorithm: PBEWITHHMACSHA512ANDAES_256# 盐粒password: zhujjtestproperty:prefix: ENC(suffix: )iv-generator-classname: org.jasypt.iv.RandomIvGenerator

6.1通过测试获取加密后的数据

 @AutowiredStringEncryptor stringEncryptor;@Testvoid contextLoads() {String url = stringEncryptor.encrypt("jdbc:mysql://localhost:3306/mytools?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false");String username = stringEncryptor.encrypt("root");String password = stringEncryptor.encrypt("123456");System.out.println("url="+url);System.out.println("username="+username);System.out.println("password="+password);}

在这里插入图片描述
加密后的数据我们已经能够看到了,我现在把这些数据替换到我的application.yml配置文件中。

spring:datasource:#url: jdbc:mysql://localhost:3306/mytools?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falsedriver-class-name: com.mysql.cj.jdbc.Driver#username: root#password: 123456url: ENC(G08+puraFnKtP+WHbADjcmocESS5BzqDUgh1D8I143HP/JgFLkq6gO8Jcnv7Nk60vgU00VPzz1SgeJa7KIv8yQNJK/OKDnZwZkxio/IOiirbBInNzEAv/Ef/ghCEezmavFQcg8+JA/KzZnsb4nHEY2zlmkyZVz4zKO208PUPNpUiv4QZKsgVbOIC6t0V8GZX)username: ENC(LbX/6n3o6Qjw+DXpjYvKGpohvPChCrCQSke0tEowvz+Us3V8KpzwVg0iNjbjyzS8)password: ENC(aFeYlEWNtZVBjEoZCM3Yw+ownuAs/kNNnwFvkZfMRza2PTgtCFOL4EWQV6vE4rsr)

重启项目再次访问http://127.0.0.1:8080/emp/list
在这里插入图片描述

6.2通过build插件
上方给出的方法,虽然我们将数据加密了,但是作为核心的“盐粒”我们却暴露了出来,如果我们不想将“盐粒”暴露呢?那么在你的pom文件中添加下边的代码。

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-maven-plugin</artifactId><!--<version>3.0.5</version>--><configuration><path>file:src/main/resources/application.yml</path></configuration></plugin></plugins></build>

修改配置文件。

jasypt:encryptor:#  采用的加密算法algorithm: PBEWITHHMACSHA512ANDAES_256# 盐粒property:prefix: ENC(suffix: )iv-generator-classname: org.jasypt.iv.RandomIvGenerator
spring:datasource:url: DEC(jdbc:mysql://localhost:3306/mytools?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false)username: DEC(root)password: DEC(123456)driver-class-name: com.mysql.cj.jdbc.Driver

在项目的根目录运行下方指令。后边的那一串就是你要是用的密钥,我是随便填的。

mvn jasypt:encrypt -Djasypt.encryptor.password=zhujjtest

在这里插入图片描述

之后再次点击你的配置文件查看。原始的数据已经被加密了,并且这个加密的“盐粒”只有你知道。
在这里插入图片描述

那么接下来在调用mapper测试接口试试?这里会报红,因为你的配置文件是加密过的,你怎么可能直接去使用一个加密过的数据呢?你必须要先解密,但是你并没有在配置文件当中提供这个“盐粒”,所以你要通过其他的方式把这个“盐粒”添加进去。

idea里面添加

  1. 编辑启动配置
    在这里插入图片描述
  2. 添加虚拟机选项
    在这里插入图片描述

添加参数

-Djasypt.encryptor.password=zhujjtest

在这里插入图片描述
jar包方式添加

把项目打包
在这里插入图片描述
之后在target目录下找到我们打包好的项目,打开cmd窗口运行下方指令。(盐粒要改成你自己的)

java -jar 你自己起的包名.jar --jasypt.encryptor.password=zhujjtest

在这里插入图片描述
访问网址查看,成功获取到数据
在这里插入图片描述

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

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

相关文章

Linux安装与配置

下载VMware 首先我们需要下载一个叫VMware的软件&#xff1a; 进入官方下载&#xff0c;地址&#xff1a;https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html选择与自己电脑版本适配的VMware版本【 输入许可证密钥 MC60H-DWHD5-H80U9-6V85…

Python | “IndexError: tuple index out of range” 【已解决】

Python | “IndexError: tuple index out of range” 【已解决】 IndexError: tuple index out of range 深度解析与实战指南 在Python编程中&#xff0c;IndexError: tuple index out of range是一个常见的错误&#xff0c;它发生在尝试访问元组&#xff08;或其他可索引的数…

前端canvas——贝塞尔曲线

曲线之美&#xff0c;不在于曲线本身&#xff0c;而在于用的人。 所以就有了这期贝塞尔曲线。 新规矩&#xff0c;先上个GIT。 效果图 开局一张图&#xff0c;代码全靠编。 代码 画骨 先想着怎么画一个心形吧&#xff0c;等你想好了&#xff0c;就知道怎么画了。 首先就还…

iPhone 中阅读器模式是什么?怎么开启该模式?

什么是阅读器模式&#xff1f;这是一个浏览器功能&#xff0c;可以为用户提供简洁、干净的阅读界面。当你在 Safari 浏览器中启用阅读器模式时&#xff0c;网页上的广告、侧边栏和其他不相关的元素将被移除&#xff0c;仅保留主要的文字内容和相关图片。这使得用户可以专注于阅…

前端开发的十字路口,薪的出口会是AI吗?

前言 在数字化转型的浪潮中&#xff0c;前端开发一直扮演着至关重要的角色&#xff0c;它连接着用户与产品之间的桥梁。然而&#xff0c;随着技术的不断进步和社会经济环境的变化&#xff0c;前端开发领域也面临着前所未有的挑战和机遇。 前端开发的困境 前端开发领域的竞争…

Vue3多语言实现

1.首先安装i18n npm install vue-i18n 2.在项目下创建lang目录并创建en.ts,i18n1.ts,zh.ts en.ts export default {message: {home: home,appTitle:aa 3D Smart Measure}, Menus: {Measuer: Measure,},GlueMeasure: {Title: Camera 3D Glue Measure,}} zh.ts export …

android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion

1、先明白几个概念 &#xff08;1&#xff09;平台版本&#xff08;Android SDK版本号&#xff09; 平台版本也就是我们平时说的安卓8、安卓9、安卓10 &#xff08;2&#xff09;API级别&#xff08;API Level&#xff09; Android 平台提供的框架 API 被称作“API 级别” …

什么是CAN的BUS-OFF,如何恢复BUS-OFF?

CAN作为一款强大的工业总线&#xff0c;其高性能和高可靠性让其应用特别广泛。一个小知识&#xff1a;汽车里面各个模块之间的通讯就是使用CAN来实现的哦。 既然是总线&#xff0c;那当然会有多个设备挂载在CAN上&#xff0c;当一个设备在发送数据的时候&#xff0c;其他设备也…

基于STC8H4K64TL单片机的RTC(即实时时钟)功能调试

基于STC8H4K64TL单片机的RTC(即实时时钟)功能调试 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单片机管脚图(20个引脚)STC8H系列单片机管脚说明STC8H系列单片机I/O口STC…

大模型不会比大小和单词字母计数?日期计算也是一片混乱

9.9和9.11哪个大&#xff1f;13.8%和13.11%谁大谁小&#xff1f;这两个比大小的问题&#xff0c;前段时间难倒众多大模型&#xff0c;在网上掀起热议。 除此之外&#xff0c;向大模型提问“草莓&#xff08;strawberry&#xff09;这个单词有几个r时”&#xff0c;多家主流大模…

三目操作符

双目操作符有、-、*、/、% 单目操作符有--、、、- 三目操作符有表达式1&#xff1f;表达式2&#xff1a;表达式3 如果表达式1为真则表达式2计算否则表达式3计算&#xff0c;计算结果为整个表达式的结果 #include<stdio.h> int main() {int a 0;int b 0;scanf(&quo…

Doris-计算特性

1 全新优化器 1.1 如何开启1.2 统计信息 1.2.1 使用ANALYZE语句手动收集1.2.1 自动收集1.2.3 作业管理1.3 会话变量及配置项调优参数2 Join相关 2.1 支持的Join算子2.2 支持的shuffle方式 2.2.1 Broadcast Join2.2.2 Shuffle Join2.2.3 Bucket Shuffle Join 2.2.3.1 原理2.2.3.…

PHP反序列化漏洞从入门到深入8k图文介绍,以及phar伪协议的利用

文章参考&#xff1a;w肝了两天&#xff01;PHP反序列化漏洞从入门到深入8k图文介绍&#xff0c;以及phar伪协议的利用 前言 本文内容主要分为三个部分&#xff1a;原理详解、漏洞练习和防御方法。这是一篇针对PHP反序列化入门者的手把手教学文章&#xff0c;特别适合刚接触PH…

Windows搭建我的世界MC服务器 【Minecraft外网联机教程】

目录 ⛳️推荐 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 1.3 创建我的世界服务器 2. 局域网联机测试 3. 安装cpolar内网穿透 4. 公网联机Minecraft 5. 配置固定远程联机端口地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通…

新手转行AI运营岗位,轻松实现月入15K+

近年来人工智能大爆发&#xff0c;各种AI产品层出不穷&#xff0c;市场也出现了一批高薪AI运营类岗位 不需要技术背景、门槛低&#xff0c;即便是新手&#xff0c;也有机会拿下offer。如果你计划今年跳槽或转行运营&#xff0c;这5个岗位不妨试试&#xff08;结尾附国内AI公司清…

科普文:万字梳理高性能 Kafka快的8个原因

概叙 科普文&#xff1a;万字详解Kafka基本原理和应用-CSDN博客 科普文&#xff1a;万字梳理31个Kafka问题-CSDN博客 我们都知道 Kafka 是基于磁盘进行存储的&#xff0c;但 Kafka 官方又称其具有高性能、高吞吐、低延时的特点&#xff0c;其吞吐量动辄几十上百万。 在座的…

【深度学习】kaggle使用

https://blog.csdn.net/2301_78630677/article/details/133834096 https://blog.csdn.net/xiaojia1001/article/details/139467176 https://www.kaggle.com/ 使用要挂代理&#xff0c;要不然可能无法注册 绑定手机号之后才能使用GPU 每周30h免费GPU使用时长 上传数据集 Ad…

安科瑞ACTB系列电流互感器过电压保护器

产品概述&#xff1a; 安科瑞ACTB系列电流互感器过电压保护器是一种重要的电力保护设备&#xff0c;‌主要用于防止电流互感器在运行中因二次绕组开路或一次绕组流过异常电流而在二次侧产生的高压过电压。‌这种保护器能有效防止因电流互感器二次侧异常高压引起的事故&#xf…

手撕数据结构---栈和队列的概念以及实现

栈的概念&#xff1a; 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶&#xff0c;另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈…

opencascade AIS_RubberBand AIS_RotationMode源码学习

//!相机旋转类型 Camera rotation mode. enum AIS_RotationMode { AIS_RotationMode_BndBoxActive, //!< default OCCT rotation AIS_RotationMode_PickLast, //!< rotate around last picked point AIS_RotationMode_PickCenter, //!< rotate around point at the ce…