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

Spring Boot多租户实战指南(Tenant-Aware DataSource深度剖析)

更多请点击 https://intelliparadigm.com第一章Java 多租户数据安全隔离在云原生与 SaaS 架构普及的背景下Java 应用实现多租户Multi-tenancy已成为常态。数据安全隔离是其核心挑战——必须确保租户 A 无法访问、修改或感知租户 B 的任何敏感数据即使共享同一数据库实例或表结构。隔离策略对比不同隔离粒度对应不同安全等级与运维成本策略类型数据库资源安全强度适用场景独立数据库每个租户独占 DB 实例★★★★★金融、医疗等强合规领域共享表 租户ID字段单库单表含 tenant_id 列★★☆☆☆内部工具、低敏感度 SaaSSchema 级隔离单库多 Schema按租户分 schema★★★★☆中高安全要求如教育平台、CRM基于 Spring Boot 的动态数据源路由通过 AbstractRoutingDataSource 实现运行时租户识别与数据源切换public class TenantRoutingDataSource extends AbstractRoutingDataSource { Override protected Object determineCurrentLookupKey() { // 从 ThreadLocal 获取当前租户标识如来自 JWT 或 HTTP Header return TenantContext.getCurrentTenantId(); } }该机制需配合拦截器注入租户上下文并在事务开始前完成数据源绑定避免跨租户污染。关键防护措施所有 SQL 查询必须显式包含 tenant_id 过滤条件禁用无租户约束的全表扫描数据库用户权限按租户 Schema 或角色严格划分禁止跨租户 SELECT 权限JPA/Hibernate 需启用 Filter 或自定义 Interceptor 强制注入租户谓词第二章多租户架构核心模式与Spring Boot适配原理2.1 基于数据库隔离的租户模型Database-per-Tenant实战实现核心架构设计每个租户独占一个物理数据库实例连接路由由租户标识如tenant_id或子域名动态解析。该模型天然杜绝跨租户数据泄露但需配套完善的生命周期管理。连接池路由示例// 根据租户ID获取对应DB连接 func GetTenantDB(tenantID string) (*sql.DB, error) { dbConfig : config.TenantDBs[tenantID] if dbConfig nil { return nil, fmt.Errorf(unknown tenant: %s, tenantID) } return sql.Open(postgres, dbConfig.DSN) }该函数通过预加载的租户-数据库映射表完成毫秒级路由DSN包含独立 host/port/database 名称确保完全隔离。租户元数据管理字段类型说明idVARCHAR(32)租户唯一标识如 subdomain 或 UUIDdb_nameVARCHAR(64)对应数据库名称用于 CREATE DATABASEstatusENUMactive/archived/pending2.2 基于Schema隔离的租户模型Schema-per-Tenant与PostgreSQL/MySQL适配要点核心设计特征每个租户独占一个数据库 schema逻辑完全隔离共享同一物理数据库实例。PostgreSQL 原生支持多 schema而 MySQL 5.7 需将 database 视为 schema 等价体。动态schema路由示例func GetTenantSchema(tenantID string) string { // PostgreSQL: tenant_001, tenant_002... return fmt.Sprintf(tenant_%s, tenantID) }该函数生成租户专属 schema 名PostgreSQL 中需提前CREATE SCHEMA IF NOT EXISTS tenant_001MySQL 则对应CREATE DATABASE IF NOT EXISTS tenant_001。适配差异对比特性PostgreSQLMySQLschema 创建CREATE SCHEMACREATE DATABASE默认搜索路径SET search_path TO tenant_001需切换连接USE tenant_0012.3 基于行级隔离的租户模型Shared Database, Shared Schema与动态WHERE注入防护机制核心隔离原理租户数据共存于同一张物理表通过tenant_id字段实现逻辑隔离。所有读写操作必须显式携带租户上下文否则将导致越权访问。安全WHERE注入示例func BuildTenantQuery(baseSQL string, tenantID string) string { // 自动注入租户过滤条件禁止拼接用户输入 return baseSQL WHERE tenant_id sanitize(tenantID) }该函数强制为每个查询追加tenant_id过滤sanitize()对租户ID执行白名单校验仅允许UUID或数字杜绝SQL注入风险。防护能力对比机制支持多租户防WHERE绕过手动添加WHERE❌ 易遗漏❌ 可被跳过ORM中间件拦截✅ 全局生效✅ 强制注入2.4 租户上下文传播机制ThreadLocal vs InheritableThreadLocal vs Spring WebFlux ReactiveContext线程隔离与继承的边界ThreadLocal仅在当前线程内可见子线程无法继承InheritableThreadLocal创建子线程时拷贝父线程值但不适用于线程池场景ReactiveContext基于Mono.subscriberContext()实现响应式链路透传天然适配异步非阻塞。典型传播失效对比机制线程池兼容性WebFlux Mono/FluxThreadLocal❌需手动reset❌无上下文绑定InheritableThreadLocal❌线程复用导致污染❌无法跨调度器传播ReactiveContext✅自动挂载✅contextWrite contextReadReactiveContext 使用示例Mono.just(data) .contextWrite(ctx - ctx.put(tenantId, t-123)) .flatMap(v - Mono.subscriberContext() .map(ctx - v - ctx.get(tenantId)));该代码将租户ID注入响应式上下文并在下游操作中安全提取contextWrite写入、subscriberContext()读取全程无共享状态避免竞态。2.5 租户标识解析策略HTTP Header、JWT Claim、Subdomain及请求路径多源绑定实践多源解析优先级设计租户标识应支持动态协商按优先级依次尝试JWT Claim HTTP Header Subdomain Path Segment。避免硬编码顺序采用可配置策略链type TenantResolver struct { resolvers []func(r *http.Request) (string, bool) } func (t *TenantResolver) Resolve(r *http.Request) (string, error) { for _, resolve : range t.resolvers { if tenant, ok : resolve(r); ok { return tenant, nil } } return , errors.New(no tenant ID found) }该结构支持运行时注入不同解析器如FromJWT(tenant_id)从 token payload 提取FromHeader(X-Tenant-ID)读取 header解耦策略与实现。解析源对比来源安全性适用场景JWT Claim高签名验证后可信已认证API调用HTTP Header中需网关校验内部服务透传Subdomain低易伪造多租户SaaS前端路由第三章Tenant-Aware DataSource深度实现机制3.1 AbstractRoutingDataSource源码级剖析与线程安全增强改造核心路由逻辑剖析protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceKey(); }该方法是路由决策入口依赖线程局部变量DataSourceContextHolder获取当前数据源标识。其返回值作为resolvedDataSourcesMap 的键进行查找若未命中则抛出异常。线程安全瓶颈AbstractRoutingDataSource本身无状态但路由键获取逻辑如ThreadLocal易受并发污染子类重写的determineCurrentLookupKey()若含共享可变状态将引发路由错乱增强改造关键点改造项说明路由键校验在getConnection()前校验非空且合法读写隔离缓存为resolvedDataSources添加ConcurrentHashMap包装层3.2 多数据源路由键TenantId的生命周期管理与上下文泄漏防护生命周期绑定原则TenantId 必须与请求线程强绑定且仅在 Web 层入口注入、Service 层透传、DAO 层消费禁止跨线程复用或静态缓存。上下文泄漏防护机制使用 ThreadLocalString 存储 TenantId并配合 try-finally 清理异步调用前显式传递并重置上下文框架层拦截器自动校验非空与合法性public class TenantContextHolder { private static final ThreadLocalString CONTEXT ThreadLocal.withInitial(() - null); public static void set(String tenantId) { CONTEXT.set(tenantId); } public static String get() { return CONTEXT.get(); } public static void reset() { CONTEXT.remove(); } // 关键避免线程复用污染 }该实现确保每个请求独占 TenantId 实例reset()在 Filter 或 Interceptor 的 afterCompletion 阶段强制调用防止 Tomcat 线程池复用导致上下文残留。关键参数对照表参数作用域清理时机TenantIdRequest-scopedHTTP 响应完成时ThreadLocal 引用Thread-scoped每次请求结束调用 remove()3.3 连接池HikariCP/Druid租户感知配置与连接隔离验证方案多租户连接隔离核心策略租户标识需在连接获取阶段注入避免连接复用导致的上下文污染。HikariCP 通过自定义 ConnectionCustomizer 实现连接预设Druid 则依赖 Filter 链拦截。HikariCP 租户绑定示例public class TenantAwareConnectionCustomizer implements ConnectionCustomizer { Override public void customize(Connection conn, String dataSourceName) throws SQLException { // 注入当前租户ID至连接会话变量MySQL try (Statement stmt conn.createStatement()) { stmt.execute(SET tenant_id TenantContext.getCurrentTenant() ); } } }该逻辑确保每个连接在归还前已绑定租户上下文配合数据库层的行级权限策略生效。连接隔离验证要点启用连接池的 leakDetectionThreshold 检测连接泄漏对每个租户配置独立的 HikariDataSource 实例轻量级非必需通过 connection-test-query 验证租户变量是否持久化第四章数据安全与租户隔离强化实践4.1 JPA/Hibernate多租户集成hibernate.multiTenancy配置与SessionFactory租户路由钩子核心配置项Hibernate 多租户需显式启用并指定策略hibernate.multiTenancyDATABASE hibernate.tenant_identifier_resolvercom.example.TenantIdentifierResolver hibernate.multi_tenant_connection_providercom.example.MultiTenantConnectionProviderhibernate.multiTenancy 支持 NONE、SCHEMA、DATABASE 三值tenant_identifier_resolver 负责从上下文如请求头、ThreadLocal提取当前租户标识connection_provider 则按租户动态提供隔离的数据源连接。租户路由关键组件TenantIdentifierResolver实现 CurrentTenantIdentifierResolver返回非空租户 ID 字符串MultiTenantConnectionProvider继承 AbstractMultiTenantConnectionProvider重写 selectAnyConnection() 和 getConnection(String tenantId)典型策略对比策略适用场景连接开销DATABASE强隔离租户独占数据库高多数据源SCHEMA共享 DB隔离 Schema如 PostgreSQL中单 DS 动态 SET search_path4.2 MyBatis-Plus租户插件定制SQL自动拼接tenant_id条件与白名单表豁免机制核心原理MyBatis-Plus 的 TenantLineInnerInterceptor 通过 SQL 解析器在执行前动态注入 AND tenant_id ? 条件仅作用于非白名单表的 SELECT、UPDATE、DELETE 语句。白名单配置示例interceptor.setTenantHandler(new TenantHandler() { Override public Expression getTenantId() { return new LongValue(TenantContext.getTenantId()); } Override public String getTenantIdColumn() { return tenant_id; } Override public boolean ignoreTable(String tableName) { return Arrays.asList(sys_user, sys_role).contains(tableName); } });该配置使 sys_user 和 sys_role 表绕过租户过滤适用于全局共享数据ignoreTable() 返回 true 即豁免拦截。生效范围对比SQL 类型是否自动追加 tenant_id白名单表是否豁免SELECT * FROM user是是INSERT INTO user否—4.3 数据访问层审计拦截租户ID强制校验、跨租户查询熔断与SQL注入防御增强租户上下文透传与强制校验在 DAO 层入口统一注入租户校验逻辑确保每个查询语句携带且仅操作当前租户数据// TenantContextInterceptor.go func (i *TenantInterceptor) Before(ctx context.Context, query string, args ...interface{}) error { tenantID : GetTenantIDFromContext(ctx) if tenantID { return errors.New(tenant_id missing in context) } // 自动注入 WHERE tenant_id ?若未显式指定 return nil }该拦截器在 SQL 执行前校验上下文租户标识避免因业务层疏忽导致租户隔离失效。跨租户查询熔断策略检测 SQL 中显式或隐式跨租户条件如tenant_id ! ?或无 tenant_id 过滤触发熔断时记录审计日志并返回ErrCrossTenantAccess支持动态配置白名单表如系统字典表SQL注入防御增强防护机制生效位置覆盖类型参数化预编译ORM 层所有 DML关键词白名单过滤审计拦截器动态拼接 SQL4.4 分布式场景下的租户上下文透传OpenFeign拦截器 Spring Cloud Gateway全局路由标签注入核心挑战与设计目标在多租户微服务架构中需确保租户ID如tenant-id从网关入口贯穿至下游所有Feign调用链路避免手动传递、污染业务代码。Gateway端全局路由标签注入Spring Cloud Gateway 通过GlobalFilter提取请求头中的租户标识并注入到ServerWebExchange的属性中public class TenantHeaderGlobalFilter implements GlobalFilter { Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { String tenantId exchange.getRequest().getHeaders().getFirst(X-Tenant-ID); if (StringUtils.hasText(tenantId)) { exchange.getAttributes().put(TENANT_ID, tenantId); } return chain.filter(exchange); } }该过滤器在路由转发前执行确保下游服务可通过exchange.getAttribute(TENANT_ID)安全获取上下文。Feign端自动透传租户头使用RequestInterceptor拦截所有Feign请求从当前线程上下文如ThreadLocal或ReactiveAdapter提取租户ID并写入HTTP头适配响应式上下文Mono.deferContextual以支持WebFlux与TraceId等其他MDC字段共存不破坏链路追踪第五章总结与展望云原生可观测性的演进路径现代微服务架构下OpenTelemetry 已成为统一采集指标、日志与追踪的事实标准。某金融客户在迁移至 Kubernetes 后通过部署otel-collector并配置 Jaeger exporter将端到端延迟诊断平均耗时从 47 分钟压缩至 90 秒。关键实践验证使用 Prometheus Operator 动态管理 ServiceMonitor实现对 200 无状态服务的零配置指标发现基于 eBPF 的深度网络观测如 Cilium Tetragon捕获 TLS 握手失败的证书链异常定位某支付网关偶发 503 的根因典型部署代码片段# otel-collector-config.yaml生产环境节选 processors: batch: timeout: 1s send_batch_size: 1024 exporters: otlphttp: endpoint: https://ingest.signoz.io:443 headers: Authorization: Bearer ${SIGNOZ_API_KEY}多平台兼容性对比平台Trace 支持Log Pipeline 延迟P95eBPF 集成深度Signoz✅ 全链路800ms基础 syscall 追踪Grafana Tempo Loki✅需手动关联1.2–2.4s需额外部署 Parca未来技术融合点AI 辅助根因分析流程将 OpenTelemetry trace span 数据注入轻量级 LLM如 Phi-3-mini结合 Prometheus 异常指标时间窗自动生成故障假设树Fault Hypothesis Tree已在某电商大促压测中验证可提升 SRE 初筛准确率 63%。

相关文章:

Spring Boot多租户实战指南(Tenant-Aware DataSource深度剖析)

更多请点击: https://intelliparadigm.com 第一章:Java 多租户数据安全隔离 在云原生与 SaaS 架构普及的背景下,Java 应用实现多租户(Multi-tenancy)已成为常态。数据安全隔离是其核心挑战——必须确保租户 A 无法访…...

告别龟速下载!PyCharm里配置Python库的5种方法实测(含阿里云/清华源对比)

PyCharm高效配置Python库的终极指南:5种方法深度评测与实战技巧 每次在PyCharm里安装Python库时,进度条像蜗牛一样缓慢移动,你是否也经历过这种煎熬?作为Python开发者,我们每天都要与各种第三方库打交道,但…...

告别繁琐!用ApkInfoQuick快速提取APK关键信息

我开发了一个开源 APK 信息查看工具:ApkInfoQuick 最近我做了一个小工具,名字叫 ApkInfoQuick。 它是一个面向 Android APK 文件的信息查看与解析工具,支持桌面 GUI,也支持 CLI 命令行。项目已经准备开源放到 GitHub 上&#xff0…...

智能图片去重工具AntiDupl.NET:4大核心模块高效释放存储空间终极指南

智能图片去重工具AntiDupl.NET:4大核心模块高效释放存储空间终极指南 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否经常面临手机相册被重复照片塞满…...

告别VL31N手工操作:用ABAP脚本批量创建内向交货单的自动化实践

告别VL31N手工操作:用ABAP脚本批量创建内向交货单的自动化实践 每天早晨,当SAP SD模块的业务员小王打开VL31N事务码准备处理采购到货时,总会被几十个待创建的交货单淹没。重复输入采购订单号、核对物料信息、点击保存——这样的机械操作不仅耗…...

抖音视频批量下载终极指南:4步打造你的专属内容库

抖音视频批量下载终极指南:4步打造你的专属内容库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. …...

GHelper完整指南:3步轻松掌控华硕笔记本性能与续航

GHelper完整指南:3步轻松掌控华硕笔记本性能与续航 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar,…...

MAXIM美信 MAX30101EFD+T OLGA14 心率传感器

优势与特性 LED反射式心率监测器和脉搏血氧传感器 小巧的5.6mmx3.3mmx1.55mm 14引|脚光学模块集成盖板玻璃,实现最佳、稳健性能 移动设备超低功耗运行 可编程采样率和LED电流以节省电源 低功耗心率监测器(小于1毫瓦)超低关断电流(典型值0.7uA) 快速数据输出能力 高采…...

手机号查询QQ号完整指南:3分钟找回遗忘账号的终极解决方案

手机号查询QQ号完整指南:3分钟找回遗忘账号的终极解决方案 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾因忘记QQ号而无法登录重要账号?或者更换手机后,只记得手机号却找不到对应的QQ账…...

别再只用2D地图了!手把手教你用Vue3+ECharts GL打造可交互的3D中国地图(附完整代码和天空盒资源)

突破平面边界:用Vue3与ECharts GL构建沉浸式3D地理可视化方案 当数据可视化遇上三维空间,地图不再只是冰冷的平面轮廓。想象一下,你的用户可以通过鼠标拖拽360度旋转查看地形起伏,点击省份时区域会动态凸起响应,飞鱼线…...

生图新王GPT Image 2正式发布!彻底告别中文乱码,附无魔法国内稳定渠道

AI绘图圈又迎来了史诗级大地震!出乎所有人意料,OpenAI这次连发布会都没开,GPT-Image-2 就已经全量开放测试了。 目前,所有用户均可免费体验,但无论是免费用户还是付费用户,都会面临严格的额度限制。免费用…...

戴尔笔记本风扇终极管理指南:免费开源智能散热解决方案

戴尔笔记本风扇终极管理指南:免费开源智能散热解决方案 【免费下载链接】DellFanManagement A suite of tools for managing the fans in many Dell laptops. 项目地址: https://gitcode.com/gh_mirrors/de/DellFanManagement 你是否曾因戴尔笔记本风扇噪音过…...

期刊推荐:Journal of Artificial Intelligence and Soft Computing Research(ISSN: 2083-2567)

学科领域: 计算机-人工智能 期刊类型: SCI/SSCI/AHCI 收录数据库: SCI(SCIE) ISSN: 2083-2567 中科院: 2区 影响因子: 2.4 JCR: Q3 咨询获取专业投稿服务 Journal of Artificial Intelli…...

ImageGlass:Windows平台终极开源图像浏览解决方案,高效支持90+格式

ImageGlass:Windows平台终极开源图像浏览解决方案,高效支持90格式 【免费下载链接】ImageGlass 🏞 A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass 在数字图像处理日益普及的今天&am…...

智能制造系统推广的核心的十个关键问题

推广智能制造系统(尤其是迈向资产共生阶段)时,不能只关注设备买入,急须解决以下十个关乎“成败”的核心问题:数据孤岛与协议兼容问题:底层设备品牌庞杂(Fanuc, Siemens, Omron 等)&a…...

Linux下Intel AX101 WiFi 6驱动问题解决方案

1. 问题背景:Alder Lake-N迷你主机在Linux下的WiFi 6兼容性问题最近搭载Intel Alder Lake-N处理器(如N95、N100、Core i3-N300/N305)的迷你主机因其出色的性价比受到广泛关注。这类设备通常配备Intel AX101无线模块,支持WiFi 6&am…...

Git误提交恢复

先执行语句: git reset --mixed HEAD~1add了,也commit了,发现crmeb.zip忘记删除,这个文件不用提交实际执行语句...

别再乱刷了!手把手教你读懂Android卡刷包里的updater-script脚本(附权限设置详解)

深度解析Android卡刷包:从updater-script脚本到安全刷机实践 在Android设备刷机过程中,updater-script脚本扮演着至关重要的角色。这个看似简单的文本文件实际上控制着整个刷机流程的每一个细节操作。对于想要深入了解刷机原理或自行定制ROM的用户来说&a…...

FPGA工程师的JESD204B通关指南:从Subclass1链路建立到调试避坑(附Xilinx/Intel IP核使用心得)

FPGA工程师的JESD204B实战指南:从参数配置到链路调试全解析 在高速数据采集与处理系统中,JESD204B接口已成为连接FPGA与高速ADC/DAC的事实标准。这个看似简单的串行接口背后,却隐藏着复杂的配置参数和严格的时序要求。作为FPGA工程师&#xf…...

串口调试工具:功能强大的Modbus协议支持工具

项目概述 串口调试工具是一款功能丰富、界面友好的串口通信调试软件,专为嵌入式开发、工业控制和物联网设备调试而设计。该工具不仅支持基本的串口通信功能,还集成了Modbus协议生成功能,能够帮助开发者快速构建和测试Modbus通信。 主要特点 支…...

Windows Subsystem for Linux (WSL) 运行 Firefox 浏览器时遇到中文乱码的解决方法

在使用Windows Subsystem for Linux (WSL) 运行 Firefox 浏览器时,有时会遇到中文乱码的问题。这通常是由于字体支持或字符编码设置不正确导致的。以下是一些解决此问题的步骤:1. 确保系统字体支持中文首先,确保你的WSL发行版安装了支持中文的…...

你的ST-LINK是‘李鬼’吗?实测Keil中关闭一个选项,破解‘非正版设备’警告(附原理浅析)

ST-LINK设备真伪检测机制解析与Keil警告消除方案 最近在嵌入式开发社区中,关于"Not a genuine ST Device! Abort connection"警告的讨论热度持续攀升。许多开发者在使用第三方ST-LINK调试器时都会遇到这个恼人的提示,虽然不影响基本功能&#…...

为什么你需要专业的图像矢量化工具?5个实战技巧提升设计效率

为什么你需要专业的图像矢量化工具?5个实战技巧提升设计效率 【免费下载链接】vectorizer Potrace based multi-colored raster to vector tracer. Inputs PNG/JPG returns SVG 项目地址: https://gitcode.com/gh_mirrors/ve/vectorizer 在数字设计领域&…...

Oracle押注AI:万亿豪赌还是泡沫危机?

【本报讯】 科技圈最近掀起一场热议——Oracle的AI算力豪赌,赔率究竟够不够?这家传统数据库巨头正在"All in"人工智能基础设施,但这场赌局背后隐藏着怎样的风险与机遇?从"老派巨头"到"算力新贵"Ora…...

终极指南:5分钟在Windows上安装Dlib预编译包,告别编译噩梦![特殊字符]

终极指南:5分钟在Windows上安装Dlib预编译包,告别编译噩梦!🚀 【免费下载链接】Dlib_Windows_Python3.x Dlib compiled binaries (.whl) for Python 3.7-3.14 and Windows x64 项目地址: https://gitcode.com/gh_mirrors/dl/Dli…...

5分钟掌握B站缓存视频转换:m4s-converter完整使用指南

5分钟掌握B站缓存视频转换:m4s-converter完整使用指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾在B站缓存了珍贵的学习…...

MEMS开关+频率选择表面:GNSS L1频段可重构智能反射面新方案

一句话总结: 本文提出一种基于MEMS开关的可重构频率选择表面(FSS),在不改变物理尺寸的前提下,实现GNSS L1频段的频率调谐与20波束偏转,为智能反射面(IRS)和导航通信一体化系统提供了…...

STM32/GD32 BootLoader实战避坑:为什么你的APP跑飞了?从Flash读写冲突到中断清理的完整排错指南

STM32/GD32 BootLoader实战避坑指南:从Flash冲突到中断管理的深度排错 当你熬夜调试的BootLoader终于成功烧录APP,却在跳转瞬间遭遇HardFault——这种崩溃感每个嵌入式开发者都深有体会。本文将带你直击BootLoader开发中最隐蔽的六大"杀手"&am…...

第45篇:文本生成实战:使用GPT-2创作故事——体验AI的“创造力”(项目实战)

文章目录项目背景技术选型架构设计核心实现1. 准备模型与分词器2. 构建文本生成函数3. 体验不同的生成策略踩坑记录效果对比与项目扩展项目背景 在之前的项目中,我们处理的多是分类、预测等“理解型”任务。这次,我想带大家玩点不一样的——让AI“创造”…...

BiliTools:你的全能B站资源管家,轻松管理哔哩哔哩内容

BiliTools:你的全能B站资源管家,轻松管理哔哩哔哩内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliT…...