- 博客(179)
- 收藏
- 关注
原创 告别繁琐!MapStruct-Plus 让对象映射效率飙升,这波操作太香了!
只需在源对象上添加@AutoMapper(target = 目标类.class),无需手动写 Mapper 接口!// 源对象:UserInfo@Data@Builder@AutoMapper(target = UserInfoDTO.class) // 指定转换目标// 目标对象:UserInfoDTO@Data@Builder遇到特殊转换(如密码加解密),可自定义转换规则。@Component// 明文 → 密文(UserInfo → UserInfoDTO 时用)
2025-12-09 09:10:26
625
原创 告别硬编码!Spring Boot 配置绑定原来可以这么玩,优雅到飞起!
Data如果需要对配置项添加描述、默认值或校验规则,可以手动创建文件(放在"description": "短信服务的AccessKeyId",},"description": "短信服务的地域ID",这个文件会与自动生成的元数据合并,优先级更高,适合添加业务相关的说明。从遗留项目的手动Properties绑定,到Spring Boot的,看似只是换了一种写法,实则是从"面向过程"到"面向框架"的思维转变。改造的工作量很小,但带来的收益却很明显:更少的bug、更高的效率、更清晰的代码。
2025-11-25 09:14:47
691
原创 Kafka 租户隔离全攻略:五种生产级方案实战与选型指南
最近公司业务线面临一个棘手问题:核心消息队列Kafka需要支持多租户数据隔离,但Kafka原生并未提供开箱即用的租户机制。想象一下:多个业务线数据混杂在同一个集群中,既可能导致资源抢占,又存在数据泄露风险。“我们在落地方案三时,曾遇到消费端过滤性能瓶颈,最终通过引入本地缓存+批量过滤优化,将单节点TPS提升了3倍。在消息头中添加租户标签,消费端根据标签过滤数据,我们团队最终落地的正是此方案!通过Kafka自带的ACL机制为每个租户分配独立认证信息,实现"逻辑隔离"。),本质靠规范而非技术隔离。
2025-11-04 09:24:03
877
原创 Spring Boot Map 依赖注入血坑实录:为什么我的 Map 总是少了一半数据?
当时以为是Bean加载顺序问题,折腾了两天debug,甚至被AI误导走了弯路,最后才发现——始终无法获取完整的实例,明明配置了多个模板,打印出来却只有默认的一个!开发中总有一些「反直觉」的框架设计,让你debug到怀疑人生。:彻底掌握控制权,适合复杂场景下的精准调用。优先按名称匹配,不再触发「类型收集」机制。难道Spring会「偷」我的Map数据?按类型注入,但需排除默认收集逻辑。
2025-10-24 09:22:27
586
原创 熬夜三天!SpringCloud Gateway 动态路由失效,背后黑手竟是它……
在微服务体系里,SpringCloud Gateway 作为流量调度的核心组件,其路由配置的稳定性,直接关系到整个系统能否正常运转。之前,我们团队负责的项目借助 Apollo 配置中心,构建起一套动态路由机制。代码源自官方范例(),长期稳定运行,为业务发展筑牢了技术根基。然而,平静的工作节奏被一次突发状况打破。新配置到 Apollo 的路由,仿佛被施了魔法,完全无法生效。系统报错信息不断,业务流程陷入混乱,线上服务随时可能崩溃。团队成员紧急集结,一场与时间赛跑的 “排雷” 行动迅速打响。
2025-09-23 09:27:13
406
原创 SonarQube 升级 2025.1 后,JDK8 项目扫描翻车?看这篇就稳了!
这篇主要讲了 SonarQube 和项目 JDK 版本不兼容,导致扫描失败的修复办法。其实官网也给了个解法,大概意思是:在某些情况下,要是分析的项目构建用的 Java 版本和执行分析时的 Java 版本不一样,像用 Java 17 运行分析,项目构建用 Java 11 或更早版本,就得手动设置sonar.java.jdkHome属性,指向合适的 JDK。
2025-09-09 09:28:18
500
原创 搞不定 Docker 部署 SeaTunnel?这些坑与解法你得知道!
SeaTunnel 作为国人主导的 Apache 开源项目,其文档和代码相对易于理解。然而,在实际部署过程中,确实会遇到各种复杂问题。上述提及的诸多坑点,其实在官方文档中均能找到解决思路,只是目前官方文档的组织可能稍显繁杂,需要读者仔细研读、深度挖掘。为方便大家参考,这里附上完整的 docker-compose 配置,希望能助力各位在 SeaTunnel 的部署征程中一帆风顺。services:master:volumes:# 挂载日志配置文件。
2025-08-26 09:03:17
1044
原创 从 “JSON 字段适配噩梦” 到 “Spring Boot 优雅解决方案”,你只差这一篇
通过@JsonDeserialize和@JsonSerialize注解结合自定义序列化和反序列化类,实现更灵活的处理,就像是为你的数据处理量身定制一套专属的 “战甲”,无往而不利。@Override// 获取JSON对象中未被User类中属性映射的字段@Override@Data@Test@DisplayName("测试-通过自定义反序列化+@JsonDeserialize处理JSON对象中未被Java类中属性映射的字段")"age": 18"""
2025-08-12 09:14:53
699
原创 干货来袭!5 分钟学会快速实现责任链,效率直接拉满!
commons-chain 就像是一位贴心的开发伙伴,在实现责任链的道路上,它能够为我们节省大量的时间和精力,让我们的开发工作变得更加轻松高效。尽管它已经进入维护期,但其中蕴含的设计思想和编程技巧依然值得我们深入学习和借鉴。
2025-07-29 09:27:58
919
原创 高效解析 Swagger,轻松优化接口平台发布流程,你还不知道?
使用 swagger-parse 解析 Swagger 确实能够让我们的工作事半功倍,但在实际操作中,仍然会遇到一些繁琐的细节。
2025-07-08 09:26:15
1039
原创 一文吃透!Spring Boot 项目请求日志记录,这几招你绝对不能错过!
本文详细介绍了 Spring Boot 内置的三种记录请求日志的方式,这些方法不仅简单易用,而且功能强大,大大提高了我们的开发效率。如果想要将日志记录到存储介质,个人比较推荐使用 ServletRequestHandledEvent 这种方式,它的配置相对简单,并且能够满足大多数场景的需求。当然,如果有定制化的需求,比如需要记录响应体,那么开头介绍的那三种传统方式也是不错的选择,它们能够提供更灵活的扩展能力。但无论如何,利用好 Spring Boot 提供的这些内置功能,能够让我们的开发工作事半功倍。
2025-06-24 09:06:40
804
原创 深度揭秘!Java Class 文件加密终极指南,有效保护你的核心代码
在某次聚餐中,朋友聊起他接了一个私单,他不想把他的核心代码开放出去,但又想项目能正常运行。翻译成技术术语就是他想对源码进行混淆或者加密。之前我写过一篇文章聊聊如何进行代码混淆。今天我们来聊另一个的话题,聊聊如何利用ClassFinal对代码进行加密。本文介绍了如何利用ClassFinal对代码进行加密。这个工具类在使用上可以说非常简单,不过有点可惜,这个项目目前已经不再维护,有其他网友基于ClassFinal进行改造,开源了class-winter,感兴趣的朋友可以查看如下网址。
2025-06-10 09:10:15
972
原创 超详细!Spring Boot 项目借助 PF4J 实现插件动态加载,打造灵活可扩展架构
本文详细讲解了 PF4J 的常用功能以及如何与 Spring Boot 进行整合,帮助开发者实现插件的动态加载和灵活扩展。虽然 PF4J 已经是一个非常强大的插件框架,但它仍有一些优化点,比如与 Spring 集成时,如果用到 AOP,它可能不会生效,因为它注入 Spring 的方式没有走 Spring 的完整生命周期。此外,它的插件查找是基于文件的,如果需要基于 URL 查找,还需要进行扩展。而这些扩展在文末链接的 demo 中都有进行实现,感兴趣的朋友可以深入研究。
2025-05-27 09:49:53
1436
原创 超详细!Spring Boot 项目与 Togglz 深度整合实现特性开关全攻略
通过上述详细的步骤,我们成功地在 Spring Boot 项目中与 Togglz 进行了整合,实现了特性开关的功能。Togglz 为我们提供了一种灵活、高效的功能管理方式,能够帮助我们更好地应对软件开发过程中的各种挑战。本文只是对 Togglz 的一个入门介绍,如果大家对 Togglz 的源码感兴趣,还可以深入研究,其中的一些实现思路和技巧可以为我们的日常开发带来很多启发。
2025-05-13 09:14:40
742
原创 AI 爆火背后,Spring Boot SSE 推送该怎么学?
本文基于 WebFlux,详细介绍了 Spring Boot 实现 SSE 推送的多种方法。若想基于 WebMVC 实现,可使用org.springframework.web.servlet.mvc.method.annotation.SseEmitter。
2025-04-29 09:20:13
1217
原创 深度揭秘!硬件负载均衡配置业务健康检测 400 状态码问题的惊险排查之旅
回顾整个排查过程,其实我们一开始就注意到云厂商 ELB 的日志中,抓到的请求是 “http:///actuator/health/ping”,当时我们也曾怀疑过请求头是否缺失。但由于 springcloud gateway 在同样的配置下没有出现问题,这一现象成功转移了我们的排查方向。现在看来,这是因为 springcloud gateway 底层使用的是 netty 容器,与 springboot 默认的 tomcat 容器对 host 的处理方式存在差异。
2025-04-15 09:11:26
685
原创 必看!Spring Boot 项目新老版本 Controller 低侵入式切换实战秘籍
该项目在进行迁移重构时,考虑到大部分业务逻辑雷同,为了降低系统复杂度和维护成本,并没有新开服务,而是在原来的项目中添加新的 Controller。这就意味着所有的操作都要在同一个 JVM 进程项目的前提下进行,如何在不影响现有系统正常运行的情况下,实现新老版本 Controller 的低侵入式切换,成为了摆在开发团队面前的一道难题。这是业务部门研发团队最初采用的实现方案,通过自定义注解和 AOP(面向切面编程)的方式,实现了新老版本 Controller 的切换。1、自定义注解。
2025-04-01 09:05:21
694
原创 踩坑实录!Spring AOP切点表达式失效之谜及高效修复攻略
本次问题的解决过程源于团队成员的一次求助,起初我也一时摸不着头脑,直到留意到注解是添加在类上而非方法上,才恍然大悟。这次小小的 “坑” 让我们深刻认识到了切点表达式的细节和作用域的重要性。希望通过分享这次经历,能帮助更多的开发者在使用 Spring AOP 时少走弯路,避免陷入同样的困境。如果你对切点表达式的详细使用和更多高级特性感兴趣,不妨参考这篇优质博文,相信你能从中获取更多有价值的信息。
2025-03-25 09:27:48
828
原创 超详细!Spring Boot项目结合Maven Profile实现多环境切换,轻松搞定开发部署难题
Spring Boot Profile 是一种配置机制,它允许我们在同一个应用程序中针对不同的环境(如开发、测试和生产环境)设置不同的配置。这意味着我们可以根据环境的需求,灵活地加载特定的配置,让应用程序在不同环境下都能完美运行。这些配置通常存储在以application-{profile}.yml或application-{profile}.properties命名的文件中,比如application-dev.yml就是专门用于开发环境的配置文件。
2025-03-04 09:36:09
1272
原创 深度揭秘:Java 应用程序中实现数据库读写分离的高效策略与实战
这种方式通过自定义数据源路由和 mybatis 拦截器,实现根据 SQL 语句类型自动切换主从数据源,从而达到读写分离的效果。1、引入依赖</</</</配置数据源3、定义数据源枚举MASTER,SLAVE线程级数据源上下文管理动态路由数据源@Slf4j@Overridelog.info("DynamicRoutingDataSource 切换数据源到从库");log.info("DynamicRoutingDataSource 切换数据源到主库");
2025-02-18 09:29:07
920
原创 如何以低侵入方式获取业务系统使用的二方包版本号
获取业务系统使用的二方包版本号这个需求,在大多数业务开发场景中可能并不常见,但在开发基础组件或进行依赖管理时却非常重要。通过本文介绍的埋点上报方式,我们可以以较低的侵入性获取到业务方使用的二方包及其版本号。在实施过程中,需要注意以下几点:首先,上报操作一定要使用异步方式,避免对业务造成堵塞;其次,如果使用自定义 Maven 插件进行上报,要注意类加载器的问题,因为 Maven 插件的类加载器是自定义类加载器;
2025-02-11 09:16:29
625
原创 记一次springcloud gateway记录日志响应结果乱码问题
最近团队的网关日志发现有不少响应结果记录,出现形如下的乱码��(�钍/�,}�����]O7L|���ŲƧ�MϦnP�Q*K�)*�+���QJ-*�/r�O���{�@8� ��一开始感觉是不是中文乱码,但是后面发现有些日志不是中文,也是乱码,而有些记录的日志又能正常显示。于是搜索了一圈,在在这篇文章找到的思路以及解决答案。综上解决因Accept-Encoding引起的乱码方式有2种,一种是直接移除Accept-Encoding,告诉服务端不要对响应数据进行压缩,直接返回未压缩数据。
2025-01-14 10:22:04
849
原创 聊聊springboot项目如何优雅进行数据校验
在我们日常开发中,数据校验是我们绕不开的一环,而用Spring Validation进行校验,基本上成为我们进行数据校验的首选组件,今天的话题就来聊下如何利用Spring Validation进行优雅校验Spring框架的验证功能主要基于JSR 303/JSR 349 Bean Validation规范,这是一套标准的Java注解驱动的数据验证API。Spring提供了对Bean Validation的深度集成,使得在Web应用中进行数据校验变得既强大又简便。
2024-12-31 10:19:03
1078
原创 聊聊在应用层面实现内网穿透功能是否可行
最近接手了供方开发的网关项目,交接文档里面有个内网穿透的功能,一下子就吸引的我的目光。实现这个内网穿透的背景是业务部门有些业务是部署在公网,这些公网的业务想访问内网的业务,但因为公网和内网没打通,导致无法访问,为了解决这个问题,供方在网关上做了一个内网穿透功能不管是通过消息队列还是通过反向代理来实现内网穿透,本质上就是多加一层来解决,就是应了一句话,没有什么是加一层中间层不能解决的,如果有,那就再加一层。
2024-12-10 09:32:27
398
原创 聊聊如何利用kafka实现请求-响应模式
在大多数场景中,我们经常使用kafka来做发布-订阅,在发布-订阅模型中,消息一旦发送就不再追踪后续处理,但在某些业务场景下,我们希望在发送消息后等待一个响应,然后根据这个响应来做我们后续的操作。在这种请求-响应模式,我们就可以利用spring kafka的ReplyingKafkaTemplate来实现ReplyingKafkaTemplate 是 Spring Kafka 中的一个高级特性,专门用于处理 Kafka 中的请求/响应模式。它允许你发送一个消息到 Kafka,并等待一个响应。
2024-12-03 10:35:56
856
原创 聊聊springboot项目中使用jackson的一些小技巧
在我们前后端联调时,很经常以json作为数据的交互格式,今天我们就来聊聊在开发springboot项目中,使用jackson进行数据渲染一些小技巧本文介绍枚举和json转换、long精度问题、数据脱敏三种我们日常开发比较常用的场景,但不知道大家发现没,这三种场景本质上都是通过json的序列化和反序列化实现,因此我们可以通过定制全局json序列化、反序列化器来实现。核心代码如下@Bean。
2024-11-19 10:30:43
949
原创 聊聊我们那些年用过的表达式引擎组件
我们在设计一些表单或者流程引擎时,可能我们会设计各种各样的表达式或者规则,我们通过各种表达式或者规则来实现我们的业务流转。今天就来盘点一下我们经常会使用到的表达式引擎本文介绍了市面比较常用的表达式引擎组件,而这些引擎基本上都可以用hutool提供的表达式门面实现,hutool确实在工具类这方面做得很好,基本上我们日常会用到的工具,它大部分都涵盖到。最后文末demo链接,也提供了跟spring整合的表达引擎聚合实现,大家感兴趣也可以看看。
2024-11-12 10:41:56
1110
原创 聊聊spring项目如何根据事件条件进行事件分发
spring的事件驱动模型,想必大家都比较熟,今天就来水一期,如何使用事件条件来进行事件触发。直接上示例看完也许有朋友会说,我直接在监听类方法里,写if-else也可以达到效果啊,为啥那么麻烦。如果业务没那么复杂的话,可以这么做,但是我们本身使用事件就是为了解耦,如果在事件监听里面写一堆if-else,一来职责不够单一,二来我们更提倡对修改关闭,对扩展开放。
2024-10-29 10:16:51
467
原创 聊聊如何优雅替换第三方提供的spring bean
前阵子业务部门接手供方的项目过来运维,在这个项目中,供方提供了一个springboot starter,但这个starter不满足业务部门需求的,业务部门的研发本想基于这个starter进行扩展,但发现其中有个核心类,用了 @Primary注解,示例形如下@Bean@Primary这样导致他们无法使用他们自定义的类,于是业务部门就找上了我们部门,看我们这边有没有什么法子,今天就来聊聊这个话题,如何优雅的替换第三方提供的spring bean。
2024-10-22 10:13:20
781
原创 聊聊如何实现一个特别的责任链
什么是责任链责任链是一种设计模式,它让多个对象有机会处理同一个请求,这些对象形成一个链。请求从链的一端开始,逐个传递给链上的对象,直到某个对象处理它或者请求未被处理。这样,发送请求者无需知道哪个对象会处理,实现了发送者与接收者的解耦,增加了系统的灵活性责任链的常用场景权限与认证系统:在登录认证、权限验证流程中,不同的处理者可以检查用户名密码、验证权限级别、处理单点登录等。请求(如访问资源)沿着责任链传递,直到找到合适的处理器来授权或拒绝访问。日志记录与错误处理。
2024-10-15 09:24:44
708
原创 聊聊springboot项目如何细粒度控制API响应值
不知道大家日常开发会不会有类似这样的需求,同个API接口不同版本需要返回不同响应值,不同角色需要看到不同响应数据。接到类似这样的需求,一般人的做法可能是针对不同的场景定义不同的DTO,今天给大家介绍一款在springboot项目中可以细粒度控制响应值的大杀器@JsonView什么是@JsonView?@JsonView是Spring MVC中使用的Jackson注解,用于在序列化和反序列化过程中控制JSON对象的特定字段。例如,该注释可以允许基于上下文仅返回对象的某些字段。@JsonView应用场景。
2024-09-24 09:26:41
853
原创 ingress-nginx常用注解指南
k8s ingress-nginx是个好东西,而如何用好ingress-nginx,抛开运维这块不说,对于ingress-nginx annotations掌握的好坏,决定了你在日常开发是否能使用好ingress-nginx ,因为ingress-nginx大部分能力都可以通过配置annotations实现出来。今天这篇文章主要是对ingress-nginx annotations一些常用功能做个分类,便于大家查阅。
2024-09-03 09:27:11
920
原创 聊聊如何利用ingress-nginx实现应用层容灾
容灾是一种主动的风险管理策略,旨在通过构建和维护异地的冗余系统,确保在面临灾难性事件时,关键业务能够持续运作,数据能够得到保护,从而最大限度地减少对组织运营的影响和潜在经济损失。因此容灾的重要性不言而喻,今天的话题主要是聊下如何利用ingress-nginx实现应用层容灾利用以上2种方式,就可以实现一个简易版的应用层容灾,实际上的容灾远比上述的复杂,因为可能还涉及到数据备份同步等,不过利用k8s确实能减轻我们实现层面上的一些负担。
2024-08-20 09:29:48
786
原创 聊聊项目中如何实现请求聚合
什么是请求聚合见名之意就是将多次的请求整合为一个请求处理如何实现请求聚合有个快手大佬开源了一个工具类:buffer-trigger,这玩意就可以用来做请求聚合。buffer-trigger适用场景高吞吐量消息处理: 当系统需要处理大量快速产生的数据或消息时,如日志记录、事件追踪、实时交易数据等,单条消息的即时处理可能会导致过多的系统开销(如网络通信、数据库操作等)。通过使用BufferTrigger,可以将这些消息暂时缓存在阻塞队列中,累积到一定数量后一次性进行批量处理。
2024-08-06 09:24:31
480
原创 聊聊在springcloud gateway如何获取请求体
在我们扩展scg时,获取requestbody也是一个挺常见的需求了,比如记录日志,我们要获取请求体里面的内容。在HTTP协议中,服务器接收到客户端的请求时,请求体(RequestBody)通常是以流的形式传输的。这个流在设计上是只读且不可重复读取的。即request body只能读取一次,但我们很多时候是更希望这个requestbody可以被多次读取,那我们今天就来聊下这个话题。
2024-07-30 09:18:03
1500
原创 聊聊springboot项目脱离配置中心,如何实现属性动态刷新
如果大家有开发过微服务项目,那对配置中心应该是耳熟能详了,配置中心有个很有用的能力,就是热更新属性,即不重启服务,就能做到属性的动态变更。而我们今天讲的话题是,怎么样不使用配置中心,也能达到如上的效果利用spring-cloud-context提供的API来实现一个属性热更新,还是挺容易的。但这种方式是有局限性的,比如集群环境,就涉及到属性的更新同步,其次因为变更,本质是刷新bean的内存值,这就意味着服务一旦重启,刷新的值就会恢复成初始值。
2024-07-16 09:22:03
923
原创 聊聊springboot项目如何利用jmh来进行基准测试
1、什么是JMHJMH(Java Microbenchmark Harness)是由OpenJDK团队开发的一个用于Java微基准测试工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级。它提供了一种标准、可靠且可重复的方式来衡量Java代码的性能,包括方法调用、对象创建以及其他类型的 JVM 级别的操作。JMH 通过生成优化过的字节码来确保基准测试不受常见陷阱的影响,如热身不足、垃圾回收干扰、编译器优化等,从而产生更准确的性能指标2、JMH主要使用场景精确测量方法执行时间。
2024-07-09 10:48:55
681
原创 聊聊gitlab ci如何构建以时间为版本号的docker镜像
最近朋友他们部门有部分内部项目,打算用gitlab ci来做项目持续集成部署,他们有个需求,构建docker镜像的时候,版本需要是以当前时间作为版本。其格式为yyyymmddhhmm一开始朋友翻阅官方文档,发现gitlab ci有个变量CI_COMMIT_TIMESTAMP,可以生成时间戳,他默认生成的格式是ISO-8601。就是类似2022-01-31T16:47:55Z这种,很显然和朋友他们的需求不符合。于是他就想用如下方式进行转换结果报如下错后面他调整为如下方式,即直接用date命令输出当前时间戳。
2024-07-02 09:31:41
1123
原创 聊聊如何利用Testcontainers进行集成测试
1、何为Testcontainers?Testcontainers是一个库,它为引导本地开发和测试依赖关系提供了简单而轻量级的API,并将真实的服务封装在Docker容器中。使用Testcontainers,您可以编写依赖于您在生产中使用的相同服务的测试,而不需要mock或内存服务。用比较直白的话就是testcontainers 能够让你实现通过编程语言去启动Docker容器,并在程序测试结束后,自动关闭容器2、Testcontainers有哪些优势?
2024-06-11 09:27:50
1295
2
原创 聊聊如何感知项目引入哪些功能特性
使用过springcloud全家桶朋友,应该知道springcloud涉及的组件很多,为了让开发者快速了解项目引入了springcloud哪些组件,springcloud引入了HasFeatures,配合Actuator,可以让开发者感知到项目引入的组件功能类型、名称、版本以及对应的开发商。今天我们就利用这个特性,自己实现一把HasFeatures在简单的项目中,可能用处不大,但是在涉及到很多功能组件时,可以利用HasFeatures机制,让我们快速了解项目引入的功能组件,便于我们快速熟悉项目。
2024-05-28 09:25:19
947
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅