- 博客(646)
- 收藏
- 关注
原创 Spring Boot拦截器结合HMAC-SHA256实现API安全验证
在开放平台和第三方集成的项目中,如何确保 API 调用的安全性和可靠性是一个重要课题。特别是对于没有用户登录场景的系统间调用,传统的session或token认证方式并不适用,数字签名技术就成为了一种理想的选择。这种验证方式在开放平台、SaaS服务、微服务间调用等场景下特别实用,能够有效验证请求来源的合法性,防止参数被篡改和重放攻击。本文将详细介绍如何基于 Spring Boot 拦截器和 HMAC-SHA256 算法,构建一套轻量级但足够安全的 API 验签机制。
2025-11-25 20:19:45
338
原创 安装 Guacamole 实现nvc远程控制并进行视频录制
在文件:D:\Desktop\gmd\demo\config\guacamole\guacamole.properties添加以下配置。能在局域网用 VNC-Viewer 正常连接。卡片 → 秒进 Windows 桌面。: 多个扩展使用逗号分隔,不要有空格。其余保持默认,Save 即可。
2025-11-24 15:28:13
389
原创 [特殊字符] Taro + 微信小程序实现大模型流式响应(SSE):最全实践指南
虽然 WebSocket 全双工很强,但对于大模型对话这种“一问多答”的场景,SSE(Server-Sent Events)其实更轻量、更符合 HTTP 语义。但在微信小程序里,我们并没有标准的API。不过别慌,微信的wx.request(Taro 中是)支持了参数。这就给了我们操作的空间!😏在小程序里做大模型流式输出,其实就是一场“前端 + 网络 + 后端”的综合战役。前端:Taro +是基础,TextDecoder + Buffer 队列是核心。体验。
2025-11-24 15:13:16
815
原创 Go sync.Mutex 源码解析:设计哲学与工程智慧
在并发编程中,锁的设计永远面临一个根本性矛盾:如何在性能和公平性之间找到最佳平衡点。Go 语言的sync.Mutex通过创新的双模式设计优雅地解决了这个问题。Go语言的sync.Mutex设计智慧体现在分层优化:快速路径与慢速路径分离,为无竞争场景提供极致性能智能自适应:根据运行时情况在正常模式与饥饿模式间动态切换混合策略:结合自旋与阻塞,在短等待与长等待场景下都能表现优异状态驱动:通过位操作实现紧凑的状态管理,保证操作的原子性工程价值在于简单易用:对外提供简洁的接口自动优化。
2025-11-23 15:21:31
712
原创 用 Go 写多线程粒子动画:踩坑终端显示与跨平台编译【含 Windows Terminal 配置 + Go 交叉编译脚本】
这个项目用Go语言实现了一个粒子系统,通过在终端绘制粒子动画来演示多协程效果,也是直观的测试channal和mutex的想法。粒子会随机移动、碰撞,还能变色。代码里用了结构体来定义粒子属性,像位置、速度、半径、颜色这些。还通过sync.Mutex保证并发访问数据的安全,用通道和定时器来协调不同的操作。比如粒子更新位置、检测碰撞以及绘制画面这些操作都是通过多协程并发进行的。
2025-11-21 14:18:51
482
原创 使用 PHP 和 Raylib 也可以开发贪吃蛇游戏
如果你记得很清楚,蛇移动的方式是它的头部会不断向一个方向步进,然后身体会以延迟的方式跟随它。我这样做的方式基本上是再次增加蛇的身体(这会在新方向上添加一个新头部)并从蛇的身体中删除最后一个元素。到目前为止,最让我烦恼的是用 PHP 编写的游戏的可移植性。的私有方法,它应该为蛇的身体添加一个新的头部。这个新头部应该考虑蛇当前前进的方向。要添加新头部,我只需复制当前头部,根据当前方向更新其坐标,并将其合并到蛇的身体中,占据零索引。的参数,我传递了宽度和高度除以所需的单元格大小(在我的例子中是 30 像素)。
2025-11-21 14:18:12
897
原创 AOP底层实现关键的源码、方法解析
AOP(Aspect-Oriented Programming,面向切面编程)是 Spring 框架的核心特性之一,它通过代理机制实现了横切关注点的模块化。理解 AOP 的底层实现原理,对于深入掌握 Spring 框架和编写高质量代码至关重要。反射技术在 AOP 中的关键应用代理对象的创建时机和动态代理类的生成阶段基于 AOP 注解生命周期的完整执行流程// 判断是否需要创建代理 if (this.earlyProxyReferences.remove(cacheKey)!
2025-11-20 15:16:55
1020
原创 spring事务失效的几种业务场景
检查方法是否是public,类 / 方法是否为final;检查是否是同一类内的内部调用(this 调用);检查异常是否被捕获未抛出,或是否是未配置的检查异常;检查 Bean 是否被 Spring 管理(是否有@Service等注解,是否通过@Autowired注入);检查事务管理器是否配置正确(是否有Bean,多数据源是否指定事务管理器);检查数据库 / 表是否支持事务(如 MySQL 引擎是否为 InnoDB)。
2025-11-20 15:12:14
716
原创 springboot的启动流程核心原理
核心驱动是入口,是容器初始化核心;自动配置核心加载中的自动配置类;Web 服务器启动:嵌入式服务器(Tomcat)在阶段通过自动配置类启动,无需外部部署;扩展灵活:通过等扩展点,可轻松添加自定义逻辑;配置优先级:命令行参数 > 系统环境变量 > 配置文件 > 默认配置。Spring Boot 的启动流程本质是“封装 Spring 容器初始化流程 + 自动配置 + 嵌入式服务器启动”,通过简化配置、自动整合依赖,实现 “开箱即用”。
2025-11-19 14:41:27
814
原创 springboot加载外部jar
如根据不同数据库需要更换使用不同的jdbc驱动jar的场景: 把外部驱动jar放到lib-dir1,lib-dir2等目录。若原启动命令为([....]为其他参数部分)
2025-11-19 14:39:45
176
原创 实战案例:服务器磁盘空间告急,如何快速定位和清理“大文件“
当服务器磁盘空间告急时,系统性能会急剧下降,甚至可能导致服务不可用。本教程将详细介绍如何快速定位占用磁盘空间的大文件,并进行安全清理。
2025-11-18 14:48:28
403
原创 CyberRT Transport传输层设计
INTRA:进程内通信,通过函数调用直接传递消息(零拷贝)SHM:同主机进程间通信,利用共享内存实现高效数据交换RTPS:跨主机通信,基于 RTPS 协议实现可靠网络传输这篇文章,重点梳理 SHM 和 RTPS的设计。首先是基类的设计。Segment 通过 Block块级锁,限制了Buffer的读写访问Indicator 用于通知,对于锁的控制较弱,允许多读者多写者共同访问,允许一定的脏数据的存在。极端情况。
2025-11-18 14:47:57
417
原创 MySQL 与 Clickhouse 多数据源切换技术分析
在 Spring Boot 等生态中,多数据源切换是一种常用的基础组件,虽然功能简单但要实现一个并发稳定、鲁棒性好、集成容易的多数元切换组件也需要花费一点功夫。这里给出一些代码示例分析隐藏问题并给出优化建议,不论是面试候选还是代码评审都是一个不错的素材。本项目采用动态数据源路由架构,支持在运行时根据业务需求自动切换 MySQL(默认)和 ClickHouse 数据源。该架构通过 AOP 切面和 Spring 的实现透明的数据源切换,无需业务代码显式处理数据源选择逻辑。
2025-11-17 16:18:11
281
原创 从测试到部署:基于TRAE SOLO构建AI应用的质量门禁流水线
当AI应用一头撞上质量保障,这中间的“坑”我可太熟了。做测试开发这么多年,眼看着应用开发从老套路一路狂奔到AI驱动,但说实话,质量保障这一块,有点跟不上了。现在用TRAE SOLO这样的工具,随手就能搭个带大模型的应用demo,快是真快。但原型跑起来之后呢?怎么保证它迭代不崩?上线之后怎么知道它到底稳不稳?这些问题成为了新的挑战。本文将以一个真实的“智能问答API”为例,分享是如何利用TRAE SOLO为核心,结合Python测试框架和Kubernetes。
2025-11-17 16:08:38
470
原创 用户中心微服务设计指南:从功能到非功能的全维度落地
用户中心微服务的设计核心是 “以用户为中心,以安全为底线,以扩展为目标功能上,需覆盖 “用户生命周期管理 + 认证授权 + 权限控制 + 审计日志”,满足业务与合规需求;非功能上,需重点保障 “安全性、高可用性、可扩展性”,避免成为微服务架构的瓶颈;落地时,需循序渐进,先实现核心功能,再逐步优化非功能点,同时注重文档与监控,降低维护成本。最终,一个优秀的用户中心不仅能支撑当前业务,还能随业务增长灵活扩展,成为微服务架构中稳定可靠的 “地基”。
2025-11-13 14:47:31
671
原创 使用C++实现一个简易的线程池
之后会唤醒所有在该条件变量上阻塞的工作线程,但是条件变量的唤醒只有一个线程可以重新获取锁,这个获取锁的线程就可以继续执行线程函数的逻辑,判断队列是不是为空,为空的话就可以直接return了,因为此时任务队列不会再有任务进来,但是也只有这个线程会return,其他的线程没有获取到锁,继续阻塞在条件变量的阻塞队列上。的数组,还有一个任务队列。同时,由于线程池可能会被多个线程同时访问:工作线程需要取出任务队列中的任务,其他使用线程池的线程可能同时提交任务,所以还需要加一把互斥锁。类的私有成员中添加对应变量。
2025-11-13 14:46:54
404
原创 MYSQL-主键(Primary Key)
数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。MySQL**(本章节)**PostgreSQLMongoDBRedisEtcd主键是数据库表设计中最为重要的概念之一,它远不止是“唯一标识符”那么简单,尤其是在 MySQL 默认的 InnoDB 存储引擎中。主键是数据库表中的一个或多个字段(列),它的值用于唯一地标识表中的某一条记录。打个比方:身份证号是中国公民在主表“人口数据库”中的主键,每个人的身份证号都是唯一且不为空的,通过它可以精准地定位到一个人。唯一性 (U
2025-11-12 14:23:30
1190
原创 Spring事务传播机制深度解析:7种传播行为的使用场景和陷阱
事务传播机制(Transaction Propagation)定义了在多个事务方法相互调用时,事务应该如何传播。简单来说,它回答了"当前方法应该加入现有事务,还是开启新事务"的问题。Spring的7种事务传播机制为复杂业务场景提供了灵活的事务管理方案。REQUIRED- 大多数业务方法的默认选择SUPPORTS- 适合查询操作,灵活适应事务上下文MANDATORY- 强制事务环境,防止误用- 独立事务操作,避免相互影响- 非事务操作,避免长事务NEVER- 明确禁止事务,保证无事务执行。
2025-11-12 14:23:00
835
原创 JDK动态代理和CGLIB动态代理源码解析
JDK动态代理是JDK原生支持的代理机制,核心依赖接口与反射实现。其底层逻辑是:通过类动态生成一个实现目标接口的代理类(字节码),该代理类会将所有方法调用转发给接口的实现类,最终由完成对目标方法的增强与原始调用。关键限制:JDK动态代理只能代理接口(代理类会实现目标接口),无法直接代理类(除非目标类实现了接口)。核心依赖:接口 + 反射 + 字节码动态生成;代理类特性:继承Proxy、实现目标接口、方法转发给;缓存设计:通过WeakCache缓存代理类,避免重复生成;限制。
2025-11-11 14:48:19
1013
原创 Spring事务管理陷阱:@Transactional失效的8个常见场景与解决方案
陷阱场景问题现象解决方案非Public方法事务完全不生效将方法改为public自调用问题同类调用事务失效使用AopContext或重构代码结构异常被捕获异常处理但事务未回滚手动回滚或指定rollbackFor数据库引擎不支持事务注解无效使用InnoDB等支持事务的引擎错误的传播机制事务边界混乱根据业务需求选择合适的传播机制方法内手动提交干扰Spring事务管理完全依赖Spring声明式事务异步方法调用事务上下文丢失分离事务操作与异步处理多数据源配置错误。
2025-11-11 14:47:30
500
原创 MySQL索引优化实战:原则速查与踩坑案例(实战篇)
索引调优不是一劳永逸的 checklist,而是持续迭代的工程能力。SQL 上线前进行 Explain 评审,记录基线方案。关键表维护“索引设计文档”,包含用途、创建时间、负责人。定期回顾慢查询,收集优化案例,形成内部知识库。
2025-11-10 14:31:36
553
原创 海量日志分析:一天内最大在线人数与最长持续时间计算方案
处理海量日志的 “最大在线人数” 和 “最长持续时间”,核心是 “将连续状态转换为离散事件用 “事件点排序法” 替代 “逐秒遍历”,时间复杂度从 O (86400) 降为 O (n log n)(n 为事件数),适配海量数据;排序时遵循 “登出优先” 原则,避免同一时间点的计算错误;计算最长持续时间需关注 “峰值的开始与结束节点”,用左闭右开区间计算时长;单机场景适合中小数据量,分布式场景(Spark/Flink)适合亿级日志,需兼顾并行计算与全局状态更新。
2025-11-10 14:30:56
920
原创 对于 时间复杂度和空间复杂度分析
总次数 = 0 + 1 + 2 + ... + (n−1) = n(n−1)/2 ≈ n²/2 →。:如果有多个变量(如两个数组长度分别为。总时间 = O(n) + O(n) =→ 循环次数 = log₂n →。),保留两者,不要强行合并。
2025-11-09 15:09:17
811
原创 C++死锁深度解析:从成因到预防与避免
如果所有哲学家同时拿起左边的筷子,那么他们都会永远等待右边的筷子被释放,从而陷入死锁。死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。:如果一个线程已经持有了一些资源,但在申请新资源时无法立即得到,它必须释放所有已占有的资源,以后需要时再重新申请。尽量缩小锁的粒度,并避免在一个锁的保护区域内去调用另一个可能获取锁的函数。如果无法避免,务必使用固定的锁顺序。都是RAII的典范,它们能确保在作用域结束时自动释放锁,极大地避免了因异常抛出而导致锁无法释放的问题。
2025-11-09 15:08:15
630
原创 Java 中的闭包:讲解、案例、应用场景与优缺点全解析
Java 闭包是「通过匿名内部类 / Lambda 表达式模拟实现的特性」,核心是 “代码块 + 外部变量环境” 的封装,适配函数式编程和异步回调场景。适合场景:异步回调、Stream 流处理、简单事件驱动、资源管理封装;慎用场景:复杂业务逻辑、长期持有大对象引用的场景;核心注意点:规避内存泄漏、理解 effectively final 限制、避免过度嵌套导致代码晦涩。
2025-11-07 14:45:20
703
原创 mybatis-Plus的使用问题
有一个这样的场景,列表数据进行编辑,列表有 用户名、密码、邮箱、创建时间,编辑弹窗字段就只有用户名和邮箱,这个时候,情况1:前端只会传这个两个字段,没有传创建时间和密码,那么更新如何做到不更新创建时间和密码 情况2:用户想要清空邮箱,这个时候传空了,mybatisplus对于空的不会更新,这怎么办HTTP 请求中,两者都是null,需要区分处理。
2025-11-07 14:44:48
244
原创 深拷贝优化:从 copier 到 go_deep_copy 的演进
我们在第一次解析结构体结构的时候,可以尽可能多记一下结构体信息(名称,类型,偏移量等),缓存下来,之后需要再次解析的时候可以直接使用缓存数据,避免多次反射带来的性能损耗,FieldMap记录下名称到Field的映射,将O(N)的FieldByName优化成O(1)的map取值操作。函数缓存和结构体缓存是典型的读多写少场景,因此最初是使用sync.Map缓存数据,但是在读极多写极少的场景下RCU性能会优于sync.Map,因为对于sync.Map,在读数据最坏的情况下(键不在。,是更推荐的实现选择。
2025-11-06 14:51:44
647
原创 MySQL 命令行连接与企业级远程访问实践(含故障排查与安全策略)
核心风险:暴露 root 账号、未加密传输、任意主机授权导致被动攻击面扩大。企业实践应优先考虑最小权限与加固通道(例如 SSH 隧道 / TLS)。目标读者:后端工程师、运维和中小型项目负责人。要点:命令行连接示例、常见错误原因与解决、远程访问配置、安全加固与运维建议。客户端、目标主机和端口、凭证、网络策略(防火墙、bind-address)。输出:可用的 SQL 控制台或错误码(如。优点:不修改系统 root 权限,便于审计与权限控制。不带密码会提示交互输入,更安全。指定端口(区分大小写)。
2025-11-06 14:51:04
864
原创 在asp.net 控制器传入json对象的格式验证的几种方法
本文介绍了对MyModel模型进行格式验证的四种常用方法:1)数据注解(DataAnnotations)通过在属性上添加特性实现自动验证;2)自定义验证特性创建特定规则;3)控制器手动验证ModelState或业务逻辑;4)使用FluentValidation第三方库定义验证器。所有方法在控制器标注[ApiController]时可自动触发验证,验证失败会直接返回400错误。自动验证方法简便高效,而手动验证则适用于需要补充特殊业务逻辑的场景。
2025-11-05 14:18:23
301
原创 从代码到配置:如何用SQL配置实现数据核对
配置效率:天级 → 分钟级通过 SQL 配置化与在线调试,规则上线周期从原先的 2–3 天缩短至分钟级别。过去依赖开发、测试和发版,而现在仅需编写 SQL 并在线验证即可,交付效率提升约 95%以上。成本节约:免开发与发版SQL 配置化消除了开发、测试和发版环节,规则配置即可生效,显著降低人力成本与等待时间。数据复用:规则越多,越高效系统通过“数据指纹分组 + 共享快照”机制,让同一事件下的多条规则共享查询结果,避免重复查询;同组规则并行执行,节省 CPU 与 I/O 资源;
2025-11-05 14:05:01
1048
原创 别再写那些重复代码了!8年Java老兵教你用 Hutool 提升开发效率
写代码不是目的,解决问题才是核心。与其花时间重复造轮子,不如试试 Hutool,让自己专注于业务逻辑本身。我用 Hutool 提升了不少开发体验,也希望你能从中找到开发的“爽点”。
2025-11-04 14:15:57
403
原创 Kafka 租户隔离全攻略:五种生产级方案实战与选型指南
最近公司业务线面临一个棘手问题:核心消息队列Kafka需要支持多租户数据隔离,但Kafka原生并未提供开箱即用的租户机制。想象一下:多个业务线数据混杂在同一个集群中,既可能导致资源抢占,又存在数据泄露风险。"我们在落地方案三时,曾遇到消费端过滤性能瓶颈,最终通过引入本地缓存+批量过滤优化,将单节点TPS提升了3倍。在消息头中添加租户标签,消费端根据标签过滤数据,我们团队最终落地的正是此方案!通过Kafka自带的ACL机制为每个租户分配独立认证信息,实现"逻辑隔离"。),本质靠规范而非技术隔离。
2025-11-04 14:15:11
730
原创 Day8 | Java 方法全解析
方法是Java中封装特定功能的代码块,是面向对象编程的动作单元。煎鸡蛋需要准备什么、做些什么、最后得到什么,应该都知道吧:输入:鸡蛋、油处理:加热、翻面输出:煎蛋方法通过代码复用和逻辑抽象,让程序更模块化、易维护。// 无参数无返回值 public static void greet() { System.out.println("Hello, World!");} // 有参数有返回值 public static int add(int a, int b) { return a + b;
2025-11-03 14:27:58
756
原创 代码检测器!一款专门揭露屎山代码的质量分析工具!
— 一款专门用于揭露“屎山代码”的质量分析工具,它以犀利又幽默的方式评估代码质量,告诉你的代码到底有多烂。功能特色多语言支持: 支持 Go、JS/TS、Python、Java、C/C++ 等主流语言的代码审查七维度深度检测: 从代码复杂度、函数长度、注释率、错误处理、命名规范、重复度到整体结构,全方位扫描潜在问题幽默的毒舌报告:告别枯燥的技术术语,用段子手式的语言呈现问题,让代码评审从“尴尬互怼”变成“笑着改进”灵活的输出方式:支持彩色终端报告和 Markdown 输出,方便 AI 分析与文档集成。
2025-11-03 14:27:23
582
原创 数据库的分片与分区:有什么区别?
分片(Sharding),也被称为水平分区(Horizontal Partitioning),是一种数据库拆分技术,其核心思想是将数据进行水平切分,将大型数据库拆分成多个更小、更易管理的部分,并分布到不同的实例或服务器上,从而提升系统的性能和扩展能力。实施分片后,数据库会根据分片键(Shard Key)将数据划分到不同的分片中。分片键是一个特殊的逻辑标识符,通常挑选为能够有效区分和分布数据的字段,决定数据被存储在哪个具体的分片中。
2025-11-02 15:27:51
695
原创 Spring Boot全局异常处理的背后的故事
中一个非常强大且实用的注解,它的核心作用是提供全局的、跨多个控制器的增强处理。在很多博主分享的文章中,都会说这里需要定义所有需要处理的异常。本节我们将借鉴框架提供的异常处理机制,完善全局异常的处理,并聊聊背后的故事。如果想要更深层次的处理异常就需要自定义的异常处理器了。但是自定义的异常处理器,可以控制异常是否继续向后执行,还是直接返回客户端。按照小编的设想,异常的处理如果只关心异常的信息提示,那只要分出。配置项的时候,才发现原来配置项也可以进行异常的统一处理。原本全局异常的处理,上面的内容已经足够了。
2025-11-02 15:25:35
266
原创 Java 集合 - List接口 —— 记住顺序的集合
在普通Collection(例如Set)中,元素的顺序是不确定的。在 List中,元素的顺序是确定的—— 元素怎么添加进去,遍历时就怎么出来。特性CollectionList是否保证元素顺序?不保证保证插入顺序是否有索引?没有有,支持get/set/add(index)等遍历元素顺序不确定确定支持随机访问元素?否是。
2025-10-31 14:12:51
351
原创 从53个漏洞到5个:我们用Distroless把容器安全“减“出来了
Nginx是最麻烦的,因为Distroless没有官方的Nginx镜像。我们需要自己构建。方案是用Debian作为Builder,安装nginx包,然后把nginx二进制文件、配置目录(/etc/nginx)、静态资源目录()全部拷贝到里。这个过程需要仔细测试每个nginx模块的兼容性。我们花了不少时间验证核心功能,确保HTTP代理、SSL、静态文件服务这些关键特性都正常工作。最后的镜像只有25MB,比原来的Alpine版(40MB)还小了37.5%。
2025-10-31 14:12:20
419
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅