- 博客(347)
- 资源 (1)
- 收藏
- 关注
原创 分布式事务解决方案
分布式事务解决方案综述 在微服务架构中,分布式事务是确保跨服务操作一致性的核心挑战。本文系统分析了主流解决方案: 2PC/XA:强一致性但性能低,适用于传统银行系统 TCC:通过Try-Confirm-Cancel实现最终一致性,适合金融等高要求场景 Saga:事件驱动,适合电商等长流程业务 本地消息表:简单实现,适合中小企业 MQ事务消息。
2026-02-04 16:59:56
577
原创 Java基础-枚举类
Java枚举(Enum)是一种特殊数据类型,用于定义固定常量集合。相比传统常量定义方式,枚举提供更好的类型安全性和可读性。枚举本质上是类,可以拥有属性、构造函数、方法,并实现接口。常用方法包括values()、valueOf()等。枚举适用于状态机、策略模式、单例模式等场景。最佳实践包括使用全大写命名、优先使用==比较、注意valueOf()异常处理等。通过抽象枚举类可实现方法复用,简化枚举定义。枚举是Java中强大的类型安全机制,能有效提升代码质量。
2026-01-29 10:20:45
2651
原创 项目经理和产品经理的职责区分
这就好比一场战争,产品经理是“军师”,负责看地图、定战略、决定攻打哪里;而项目经理是“先锋官”,负责带兵、排兵布阵、确保在规定时间内拿下城池。为了让你彻底搞清楚这两者的具体分工,我们抛开枯燥的定义,深入到具体的工作流中去对比。
2026-01-28 16:48:23
993
原创 Java设计模式-单例模式
单例模式是确保类仅有一个实例的创建型设计模式,提供全局访问点。适用于资源消耗大、需频繁创建的对象,如线程池、数据库连接等。核心要素包括私有构造、静态实例和公共获取方法。常见实现方式:1)饿汉式(线程安全但资源浪费);2)懒汉式(非线程安全);3)同步懒汉式(线程安全但低效);4)双重检查锁定(推荐,线程安全高效);5)静态内部类(最优推荐,无锁延迟加载);6)枚举方式(最安全,防反射攻击)。需注意反射、序列化等问题,适用于配置管理、日志记录等场景。
2026-01-28 14:13:44
3125
1
原创 Java设计模式-中介者模式
摘要:中介者模式通过引入中介对象封装对象间的交互,将网状通信转变为星型结构。核心角色包括抽象/具体中介者和同事类,显著降低系统复杂度(从O(N²)降至O(N))。以聊天室为例,用户通过中介者转发消息,实现解耦。优点包括降低耦合度、易于扩展,但中介者可能过于复杂或成为性能瓶颈。适用于GUI组件交互、聊天系统等场景,典型如MVC框架中控制器协调模型和视图。
2026-01-28 11:18:18
474
原创 Java设计模式-状态模式
状态模式(State Pattern)是一种非常巧妙的行为型设计模式。它的核心思想可以用一句话概括:当一个对象的内部状态发生改变时,它的行为也跟着改变。听起来有点抽象?其实它最厉害的地方在于,它让对象看起来就像是修改了它的类一样。这通常是因为我们将“状态”封装成了独立的类。为了帮你彻底理解,我将从核心逻辑、代码结构、优缺点到实际应用为你详细拆解。
2026-01-28 11:07:06
868
原创 如何手搓一个Spring Security
手搓” Security 框架的核心在于理解 “过滤器链” 和 “领域模型”。Spring Security 很复杂,因为它考虑了各种企业级场景(LDAP、OAuth2、RememberMe )。你自己写的很简单,但只要包含了 “拦截请求 -> 校验身份 -> 校验权限 -> 放行/拒绝” 这一流程,你就已经掌握了其最核心的原理。
2026-01-10 20:01:31
555
原创 后端开发对系统安全应该做点什么
作为后端开发,你不需要成为黑客,但你需要具备“攻击者思维”。在写每一行代码、设计每一个接口时,多问自己一句:“如果恶意用户调用这个接口,会发生什么?” 只要你守住了认证、授权、输入验证和数据保护这四道关卡,你的系统就是健壮且安全的。
2026-01-10 19:05:17
607
1
原创 统一数据返回格式和统一异常处理
本文详细介绍了在SpringBoot后端开发中实现统一数据返回格式和统一异常处理的核心技术。通过ResponseBodyAdvice接口实现响应体的统一包装,定义标准返回格式(包含code、message、data字段);利用@ControllerAdvice和@ExceptionHandler实现全局异常捕获,区分业务异常和系统异常处理。
2026-01-07 15:08:06
385
原创 一篇文章带你了解分布式锁
分布式锁是分布式系统中协调多节点对共享资源进行互斥访问的关键机制,通过外部存储系统实现跨进程资源互斥,需权衡性能、一致性和复杂度。
2026-01-04 11:03:27
688
原创 系统架构设计中的多级缓存以及缓存预热
按需设计:不要盲目追求多级缓存,对于低并发系统,单级Redis缓存可能更简单高效预热有据:基于历史访问数据确定热点,避免全量预热浪费资源监控先行:建立完善的监控体系,关注各级缓存的命中率、响应时间和内存使用率一致性权衡:根据业务场景选择合适的一致性策略,不要追求强一致性,多数场景下"最终一致性"即可应急预案:设计缓存失效应急预案,确保系统高可用性成功的多级缓存与缓存预热设计,需要深入理解业务特点和数据访问模式,针对性地制定缓存策略、一致性方案和失效防护机制。
2026-01-04 09:45:58
882
原创 聊一聊跨域错误CORS
在解决之前,请确认是否真的跨域。只要协议、域名、端口三者中任意一个不同,就是跨域。场景当前页面 URL请求接口 URL是否跨域原因1否端口、域名、协议完全一致2是协议不同 (httpvshttps3是端口不同4是域名不同本地开发: 使用 Vite/Webpack 的 Proxy 代理。联调/测试: 让后端同学开启 CORS 支持。生产上线: 使用 Nginx 反向代理,既安全又高效。
2025-12-31 15:39:01
498
原创 单点登录SSO登录
想象一下你在公司工作,需要使用 OA 系统、财务系统、CRM 系统。如果没有 SSO,你每打开一个系统都要输入一次账号密码,这不仅繁琐,而且密码多了容易记混或泄露。SSO 的定义SSO 是一种身份认证机制,允许用户在多个相互信任的应用系统中,只需登录一次,即可访问所有关联系统,无需重复输入凭证。它解决的核心痛点维度传统登录SSO 登录用户体验每次切换系统都要重新登录,体验割裂只需登录一次,系统间无缝切换安全性用户可能为了省事在多个系统用同一密码,一旦一处泄露处处危险。
2025-12-31 14:50:46
654
原创 跨站脚本攻击XSS
在前端安全领域,绝对是“头号公敌”。它允许攻击者将恶意脚本注入到网页中,当其他用户浏览该页面时,脚本会在用户的浏览器中执行。这就好比一个坏人(黑客)在超市(网页)的货架上放了一张虚假的优惠券(恶意脚本),当顾客(用户)拿起来看时,优惠券上的咒语就生效了,可能会偷走顾客的钱包(Cookie)或者替顾客下单(执行非法操作)。为了帮你彻底搞定这个问题,我将从以及这几个维度为你详细拆解。XSS 攻击主要分为三类,了解它们的区别是防御的第一步非持久型 XSS持久型 XSS基于 DOM 的 XSS。
2025-12-31 14:43:54
961
原创 你用过AI吗,谈一下对AI的看法
在面试结尾,你可以自信地总结:“总的来说,AI 已经重塑了我的工作流。过去需要花半天查文档写的基础代码,现在几分钟就能搞定。这让我有更多的时间去思考如何优化系统性能、如何设计更好的架构。我不仅把它当作工具,更把它视为推动我不断学习和适应新技术的催化剂。
2025-12-31 14:33:56
851
原创 IDE常用插件推荐
Alibaba Java Coding Guidelines(XenoAmess TPM) 用于检查 Java 代码是否符合阿里巴巴的编码规范。它基于 PMD(Programming Mistake Detector)技术实现代码静态分析,能识别潜在的错误、性能问题和规范违反。插件会把代码里面不符合规范的地方标记出来另外,选择项目目录右键编码规约扫描可以收到扫描代码这款插件由Apipost团队开发的,其官方介绍是:用于IDEA项目快速生成API文档,快速查询接口、接口代码功能,并支持在IDEA中进
2025-12-31 14:20:20
988
原创 一个中大型软件项目的开发流程
这是项目的“大脑”,核心是回答“做什么”的问题。在中大型项目中,这一阶段尤为关键,因为需求的偏差会导致巨大的返工成本。需求调研与收集产品经理/需求分析师通过访谈、问卷、竞品分析等方式,收集业务需求、用户需求和功能需求34。需求分析与建模将杂乱的原始需求转化为结构化的功能列表、业务流程图和数据流图。区分核心功能与非核心功能,确定优先级3。产出物与评审核心文档:《需求规格说明书》。关键动作。
2025-12-31 12:54:53
675
原创 递归将一个目录下所有文件复制到另一个文件夹
注意到因为文件可能存在重名,合并目录文件不能单纯的把文件复制到一个目录下。使用路径加文件名称的方式拼接新的文件名称,这样可以有效的解决重名问题。
2025-12-31 11:22:50
211
原创 Git提交代码报错fatal: detected dubious ownership ...
场景推荐方案个人开发机,只有你一个人用方案一(加),省事且安全。公司电脑/服务器,多人共用方案二(修复所有权),更符合安全规范。移动硬盘/U盘开发方案一,因为移动硬盘格式通常无法记录所有权。
2025-12-31 11:05:50
275
原创 数据库指定字符串排序
MySQL:推荐使用,语法简洁。其他数据库:推荐使用CASE WHEN,通用性强。性能从高到低的排序为原生索引排序 >(MySQL) ≈CASE WHEN(小数据/枚举) >你可以根据你使用的数据库类型选择合适的方法。
2025-12-31 10:53:36
141
原创 JDK17新特性
JDK17作为Java重要的LTS版本,带来了多项核心改进:语言层面引入密封类(限制继承)、Switch模式匹配和文本块等新特性,显著简化代码;API方面优化了G1垃圾回收器,增强ZGC/Shenandoah性能,并强化了内部API封装;移除了Applet等过时功能。相比JDK8,JDK17在语法简洁性、运行性能和安全性方面均有显著提升,特别适合云原生等现代应用场景,是Java开发者值得升级的版本。
2025-12-31 10:33:43
734
原创 使用Swagger升级版在线文档
在原有配置类Swagger2Config上面加注解。6、此外可以修改配置文件觉得接口文档的开关。4、在controller层添加注解。3、配置了拦截器对相关url放行。3、配置了拦截器对相关url放行。4、注解使用方法一致。
2025-05-09 15:54:49
345
原创 阿里云短信接入实现示例
摘要:接入阿里云短信服务分为准备和代码集成两步。准备阶段需开通服务、获取AccessKey并配置签名模板。Java实现示例展示了SpringBoot项目集成过程,包括依赖引入、配置类封装、单例客户端构建及短信工具类实现。关键注意事项:AK需环境变量存储避免泄露,建议异步发送防止阻塞,必须处理流控等特定错误码。典型问题包括签名/模板未审核、频控限制等,可通过控制台检查解决。
2025-04-30 17:25:21
415
原创 容器相关命令
使用以下docker run命令即可新建并启动一个容器,该命令是最常用的命令,它有很多选项,下面将列举一些常用的选项。-d选项:表示后台运行-P选项:随机端口映射-p选项:指定端口映射,有以下四种格式。--net选项:指定网络模式,该选项有以下可选参数:--net=bridge:默认选项,表示连接到默认的网桥。--net=host:容器使用宿主机的网络。--net=container:NAME-or-ID:告诉 Docker让新建的容器使用已有容器的网络配置。
2024-07-26 17:17:27
1044
1
原创 Docker安装
更新apt-get包列表安装Docker的依赖包添加Docker官方GPG密钥添加Docker的APT源再次更新apt-get包列表安装Docker验证Docker是否安装成功,看到一个“Hello from Docker!”的消息,表示已经安装成功。
2024-07-26 15:22:47
228
原创 Java中使用注解的方式实现数据脱敏
本文介绍了在Java中使用注解实现数据脱敏的方案,通过自定义@Desensitize注解和DesensitizationType枚举定义脱敏规则,结合Jackson序列化实现自动脱敏处理。详细讲解了从设计思路到具体实现的完整流程,包括脱敏工具类开发、JSON序列化集成、SpringBoot配置以及测试效果展示。该方案具有低侵入性、可复用性等优势,适用于日志打印、接口返回等场景中的敏感数据保护,同时提供了扩展优化建议和使用注意事项。
2024-05-21 14:55:50
921
原创 将集合转换成树形结构
本文探讨了将扁平List转换为树形结构的三种方案。基础递归方案(O(n²))逻辑简单但性能差;推荐使用Map索引法(O(n)),通过空间换时间提升效率;Java8 Stream方案简洁但性能与递归类似。实战中建议采用Map索引法,并提供了通用工具类实现,支持泛型节点和自定义字段。该方案适用于菜单管理、组织架构等需要树形数据展示的场景,能有效处理大数据量情况。
2024-01-11 14:27:13
877
原创 使用EasyPoi导入并返回失败数据
摘要:本文介绍了使用EasyPoi实现数据导入失败时导出错误数据的两种方案。方案一利用EasyPoi内置校验功能,通过ExcelImportUtil.importExcelMore()方法获取校验失败的数据,自动保留错误提示样式;方案二通过手动遍历数据捕获业务异常,更灵活处理复杂业务逻辑错误。
2024-01-05 16:26:12
1117
原创 PDF添加文字或者图片
outPutPdfFilePath输出文件路径。inputPdfFilePath输入文件路径。imagePros图片集合。pdfList文字集合。
2023-11-23 15:19:00
456
原创 重启服务器引发的Docker异常
尝试了重新启动docker服务,docker ps还是看不到进程。执行sudo dockerd发现服务已经启动了,无法再次启动。使用dockerd &后台启动,可以安全关闭连接工具了。然后发现找不到容器和镜像列表了,但是容器都启动了。猜想是docker服务启动异常导致查询不到容器列表。公司使用云服务器需要硬盘扩容,服务器重启才生效。重启以后发现拉取远程镜像的命令登录失败了!关闭docker重启启动docker如何。查看docker运行状态都是正常的。
2023-08-11 16:35:37
1020
原创 Mysql推荐使用规范
MySQL数据库规范核心要点: 基础规范:必须使用InnoDB引擎和utf8mb4字符集,禁用存储过程/触发器,避免存储大文件。 命名规则:小写下划线命名,长度≤32字符,索引命名需明确类型(pk_/uk_/idx_)。 表设计:自增整型主键,必备create_time/update_time字段,冷热数据分离,单表字段建议<50个。 索引优化:单表索引≤5个,联合索引遵循最左前缀原则,避免冗余索引和NULL列索引。 SQL安全:禁用SELECT *,避免隐式转换和%前置模糊查询,优先使用预编译语句。 性能
2023-08-04 15:11:14
410
原创 @JsonRawValue注解的使用
例如,如果我们在Java类中有一个String字段,则将JSON值括在引号(“”内),但是当我们使用@JsonRawValue批注对该字段进行注释时,Jackson库将忽略引号。对于一些不定项的结果,比如可配置的检查项需要保存检查结果的时候,我们如果使用关系型数据库建表来保存对应数据就很麻烦,我们可以把检查结果序列号成json串保存到数据。原因是java中使用String类型存储数据的时候双引号"会自动添加转义符\导致返回数据序列话的时候无法正常序列化。但是查询的时候会变成这样。
2023-05-09 15:52:33
1801
原创 docker容器内使用cat命令修改文件
v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外。-s, --squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行。-n, --number 对输出的所有行编号,由1开始对所有输出的行数编号。-A, --show-all 实际结果是在每行最后处增加显示$-b, –number-nonblank 对非空白行输出行编号。-E, --show-ends 在每行最后处增加显示$-T, --show-tabs 将跳格字符显示为 ^I。
2023-05-09 15:25:13
2380
原创 敏捷实践在项目中的应用
敏捷实践(Agile Practice)通过迭代开发(2-4周为一个Sprint)和持续交付可运行软件增量,实现从"计划驱动"到"价值驱动"的转变。核心方法包括:用户故事描述需求、Scrum框架管理流程(含每日站会等仪式)、持续集成与交付技术支撑。特别适用于需求不明确、AI/大数据、系统重构等场景。实践需注意需求变更管理、确保客户反馈、控制团队节奏等挑战。敏捷本质是通过快速迭代、持续反馈和团队协作来应对变化,提升项目成功率。
2023-05-09 15:24:56
1891
原创 如何将单体服务重构成微服务
本文提供了将单体应用重构为微服务的实用指南。采用演进式重构策略,建议冻结单体功能,通过防腐层隔离新旧系统,按业务能力或DDD原则拆分服务。重点推荐绞杀者模式逐步替换功能,强调数据拆分需谨慎处理分布式事务。文章还列出了微服务基础设施选型建议,包括API网关、服务发现等核心组件,并给出了分阶段的演进路线图。最后提醒避免大爆炸重写、分布式单体和忽视运维成本等常见陷阱,强调采用增量交付和小步快跑策略。
2023-05-09 15:22:38
1653
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅