- 博客(77)
- 收藏
- 关注
原创 防重复提交组件:从“双击下了两单“说起
摘要:防重复提交组件的设计与实现 本文系统梳理了后端防重复提交组件的完整设计思路和实现方案。核心内容包括: 问题分析:重复提交主要来自用户误操作、网络重试和恶意构造,仅靠前端控制无法彻底解决。 技术方案演进: 单机方案存在多实例同步问题 Redis的SETNX命令提供了原子性"占位"能力 必须避免"先查后写"和"分开设过期"两种反模式 组件设计: 采用声明式注解方式使用 通过多维度(方法标识、URI、租户、用户、参数)构建防重key 使用SHA-256保证key的唯一性和安全性 关键特性: 分布式支持 可配
2026-08-21 23:03:48
445
原创 接口权限框架设计与工程落地
接口权限框架设计与工程落地摘要 本文系统性地介绍了企业级接口权限体系的设计与实现方案。主要内容包括: 必要性分析:指出业务系统演进中必然面临权限管理需求,缺乏统一权限体系会导致权限混乱、安全隐患等问题。 设计原则:提出认证授权分离、集中管理、轻量校验等原则,强调变更快速生效和安全优先的校验策略。 RBAC模型优化:在传统RBAC基础上增加应用和命名空间维度,支持多系统共用,并规范权限标识命名和类型划分。 架构实现: 认证由IDP统一处理,网关负责验签 授权服务集中管理权限数据 业务服务通过声明式注解指定所需
2026-08-02 00:52:01
343
原创 Spring Boot Starter 中间件账号密码加密方案设计与实现
本文介绍了一种轻量级的Spring Boot Starter中间件账号密码加密方案,采用AES-256-GCM加密算法实现敏感信息的安全存储。该方案具有以下特点: 支持密文格式"ENC:"+Base64(IV+密文),使用12字节随机IV和128位认证标签 通过SHA-256哈希将任意长度密钥转为256位AES密钥 提供三种安全的密钥传递方式:环境变量、JVM参数和密钥文件 仅使用JDK自带加密库,无额外依赖 自动检测并警告不安全的密钥配置方式 实现上,通过AesTextEncryptor工具类完成加解密操
2026-06-13 16:49:10
330
原创 基于 Redis 或 MySQL 的分布式雪花 ID 生成器
本文从 Snowflake 算法的核心问题——Worker ID 分配出发,介绍了槽位租约模式在 Redis 和 MySQL 两种后端上的工程实现。槽位租约而非永久分配:实例下线自动回收,容器化友好Lua 脚本 / CAS UPDATE 保证原子续约:杜绝 TOCTOU 竞态导致的重复 ID纵深防御:心跳续约 +nextId()兜底检查,双重保障连接完全隔离:无论是 Redis 还是 MySQL,Worker ID 分配的连接与业务中间件互不影响接口抽象、配置切换type=redis或。
2026-05-16 15:00:29
380
原创 从线性回归到智能预测:销量预测系统的演进之路
本文系统梳理了销量预测系统的演进过程,从基础的线性回归模型到智能化预测方案。当前系统采用批处理+简单线性回归的方法,通过历史销量数据进行趋势预测,但随着业务复杂度提升,暴露了10大核心问题:包括数据质量缺陷(零值与缺失值混淆、缺乏异常检测)、模型能力局限(无法捕捉周期性、忽略外部因素)以及工程化不足(实时性差、缺乏评估体系)等。文章深入剖析了预测模块的实现逻辑,指出线性回归在临界点会产生预测跳变,且人工干预系数暴露出模型的不信任问题。最后提出了分阶段的演进路线,从数据治理、特征工程到模型迭代,为构建更精准的
2026-04-27 15:46:02
473
原创 领域战术建模与代码实战:以 Role 为例
本文介绍了领域驱动设计中的战术建模方法,通过RBAC角色管理系统案例展示了如何将业务概念映射为代码结构。文章详细解析了实体、值对象、聚合根等核心构造块的判断标准,并以角色(Role)作为聚合根,演示了包含应用(App)值对象和角色权限(RolePermission)内部实体的完整建模过程。重点阐述了如何通过值对象保证不可变性、通过聚合边界保护业务规则,并提供了Java代码实现示例,展示了从领域模型到工程落地的完整链路,包括创建角色和授予权限的业务逻辑实现。
2026-04-25 12:14:25
411
原创 企业EIAM实践:三层账号模型与混合权限体系设计
本文介绍了企业EIAM(统一身份与访问管理)平台的设计实践,重点解决多系统账号分散、权限混乱等问题。文章首先分析了当前业务系统中存在的账号重复建设、层级模糊、权限碎片化等痛点,提出建立统一身份管理平台的目标。随后详细阐述了EIAM的三层架构设计,包括身份核心模块和典型交互流程。最后重点介绍了"主账号-子账号-IAM账号"的三层账号模型,明确不同账号类型的管理权限边界,实现治理权下沉与业务权分离。该方案通过统一账号体系、混合权限模型和标准化接入方式,有效提升了企业身份管理的效率和安全性。
2026-04-24 14:35:19
730
原创 无状态 JWT Token 下控制账号状态的实现方案
本文探讨了无状态JWT Token下控制账号状态的实现方案。针对JWT无状态特性导致账号状态变更无法实时生效的问题,分析了传统解决方案(Token存入Redis和缩短过期时间)的局限性,提出了Access Token+Refresh Token双令牌机制。该方案通过短时效Access Token(如5分钟)和长时效Refresh Token(如17小时)结合,在刷新时校验账号状态,既保持了无状态特性,又能实现账号控制。虽然存在一定延迟(Access Token过期时间内的短暂窗口期),但相比Redis方案更
2026-04-23 22:32:29
521
原创 三方平台接入架构设计与工程落地
本文以美团、饿了么、有赞、京东到家等多平台接入为背景,探讨高并发场景下三方平台接入架构的设计与工程落地实践。核心设计理念围绕六方面展开:异步解耦将验签与业务处理分离,验签通过后立即写入消息队列,避免阻塞网关线程;消息幂等通过 uniqueKey 唯一标识防止重复消费;版本控制利用乐观锁支持消息乱序处理;事件驱动采用领域事件解耦下游服务;数据持久化在消费者层保存完整原始数据,支撑漏数据补偿与过期数据查询;最终一致性通过双重补偿机制兜底。整体架构分为接入网关层、消息队列层、消费者层、数据持久化层、领域事件层
2026-04-21 19:51:33
566
原创 多服务节点数据修正方案设计与实现
本文提出了一种多服务节点数据修正方案,用于解决ERP系统中产品成本数据错误引发的多节点数据不一致问题。方案设计了三级核心表结构(订正任务表、任务流程表、节点配置表)和两种消息类型(任务执行消息、执行结果消息),通过事务性发件箱保证消息可靠投递,实现多节点顺序修正、可视化进度追踪、中断可重试等功能。系统采用RocketMQ作为消息中间件,支持节点级失败重试和延迟检查机制,确保最终数据一致性。该方案已在企业ERP系统中成功应用,有效解决了跨服务节点的数据修正难题。
2026-04-21 19:22:00
447
原创 Saga 补偿型分布式事务设计与实现
Saga 补偿型分布式事务设计与实现摘要 本文探讨了订单与库存服务间的分布式事务解决方案。针对需要实时返回库存结果的场景,对比了TCC和Saga两种模式,最终选择了Saga方案。关键分析点包括: 方案选择:TCC的Try阶段(预留锁定)在库存场景非必需,Saga直接执行+失败补偿的模式更简洁高效 设计原则:Saga遵循"宁可重试补偿,不可遗漏补偿"原则,对未确认成功的情况均发起补偿 实现架构:采用调用方和被调用方各自维护全局事务表的方式,通过全局事务ID关联,实现状态跟踪和补偿机制 技术
2026-04-13 23:32:40
423
原创 领域驱动 - 战略设计实践
本文以供应链企业ERP系统为例,系统阐述了领域驱动设计(DDD)战略设计的完整实践过程。首先分析了企业多系统整合的业务挑战,包括流程不统一、数据孤岛等问题。随后介绍了战略方向选择,确立了统一业务流程的目标,并明确了核心域、通用域和支撑域的划分原则。通过建立统一业务术语表和领域边界划分,最终形成了包含销售、采购、仓储等核心领域,以及结算、库存等通用领域的微服务架构方案。案例展示了如何通过DDD战略设计将复杂业务需求转化为清晰的技术架构,为类似系统整合项目提供了方法论参考。
2026-04-11 23:51:09
559
原创 分布式场景下的数据竞争问题与解决方案
分布式系统中的数据竞争问题是指多个并发请求同时访问同一数据导致的不可预期结果,比单机环境更复杂。主要解决方案包括乐观锁机制,通过版本号检查实现并发控制:1)单数据场景下,更新时检查版本号是否变化;2)多数据场景下,通过全局排序避免死锁,再结合乐观锁更新。核心要点是版本号检查、全局排序获取锁顺序一致,冲突时快速失败。该方案适用于读多写少场景,能有效解决分布式并发问题。
2026-04-11 13:58:42
484
原创 Spring 线程池最佳实践:如何优雅管理多线程任务
本文介绍了Spring线程池的最佳实践,重点解决默认SimpleAsyncTaskExecutor的性能问题。通过分析核心参数(核心线程数、队列容量等)和工作流程,提出为不同任务类型配置独立线程池的方案:轻量级任务使用CPU核数相关配置,耗时任务适当增加线程数和队列容量。文章提供了完整配置类代码,包含优雅关闭和异常处理机制,并演示了通过@Async注解和手动提交两种使用方式,实现资源隔离和性能优化。
2026-04-08 21:40:42
403
原创 领域驱动 - 领域事件与事件驱动架构设计实践
本文探讨了事件驱动架构与领域事件设计在领域驱动开发中的实践应用。文章首先分析了传统指令式消息和同步调用带来的耦合问题,提出事件驱动架构通过"描述发生了什么"而非"指令做什么"实现解耦。核心内容包括领域事件设计要点(事件源、载体、时间戳)和事件溯源的价值。实践部分展示了基于Spring Event的领域事件实现方案,包括事件发布器、监听器设计和多限界上下文同服务部署时的解耦策略。文章强调事件驱动架构在系统解耦、扩展性、可追溯性等方面的优势,特别指出其能有效避免消息膨胀问
2026-04-08 16:53:46
387
原创 领域驱动 - 代码层面的命令查询职责分离(CQRS)实践
本文介绍了领域驱动设计中代码层面的命令查询职责分离(CQRS)实践。通过将应用层按command和query分离,让写模型专注于业务逻辑处理,读模型则采用Assembler模式灵活转换数据。当前方案通过ACL层获取跨领域数据,但未来可演进为BFF层聚合或预聚合宽表模式。这种分离设计为后续架构演进奠定基础,使读模型可以独立优化而不影响写模型,在保持业务表达能力的同时提升查询性能。
2026-04-08 14:50:23
351
原创 领域驱动 - 领域服务分层设计
本文介绍了基于领域驱动设计(DDD)的工程模块分层设计方案。以xxx-user工程为例,采用六层架构:API定义层(xxx-user-api)负责接口契约,接口层(xxx-user-interface)处理HTTP请求,应用服务层(xxx-user-application-service)编排业务用例,领域层(xxx-user-domain)承载核心业务逻辑,基础设施层(xxx-user-infrastructure)提供技术实现,防腐层(xxx-user-acl)隔离外部依赖。各模块通过Maven父子工程
2026-04-08 12:44:23
652
原创 事务性发件箱模式设计与实现
事务性发件箱模式是一种解决分布式系统消息可靠投递的方案。其核心设计是将消息与业务数据写入同一数据库事务,通过Spring事务事件监听异步发送消息,并配合定时任务重试机制。主要特点包括:1)业务数据与消息在同一事务提交;2)采用幂等键防止重复消息;3)适配器模式支持多种MQ中间件;4)分离重试机制,包含Listener即时重试和Job补偿重试。该模式确保了消息投递的可靠性,适用于需要最终一致性的分布式事务场景。
2026-04-04 14:49:33
456
原创 模版方法 + 策略模式在库存增加/扣减场景下的应用
本文探讨了模板方法与策略模式在库存管理中的结合应用。通过定义库存模型(总库存、可用库存、占用库存)和交互流程(占用/释放、入库/出库),采用策略模式封装不同库存操作,模板方法抽象公共处理流程(查询、校验、并发控制等)。实现上通过AbstractInventoryStrategy抽象类统一管理库存变更的核心流程,子类实现具体策略逻辑,并引入策略聚合机制保证操作组合的规范性。该设计实现了库存操作的标准化、可扩展性,同时确保事务一致性和事件驱动的系统响应。
2026-04-02 14:49:02
409
原创 Spring Application Event 在事件驱动设计中的应用
Spring Application Event 在事件驱动设计中的应用,在系统建设过程中通常会遇到两个不同领域耦合的老代码和基于系统规模和时间成本不得不采用妥协方案而导致的耦合,为了应对这种工程实践的现状,考虑可扩展、易维护、可拆分,我们在无法对其进行服务级别隔离时,可以考虑通过事件发布和监听的手段将需要协同处理业务的不同领域代码进行依赖分离
2023-11-29 18:20:24
1223
原创 设计模式在实际业务中应用 - 模版方法
作者在工作中主要主导 A 业务线的系统建设,A 业务线主要是零售场景酒水的售卖与即时配送服务。为了方便运营在自研系统中对多平台商品进行管理而开发的三方平台商品管理功能,本次介绍的模版方法模式则是在该功能开发过程中的落地实践。
2023-11-28 23:02:49
864
原创 Bean validation 最佳实践
Bean Validation 2.0 (JSR 380) 是 Java EE 和 Java SE 中用于 JavaBean 验证的 Java API 规范。
2023-08-10 20:47:05
600
原创 领域驱动 - 开篇
作者在 2019 年入职一家公司,主要负责企业内部 ERP 系统建设。在我入职时该系统已经是一个庞大的单体项目,项目复杂度已经对日常更新迭代造成很大影响。通常我们在一个不了解的业务领域进行功能迭代时会通过产品设计文档、技术方案设计文档、业务代码对整个业务领域功能设计、业务流程设计、技术设计进行充分的了解,然而现状是产品设计文档、技术方案设计文档缺失或者版本很老,开发人员只有通过代码来了解整个业务领域的现状以及一些设计细节。
2023-07-02 23:15:50
207
原创 通过 Maven 命令将 jar 包推送到私服
文章目录通过 Maven 命令将 jar 包推送到私服1. 命令2. 命令选项说明2.1. 选项:-DgroupId2.2. 选项:-DartifactId2.3. 选项:-Dversion2.4. 选项:-Dpackaging2.5. 选项:-Dfile2.6. 选项:-Durl2.7. 选项-DrepositoryId3. 使用场景说明通过 Maven 命令将 jar 包推送到私服1. 命令mvn deploy:deploy-file -DgroupId=com.ele -DartifactId=
2021-10-26 10:41:07
2599
原创 基于 Jenkins 定时作业的上线执行人机器人通知
基于 Jenkins 定时作业的上线执行人机器人通知1 shell script#!/bin/bash# 参与人员来源可以是文本、网络、数据库都可以release_personnel_array=('A同学' 'B同学' 'C同学' 'D同学')# 上一个人员previous_personnel=$(cat ../release.txt)# 当前人员current_personnel=''break_flag=0for (( i = 0; i < ${#release_person
2020-11-11 21:38:18
305
原创 策略模式在实际业务场景中的使用及优化
策略模式在实际业务场景中的使用及优化策略模式(Strategy Pattern):定义不同的策略算法,以达到新增算法、移除算法、修改算法的便利性和调用无感知,并且不同的算法区分开之后也更加方便阅读策略算法。(个人理解)一、我在什么场景下使用策略模式1、业务场景在项目开发中有业务需求要对不同类型的加工单做不同的复杂业务校验。2、我为什么要使用策略模式该加工单大概率不会有新增,但...
2019-09-30 10:29:01
2541
4
原创 Idea Mac 2019.2.1和2019.2.2版本敲代码卡顿问题
Idea Mac 2019.2.1和2019.2.2版本敲代码卡顿问题前言:博主最近将电脑替换成2019款MacBookPro13.3 后安装了Idea最新的版本来进行开发工作,但是在开发过程中发现敲代码卡顿尤其中文键入时,非常影响效率。然后开始了寻找解决方案,目前经过实际测试已经正常。电脑配置为I5 2.4GHZ、16GB运行内存、256GBSSD。一、尝试更新版本解决问题从Idea...
2019-09-21 11:24:37
3171
2
原创 升级Https前的可行性验证(一)
升级Https之前的可行性验证注意:自签证书和Nginx的安装都基于ContOS 6一、如何申请OpenSSL自签证书1、安装OpenSSL(一)OpenSSL 工具下载下载地址(二)OpenSSL 安装参考博客查看服务器是否安装有OpenSSLopenssl version -a将下载的OpenSSL源码上传至Linux服务器可以使用X...
2018-08-17 18:15:46
687
原创 多线程 -- 使用线程池时如何接收另外一个线程池中执行代码的返回值
前言:最近在处理实际业务时遇到一个问题,订单表中有50-100万数据需要生成订单流水。应用部署在了四台服务器上,如何在竞争到锁的服务器上处理订单生成订单流水的速度更快,考虑使用一个线程池去负责读取数据,一个线程池负责去插入数据,在此之前先编写一个Demo类来测试方案是否可行。一、首先回顾一下创建线程的三种方式 1、Thread类class testTask extends Thread{...
2018-07-27 18:28:39
2270
原创 Spring Boot - 使用Spring Boot构建SM项目
前言:第一次使用Spring Boot开发项目,之前时从Spring+Spring Mvc+MyBatis过渡过来的,先来个小Demo。一、首先我们需要先创建一个基于SpringBoot的项目(我这里使用的是IDEA) 1、首先打开IDEA,new project 2、点击Spring Initializr,然后点击Next 3、创建项目 二、搭建SM架构 1、找到p...
2018-07-17 19:56:58
1659
原创 Chrome 添加印象笔记网页剪辑插件
前言:在网页上浏览时看到好的文章想要收藏到印象笔记中,印象笔记提供了网页剪辑的插件支持多个浏览器,但是在谷歌浏览器中无法直接安装印象笔记的.crx格式的插件。百度了一下都比较散,在这里总结一下,从下载到安装。一、下载印象笔记网页剪辑插件 1、访问印象笔记官网下载网页剪辑插件 网页剪辑插件下载地址2、下载时需要注意国内无法访问Chrome商店,在Chrome商店下载提供了...
2018-05-05 10:25:59
6253
原创 IDEA 部署Web项目能够访问到TomCat服务器但是无法访问项目内资源问题
前言:从Eclipse转IDEA使用过程中发生了一些问题,在这里做一下分享。问题描述:在Eclipse中部署项目到Tomcat后访问项目资源localhost:8080/项目名/访问资源路径,但是在IDEA 中使用此路径无法访问到项目资源。一、Eclipse部署项目的访问路径 二、问题原因 导致这个问题的原因是IDEA部署项目到TomCat默认忽略项目名,所以Eclipse中部署项...
2018-04-26 12:46:33
18463
4
原创 Java -- 获取实现接口的泛型的参数化类型和实际类型参数
前言:在向上抽取功能时可能会有需要获取到实现接口的实际泛型参数类型这样的需求,分享一下自己实现的方法。一、Java 代码直接上代码,代码上有注释,对API做了相应的解释。public BasicAction(){ try { //获取子类字节码文件对象,this代表的是子类对象。 Class clazz = thi...
2018-04-02 10:35:09
7940
原创 SpringDataJpa -- 多条件查询
前言:使用SpringDataJpa 进行多条件查询。一、单表的多条件查询@Override public Page<Courier> pageQuery(Courier model, Pageable pageable) { //封装查询对象Specification Specification<Courier> exam...
2018-03-31 17:58:44
11167
5
原创 Hibernate -- NoSession问题分析和解决
前言:对Hibernate出现NoSession问题进行分析和解决。一、问题分析 1、为什么会出现NoSession? ① 从字面理解NoSession的原因是没有获取到Session,那为什么获取不到Session了,通常在Service层中所有Dao层操作完毕提交事务后,Session就会被关闭。在此时如果再次执行Dao层操作就必须获取Session,但是Session已经关闭所有就...
2018-03-31 17:42:16
2074
原创 SpringDataJpa -- NoSession问题分析和解决
前言:对SpringDataJpa NoSession问题进行分析和解决。一、问题分析1、为什么会出现NoSession? ① 从字面理解NoSession的原因是没有获取到Session,那为什么获取不到Session了,通常在Service层中所有Dao层操作完毕提交事务后,Session就会被关闭。在此时如果再次执行Dao层操作就必须获取Session,但是Session已经关闭所...
2018-03-31 17:28:56
3407
原创 Apache POI -- 读取Excel文件数据导入到数据库
前言:使用Apache 旗下 POI读取Excel文件中的数据插入到数据库。一、导jar包 ① poi ② poi-ooxml ③ poi-ooxml-schemas ④ dom4j ⑤ xmlbeans二、解决03和07版本不同API问题1、判断文件后缀.xls或者.xlsx,来使用HSSFWorkbook(03)还是XSSFWorkbook(07)API。2...
2018-03-31 12:52:31
897
原创 在无网络情况下配置dtd本地约束
前言:在很多框架的使用中需要配置XML文件,而在XML文件中需要添加dtd约束。在有网络条件下可以提示所要配置的标签,但是在无网络条件下我们则需要配置dtd本地约束。这里以Struts2为例,其他框架的配置相同!一、首先我们需要找到struts2核心jar包 二、解压struts2核心jar包,并找到XML配置中的dtd约束对应的dtd文件 三、在磁盘中新建一文件夹存放所有需要...
2018-02-26 18:38:23
898
原创 JavaWeb使用Filter、动态代理对客户端请求服务端参数中文乱码解决
一、代理模式 代理模式传送门:博客地址二、Java动态代理 Java动态代理传送门:博客地址 三、乱码解决思路 对原有的HttpServletRequest类中的getParameter()方法进行增强。对方法进行增强三种方式: ① 继承,覆盖原有方法(在解决乱码中不可用,HttpServletRequest是TomCat创建) ②装饰设计模式(在解决乱码中可用) ③动态代理
2018-01-26 23:45:27
372
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅