基于 PostgreSQL 的 ABP vNext + ShardingCore 分库分表实战
🚀 基于 PostgreSQL 的 ABP vNext + ShardingCore 分库分表实战
📑 目录
- 🚀 基于 PostgreSQL 的 ABP vNext + ShardingCore 分库分表实战
- ✨ 背景介绍
- 🧱 技术选型
- 🛠️ 环境准备
- ✅ Docker Compose(多库 & 读写分离演示)
- 🚀 环境与容器启动流程
- ✅ 基础表与分表初始化脚本
- 📦 分表初始化流程
- ✅ `appsettings.json` 样板
- ✅ NuGet 包安装
- 🧩 项目实现步骤
- 1. 定义分片键接口
- 2. 实体与 DbContext
- 3. SaveChanges 拦截器
- 4. 分表路由规则
- 5. `Program.cs` 配置
- 🛠️ 服务启动与配置流程
- 6. 分片引导器服务
- 7. 控制器示例:批量插入与异常处理
- 🔄 请求处理与分片路由流程
- 8. 集成测试示例(xUnit & WebApplicationFactory)
- ✅ 性能优化与最佳实践
- 🔍 监控与指标采集流程
- 🔗 总结
✨ 背景介绍
随着系统数据量的增长,单表性能瓶颈和数据库存储压力日益显著,分库分表逐渐成为解决大数据、高并发问题的有效手段。ABP vNext 提供模块化和扩展能力,ShardingCore 是基于 EF Core 的轻量级分库分表中间件。本文结合两者,并引入监控、健康检查与读写分离等生产级要素,基于 PostgreSQL 构建一套高性能、高可用、可复现的分库分表解决方案。
🧱 技术选型
- ABP vNext 8.1.5
- EF Core 8.0.4
- PostgreSQL 15
- ShardingCore 7.8.1.21
- .NET 8 SDK
- EFCore.BulkExtensions(批量插入)
- Polly(重试与熔断)
- OpenTelemetry & Prometheus(监控与指标)
🛠️ 环境准备
✅ Docker Compose(多库 & 读写分离演示)
🚀 环境与容器启动流程
version: '3.8'
services:pg0:image: postgres:15environment:POSTGRES_DB: shard_dbPOSTGRES_USER: postgresPOSTGRES_PASSWORD: passports:- "5432:5432"pg1:image: postgres:15environment:POSTGRES_DB: shard_db_1POSTGRES_USER: postgresPOSTGRES_PASSWORD: passports:- "5433:5432"pg-replica:image: postgres:15environment:POSTGRES_DB: shard_dbPOSTGRES_USER: postgresPOSTGRES_PASSWORD: pass# 可配置流复制,示例略ports:- "5434:5432"app:build: .depends_on:- pg0- pg1- pg-replicaenvironment:ConnectionStrings__Default: Host=pg0;Database=shard_db;Username=postgres;Password=passConnectionStrings__Shard1: Host=pg1;Database=shard_db_1;Username=postgres;Password=passConnectionStrings__ReadReplica: Host=pg-replica;Database=shard_db;Username=postgres;Password=passports:- "5000:80"
✅ 基础表与分表初始化脚本
-- 创建基础表
CREATE TABLE IF NOT EXISTS public."Order" ("Id" BIGSERIAL PRIMARY KEY,"OrderNo" VARCHAR(50) NOT NULL,"Amount" NUMERIC(18,2) NOT NULL,"CreationTime" TIMESTAMPTZ NOT NULL,"CreatorUserId" BIGINT NULL
);-- 自动创建近 12 个月的分表
DO $$
BEGINFOR i IN 0..11 LOOPEXECUTE format('CREATE TABLE IF NOT EXISTS public."Order_%s" (LIKE public."Order" INCLUDING ALL);',to_char(current_date - (i || '' month'')::interval, ''YYYYMM''));END LOOP;
END
$$;
📦 分表初始化流程
✅ appsettings.json
样板
{"ConnectionStrings": {"Default": "Host=pg0;Database=shard_db;Username=postgres;Password=pass","Shard1": "Host=pg1;Database=shard_db_1;Username=postgres;Password=pass","ReadReplica": "Host=pg-replica;Database=shard_db;Username=postgres;Password=pass"}
}
✅ NuGet 包安装
dotnet add package ShardingCore
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
dotnet add package EFCore.BulkExtensions
dotnet add package Polly.Extensions.Http
dotnet add package OpenTelemetry.Extensions.Hosting
dotnet add package OpenTelemetry.Exporter.Console
dotnet add package prometheus-net.AspNetCore
🧩 项目实现步骤
1. 定义分片键接口
using System;
using ShardingCore.Core.EntityMetadatas;public interface IShardingKeyIsCreationTime
{[ShardingKey]DateTime CreationTime { get; set; }
}
2. 实体与 DbContext
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.Domain.Entities;public class Order : AggregateRoot<long>, ICreationAudited, IShardingKeyIsCreationTime
{public string OrderNo { get; set; }public decimal Amount { get; set; }public DateTime CreationTime { get; set; }public long? CreatorUserId { get; set; }
}using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;public class AppDbContext : AbpDbContext<AppDbContext>
{public DbSet<Order> Orders { get; set; }public AppDbContext(DbContextOptions<AppDbContext> options): base(options) { }protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(builder);builder.Entity<Order>().Property(o => o.CreationTime).HasDefaultValueSql("NOW() at time zone 'utc'").ValueGeneratedOnAdd();}
}
3. SaveChanges 拦截器
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using ShardingCore.Core.EntityMetadatas;public class AuditInterceptor : SaveChangesInterceptor
{public override ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData,InterceptionResult<int> result,CancellationToken ct = default){var context = eventData.Context;if (context != null){foreach (var entry in context.ChangeTracker.Entries<Order>().Where(e => e.State == EntityState.Added)){entry.Entity.CreationTime = DateTime.UtcNow;entry.Entity.OrderNo = SnowflakeIdGenerator.NewId();}}return base.SavingChangesAsync(eventData, result, ct);}
}
4. 分表路由规则
using System;
using ShardingCore.Core.VirtualRoutes.Modify;public class OrderMonthlyRoute : AbstractSimpleShardingMonthKeyDateTimeVirtualTableRoute<Order>
{public override bool AutoCreateTableByTime => true;public override string GetActualTableName(string tableName, DateTime shardingKey)=> $"{tableName}_{shardingKey:yyyyMM}";
}
5. Program.cs
配置
using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Polly.Extensions.Http;
using Prometheus;
using ShardingCore.Core.VirtualRoutes.Modify;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var cfg = builder.Configuration;// 拦截器
services.AddSingleton<AuditInterceptor>();// EF + ShardingCore
services.AddShardingDbContext<AppDbContext>().UseRouteConfig(o => o.AddShardingTableRoute<OrderMonthlyRoute>()).UseConfig((sp, o) =>{o.UseShardingQuery((conn, opt) => opt.UseNpgsql(conn)).UseShardingTransaction((conn, opt) => opt.UseNpgsql(conn)).AddDefaultDataSource("ds0", cfg["ConnectionStrings:Default"]).AddDataSource("ds1", cfg["ConnectionStrings:Shard1"]).UseReadWriteSeparation(writeConn: cfg["ConnectionStrings:Default"],readConn: cfg["ConnectionStrings:ReadReplica"],readWeight: 5, writeWeight: 1);}).AddShardingCore().AddInterceptors(sp => new[] { sp.GetRequiredService<AuditInterceptor>() });// 分片引导后台服务
services.AddHostedService<ShardingBootstrapperService>();// 健康检查
services.AddHealthChecks().AddNpgSql(cfg["ConnectionStrings:Default"], name: "shard-ds0").AddNpgSql(cfg["ConnectionStrings:Shard1"], name: "shard-ds1");// OpenTelemetry Tracing
services.AddOpenTelemetryTracing(b =>b.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("ShardingDemo")).AddAspNetCoreInstrumentation().AddEntityFrameworkCoreInstrumentation().AddConsoleExporter()
);// Prometheus Metrics
services.AddMetricServer();
services.AddHttpMetrics();// HttpClient + Polly
services.AddHttpClient("defaultClient").AddPolicyHandler(HttpPolicyExtensions.HandleTransientHttpError().WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2))).AddPolicyHandler(HttpPolicyExtensions.HandleTransientHttpError().CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)));services.AddControllers();var app = builder.Build();
app.UseHttpMetrics();
app.MapHealthChecks("/health");
app.MapControllers();
app.Run();
🛠️ 服务启动与配置流程
6. 分片引导器服务
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using ShardingCore.Sharding.Abstractions;public class ShardingBootstrapperService : IHostedService
{private readonly IShardingBootstrapper _bootstrapper;public ShardingBootstrapperService(IShardingBootstrapper bootstrapper)=> _bootstrapper = bootstrapper;public Task StartAsync(CancellationToken ct) => _bootstrapper.StartAsync(ct);public Task StopAsync(CancellationToken ct) => _bootstrapper.DisposeAsync().AsTask();
}
7. 控制器示例:批量插入与异常处理
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories;[ApiController]
[Route("api/orders")]
public class OrderController : ControllerBase
{private readonly AppDbContext _context;public OrderController(AppDbContext context) => _context = context;[HttpPost("batch")]public async Task<IActionResult> CreateBatchAsync(CancellationToken ct){try{var orders = Enumerable.Range(1, 10).Select(_ => new Order { Amount = 99.99m }).ToList();await _context.BulkInsertAsync(orders, cancellationToken: ct);return Ok(orders);}catch (DbUpdateException ex){return StatusCode(500, new { message = "数据库写入失败", error = ex.Message });}}
}
🔄 请求处理与分片路由流程
8. 集成测试示例(xUnit & WebApplicationFactory)
using System.Collections.Generic;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Testing;
using Xunit;public class OrderControllerTests : IClassFixture<WebApplicationFactory<Program>>
{private readonly HttpClient _client;public OrderControllerTests(WebApplicationFactory<Program> factory)=> _client = factory.CreateClient();[Fact]public async Task CreateBatch_Returns10Orders(){var response = await _client.PostAsync("/api/orders/batch", null);response.EnsureSuccessStatusCode();var json = await response.Content.ReadAsStringAsync();var orders = JsonSerializer.Deserialize<List<Order>>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });Assert.Equal(10, orders.Count);}
}
✅ 性能优化与最佳实践
- 基础表 DDL:提供
Order
表完整建表语句,避免“表不存在”问题 - 一键分表:脚本自动生成近 N 个月分表,支持生产环境预建表
- 业务化 ID:雪花算法生成全局唯一
OrderNo
- 批量插入:
EFCore.BulkExtensions
+CancellationToken
提升写入吞吐 - 多副本读写分离:真实多库演示,读库权重 configurable
- Polly:重试 + 熔断保障网络抖动
- 健康检查:
AddNpgSql
实时监控各分片状态 - 链路追踪:
OpenTelemetry.Exporter.Console
+ EF Core Instrumentation - 指标采集:
prometheus-net
+UseMetricServer()
🔍 监控与指标采集流程
🔗 总结
本文覆盖了从多实例 Docker Compose、基础表 DDL、分表脚本、appsettings.json
样板,到实体设计、拦截器、路由规则、完整 Program.cs
配置、后台引导、控制器示例和集成测试的全链路。帮助读者快速落地“高性能、高可用、可复现”的 ABP vNext + ShardingCore 分库分表解决方案。
相关文章:
基于 PostgreSQL 的 ABP vNext + ShardingCore 分库分表实战
🚀 基于 PostgreSQL 的 ABP vNext ShardingCore 分库分表实战 📑 目录 🚀 基于 PostgreSQL 的 ABP vNext ShardingCore 分库分表实战✨ 背景介绍🧱 技术选型🛠️ 环境准备✅ Docker Compose(多库 & 读…...
御网杯2025 Web,Msic,密码 WP
Web YWB_Web_xff 审计代码,发现需要$cip2.2.2.1 使用burpsuite抓包,添加X-Forwarded-For:2.2.2.1 然后得到flag YWB_Web_未授权访问 更加题目描述知道需要admin登录,但是现在是guest。 使用burpsuite抓包 发现cookie里面存在userÿ…...
tensorflow 1.x
简介 TensorFlow:2015年谷歌,支持python、C,底层是C,主要用python。支持CNN、RNN等算法,分CPU TensorFlow/GPU TensorFlow。 TensorBoard:训练中的可视化。 快捷键:shiftenter执行命令,Tab键进…...
[ERTS2012] 航天器星载软件形式化模型驱动研发 —— 对 Scade 语言本身的影响
在《从ERTS学习SCADE发展》中提到,在 ERTS 会议中,Scade团队会在该会议中介绍与Scade相关的工作。在 ERTS 2012 中,Scade 团队介绍了使用Scade作为主要工具,应用在航天器星载软件开发中的相关话题。原材料可参考 《Formal Model D…...
Spring Boot 集成 Flink CDC 实现 MySQL 到 Kafka 实时同步
Spring Boot 集成 Flink CDC 实现 MySQL 到 Kafka 实时同步 📌 项目背景 在大数据实时处理场景中,数据库变更数据的捕获与传输是关键环节。Flink CDC 提供了从 MySQL 等数据库中实时捕获数据变更的能力,并通过 Apache Flink 引擎实现流式处理。 本项目使用 Spring Boot …...
软件体系结构(Software Architecture)
文章目录 1. 分层架构(Layered Architecture)核心逻辑代码示例(伪代码)典型场景优缺点 2. 客户端-服务器(Client-Server)核心逻辑典型交互流程应用场景代码示例(RESTful API)优缺点 …...
RS485和RS232 通信配置
RS232 目前硬件上支持RS232的有以下板卡: LubanCat-5IO底板(含有RS232x2) 7.1. 引脚定义 具体的引脚定义可以参考背面的丝印 LubanCat-5IO底板 引脚定义图 7.2. 跳帽配置 LubanCat-5IO底板 鲁班买5IO底板上的RS485和RS232是共用同一组…...
【高数上册笔记篇02】:数列与函数极限
【参考资料】 同济大学《高等数学》教材樊顺厚老师B站《高等数学精讲》系列课程 (注:本笔记为个人数学复习资料,旨在通过系统化整理替代厚重教材,便于随时查阅与巩固知识要点) 仅用于个人数学复习,因为课…...
【网络安全】——大端序(Big-Endian)和小端序(Little-Endian)
字节序(Endianness)是计算机系统中多字节数据(如整数、浮点数)在内存中存储或传输时,字节排列顺序的规则。它分为两种类型:大端序(Big-Endian)和小端序…...
机器学习极简入门:从基础概念到行业应用
有监督学习(supervised learning) 让模型学习的数据包含正确答案(标签)的方法,最终模型可以对无标签的数据进行正确处理和预测,可以分为分类与回归两大类 分类问题主要是为了“尽可能分开整个数据而画线”…...
MIT XV6 - 1.5 Lab: Xv6 and Unix utilities - xargs
接上文 MIT XV6 - 1.4 Lab: Xv6 and Unix utilities - find xargs 继续实验,实验介绍和要求如下 (原文链接 译文链接) : Write a simple version of the UNIX xargs program for xv6: its arguments describe a command to run, it reads lines from the standard …...
Springboot整合Swagger3
Springboot整合Swagger3、常用注解解释、访问Swagger地址出现404、403、拒绝访问等问题_swagger3注解-CSDN博客...
经典音乐播放器——完美歌词 Poweramp Music Player 3 build
—————【下 载 地 址】——————— 【本章单下载】:https://drive.uc.cn/s/d6c480bc47604 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/HPQywvPc7iLZu1k0ODFcWMt2n0d?fromfrom_copylink —————【下 载 地 址】——————— 本…...
锚定基础与拥抱融合:C 语言在编程教育与技术社区的破圈之路
引言 在 Python 占据 TIOBE 指数榜首的 2025 年,C 语言以 23.4% 的稳定份额(2025 年 5 月数据)持续稳居前三,这一现象在编程教育领域尤为显著:全球 92% 的计算机科学本科课程仍将 C 语言作为必修基础课,而…...
深度学习入门:从神经网络基础到前向传播全面解析
深度学习入门:从神经网络基础到前向传播全面解析 🔥 重磅干货! 本文是《深度学习基础与核心技术详解》专栏的开篇之作,将系统性地带你走进深度学习的世界!建议收藏+关注,错过可能要找很久哦~ 目录 深度学习概述神经网络基础 2.1 生物神经元与人工神经元2.2 感知机模型2.…...
Lambda表达式能用在哪些场景?
Lambda表达式是Java 8引入的一种强大特性,它允许以简洁的方式表示匿名函数(即没有名字的函数)。Lambda表达式可以用于许多场景,尤其是在与函数式接口、Stream API、并发编程等结合时,能够显著简化代码并提高开发效率。…...
英语听力口语词汇--2.宣传类
1.approach uk /əˈprəʊtʃ/ n.(思考问题的)方式,方法,态度 2.foreign uk /ˈfɒr.ən/ adj.外国的 3.alliance uk /əˈlaɪ.əns/ n.结盟国家(或团体),同盟国家(或团体)&...
『 测试 』测试基础
文章目录 1. 调试与测试的区别2. 开发过程中的需求3. 开发模型3.1 软件的生命周期3.2 瀑布模型3.2.1 瀑布模型的特点/缺点 3.3 螺旋模型3.3.1 螺旋模型的特点/缺点 3.4 增量模型与迭代模型3.5 敏捷模型3.5.1 Scrum模型3.5.2 敏捷模型中的测试 4 测试模型4.1 V模型4.2 W模型(双V…...
Pandas 时间处理利器:to_datetime() 与 Timestamp() 深度解析
Pandas 时间处理利器:to_datetime() 与 Timestamp() 深度解析 在数据分析和处理中,时间序列数据扮演着至关重要的角色。Pandas 库凭借其强大的时间序列处理能力,成为 Python 数据分析领域的佼佼者。其中,to_datetime() 函数和 Ti…...
支持向量机的回归用法详解
支持向量机的回归用法详解 在机器学习的广阔领域中,支持向量机(SVM)是一种极具影响力的算法,它不仅在分类任务上表现出色,在回归任务中同样有着独特的应用价值。本文将深入探讨 SVM 的回归用法,包括其基本…...
计算机基础
今天不和大家分享算法了,最近为什么一直分享算法题,一个是因为最近很忙加上状态不太在线,第二个是因为我报了ICPC的比赛,也就是大学生程序设计大赛,所以平时刷算法比较多一些,虽然说结果上也没有很多的收获…...
用C语言实现的——一个支持完整增删查改功能的二叉排序树BST管理系统,通过控制台实现用户与数据结构的交互操作。
一、知识回顾 二叉排序树(Binary Search Tree,BST),又称二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构。 基本性质: ①有序性 对于树中的每个节点,其左子树中所有节点的值都小于该节点的…...
uniapp-商城-53-后台 商家信息(更新修改和深浅copy)
1、概述 文章主要讨论了在数据库管理中如何处理用户上传和修改商家信息的问题,特别是通过深浅拷贝技术来确保数据更新的准确性和安全性。 首先,解释了深拷贝和浅拷贝的区别:浅拷贝使得两个变量共享相同的内存地址,而深拷贝则创建新…...
vue数据可视化开发echarts等组件、插件的使用及建议-浅看一下就行
在 Vue 项目中使用 ECharts 进行数据可视化开发时,可以结合 Vue 的响应式特性和 ECharts 的强大功能,实现动态、交互式的图表展示。 一、ECharts 基础使用 1. 安装 ECharts npm install echarts2. 在 Vue 组件中使用 ECharts <template><div…...
百度AI战略解析:文心一言与自动驾驶的双轮驱动
百度AI战略解析:文心一言与自动驾驶的双轮驱动 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 百度AI战略解析:文心一言与自动驾驶的双轮驱动摘要引言一、技术架构:大模型与自动…...
MCP Streamable HTTP 传输层的深度解析及实战分析
一、Streamable HTTP 传输层设计革新 1. 核心设计思想 协议融合:将 HTTP/1.1、HTTP/2 与 SSE 协议特性深度整合动态协商:通过 HTTP Header 实现传输协议动态协商(X-MCP-Transport)流式优先:默认启用流式传输,支持半双工通信背压控制:基于 HTTP/2 流级流量控制实现智能速…...
六大设计模式--OCP(开闭原则):构建可扩展软件的基石
写在前面:一个真实的项目悲剧 某电商平台促销功能每次迭代都需要修改核心订单类,导致: ✅ 双十一活动修改导致支付功能崩溃 ✅ 新人优惠引发会员系统连环故障 ✅ 每次发布需全量回归测试 根本原因:系统架构违反开闭原则 一、开闭…...
ActiveMQ 生产环境问题排查与调优指南(一)
一、引言 在当今复杂的分布式系统架构中,消息中间件扮演着至关重要的角色,而 ActiveMQ 作为一款广泛使用的开源消息中间件,凭借其丰富的特性、良好的稳定性和易用性,在众多企业的生产环境中占据了一席之地。它基于 JMS(…...
深入理解 JavaScript 中的 FileReader API:从理论到实践
文章目录 深入理解 JavaScript 中的 FileReader API:从理论到实践前言什么是 FileReader?核心特性 FileReader 的常用方法事件监听实际案例案例 1:读取文本文件内容案例 2:图片预览(Data URL)案例 3&#x…...
Google LLM prompt engineering(谷歌提示词工程指南)
文章目录 基本概念AI输出配置:调整AI的回答方式输出长度温度(Temperature)Top-K和Top-P 提示技术:让AI更好地理解你零样本提示(Zero-shot)少样本提示(Few-shot)系统提示(…...
前端npm包发布流程:从准备到上线的完整指南
无论是使用第三方库还是创建和分享自己的工具,npm都为我们提供了一个强大而便捷的平台,然而很多开发者在将自己的代码发布到npm上时往往面临各种困惑和挑战,本篇文章将从准备工作到发布上线,探讨如何让npm包更易发布及避免常见的坑…...
【MySQL】表空间结构 - 从何为表空间到段页详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
OB Cloud 云数据库V4.3:SQL +AI全新体验
OB Cloud 云数据库V4.3:SQL AI全新体验 简介 OB Cloud云数据库全新升级至V4.3版本,为用户带来了SQLAI的最新技术体验,强化数据库的传统功能,深度融合了人工智能技术,引入先进的向量检索功能和优化的SQL引擎,…...
【Linux系统】第四节—详解yum+vim
hello 我是云边有个稻草人 Linux—本节课所属专栏—欢迎订阅—持续更新中~ 目录 画板—本节课知识点详解 一、软件包管理器 1.1 什么是软件包 1.2 Linux软件⽣态 1.3 yum具体操作 【查看软件包】 【安装软件】 【卸载软件】 【注意事项】 1.4 安装源 二、vim 2.1 …...
Git的核心作用详解
一、版本控制与历史追溯 Git作为分布式版本控制系统,其核心作用是记录代码的每一次修改,形成完整的历史记录。通过快照机制,Git会保存每次提交时所有文件的完整状态(而非仅记录差异),确保开发者可以随时回…...
Three.js + React 实战系列 - 职业经历区实现解析 Experience 组件✨(互动动作 + 3D 角色 + 点击切换动画)
对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦!!谢谢大家!!! 在这篇博客中,我们将分析一个极其有趣和互动性的组件 - Experience.jsx,该组件用于在主页中呈现个人的工作经历。 这个组件…...
3D虚拟工厂vue3+three.js
1、在线体验 3D虚拟工厂在线体验 2、功能介绍 1. 全屏显示功能2. 镜头重置功能3. 企业概况信息模块4. 标签隐藏/显示功能5. 模型自动旋转功能6. 办公楼分层分解展示7. 白天/夜晚 切换8. 场景资源预加载功能9. 晴天/雨天/雾天10. 无人机视角模式11. 行人漫游视角模式12. 键盘…...
[Java实战]Spring Boot 解决跨域问题(十四)
[Java实战]Spring Boot 解决跨域问题(十四) 一、CORS 问题背景 什么是跨域问题? 当浏览器通过 JavaScript 发起跨域请求(不同协议、域名、端口)时,会触发同源策略限制,导致请求被拦截。 示例场…...
嵌入式硬件篇---CAN
文章目录 前言1. CAN协议基础1.1 物理层特性差分信号线终端电阻通信速率总线拓扑 1.2 帧类型1.3 数据帧格式 2. STM32F103RCT6的CAN硬件配置2.1 硬件连接2.2 CubeMX配置启用CAN1模式波特率引脚分配过滤器配置(可选) 3. HAL库代码实现3.1 CAN初始化3.2 发…...
(2025)图文解锁RAG从原理到代码实操,代码保证可运行
什么是RAG RAG(检索增强生成)是一种将语言模型与可搜索知识库结合的方法,主要包含以下关键步骤: 数据预处理 加载:从不同格式(PDF、Markdown等)中提取文本分块:将长文本分割成短序列(通常100-500个标记),作为检索单元…...
TWAS、GWAS、FUSION
全基因组关联研究(GWAS,Genome-Wide Association Study)是一种统计学方法,用于在全基因组水平上识别与特定性状或疾病相关的遗传变异。虽然GWAS可以识别与性状相关的遗传信号,但它并不直接揭示这些遗传变异如何影响生物…...
大模型微调终极方案:LoRA、QLoRA原理详解与LLaMA-Factory、Xtuner实战对比
文章目录 一、微调概述1.1 微调步骤1.2 微调场景 二、微调方法2.1 三种方法2.2 方法对比2.3 关键结论 三、微调技术3.1 微调依据3.2 LoRA3.2.1 原理3.2.2 示例 3.3 QLoRA3.4 适用场景 四、微调框架4.1 LLaMA-Factory4.2 Xtuner4.3 对比 一、微调概述 微调(Fine-tun…...
FHE 之 面向小白的引导(Bootstrapping)
1. 引言 FHE初学者和工程师常会讨论的一个问题是; “什么是引导(bootstrapping)?” 从理论角度看,这个问题的答案很简单: 引导就是套用 Gentry 提出的思想——在加密状态下同态地执行解密操作ÿ…...
安装:Kali2025+Docker
安装:Kali2025Docker Kali2025安装 直接官网下载WMware版本 https://www.kali.org/get-kali/#kali-virtual-machines 直接打开运行 初始用户密码 kali/kali sudo -i 命令切换到root 更换镜像 切换到其他可用的 Kali Linux 镜像源可能会解决问题,可以使用国内的镜像源&…...
什么是深拷贝什么是浅拷贝,两者区别
什么是深拷贝什么是浅拷贝,两者区别 1.深拷贝 递归复制对象的所有层级,嵌套的引用类型属性,最后生成一个完全独立的新对象,与原对象无任何引用关联。 特点: 新对象和原对象的所有层级属性是独立的(修改…...
A2A大模型协议及Java示例
A2A大模型协议概述 1. 协议作用 A2A协议旨在解决以下问题: 数据交换:不同应用程序之间的数据格式可能不一致,A2A协议通过定义统一的接口和数据格式解决这一问题。模型调用:提供标准化的接口,使得外部应用可以轻松调…...
第七章 数据库编程
1 数据库编程基础 1.1 数据库系统概述 数据库系统是由数据库、数据库管理系统(DBMS)和应用程序组成的完整系统。其主要目的是高效地存储、管理和检索数据。现代数据库系统通常分为以下几类: 关系型数据库(RDBMS):如MySQL、PostgreSQL、Oracle等&#x…...
电影感户外哑光人像自拍摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!
调色详情 电影感户外哑光人像自拍摄影 Lr 调色,是借助 Lightroom 软件,针对户外环境下拍摄的人像自拍进行后期处理。旨在模拟电影画面的氛围与质感,通过调色赋予照片独特的艺术气息。强调打造哑光效果,使画面色彩不过于浓烈刺眼&a…...
C++--类的构造函数与初始化列表差异
一,引言 在类中成员函数的构造函数担任其将对象初始化的作用,而初始化列表也有着相似的作用。大部分人建议都是初始化列表进行初始化,本文主要进行讲解二者的区别。 首先看一下构造函数的初始化方式: #define _CRT_SECURE_NO…...
深入浅出之STL源码分析4_类模版
1.引言 我在上面的文章中讲解了vector的基本操作,然后提出了几个问题。 STL之vector基本操作-CSDN博客 1.刚才我提到了我的编译器版本是g 11.4.0,而我们要讲解的是STL(标准模板库),那么二者之间的关系是什么&#x…...