- 博客(193)
- 收藏
- 关注
原创 Spring Boot 集成 Redis 发布订阅实现消息通信
本文介绍了如何在Spring Boot项目中集成Redis的发布订阅功能。Redis发布订阅模式通过解耦消息发送方和接收方,实现了高效的消息通信。文章详细展示了发布消息的实现(使用RedisTemplate.convertAndSend())和订阅端的配置(包括RedisMessageListenerContainer和MessageListenerAdapter)。通过实际代码示例,说明了如何配置消息监听容器、适配器以及实现消息处理器(MessageReceive类),从而完成从消息发布到接收处理的完整流
2025-08-21 16:53:55
461
原创 微服务网关中数据权限传递的那些坑:从 Feign 兼容性问题到解决方案
微服务架构中,JSON数据通过请求头传递时,Feign的表达式解析机制会破坏JSON结构。本文提出"压缩+Base64转码"方案:网关层将JSON压缩后Base64编码放入请求头,下游服务反向解码还原数据。该方案有效规避Feign兼容性问题,确保数据安全传递,同时通过压缩减少传输体积。实践需注意编码一致性、异常处理和性能优化,为微服务间数据传递提供了稳定可靠的解决方案。
2025-08-20 11:43:11
878
原创 Spring Boot日期格式化艺术:全局配置、@JsonFormat与实战陷阱的权威指南
本文深入探讨了Spring Boot中日期格式化的三大核心机制:全局Jackson配置、@JsonFormat注解和@JsonIgnore注解。通过7个生产级案例和3大冲突场景解决方案,揭示了日期处理的底层逻辑与高阶实践。文章特别对比了@DateTimeFormat与@JsonFormat的本质差异,前者用于HTTP请求参数绑定,后者控制JSON序列化/反序列化,并提供了多时区混用、多格式解析和历史数据迁移等实际问题的解决方案。开发者在处理日期时间时应特别注意时区配置、格式兼容性和注解的正确使用场景,以避免
2025-04-10 16:16:06
1190
原创 Java 集成 ES:日期字段的时区处理与时间戳序列化指南
由于我们项目中引入了es组件,针对es中存储了很多关于日期的问题,由于我们项目需要实现国际化所以肯定需要考虑时区问题,所以es中日期相关的字段都采用了时间戳,那如何优雅的将业务中不同类型的日期值在写入到es中转换成时间戳的问题进行了延伸,包括前期一篇博客也发布了关于时区问题的处理给出的代码是Java语言,涉及到一个类的字段定义和设置方法。具体来说,用户有一个result对象,调用了setClientTime方法,传入的参数是data.getClientTime()。
2025-03-31 17:43:28
1026
原创 深入解析 MyBatis-Plus 批量操作:原理、实现与性能优化&MyBatis参数映射机制详解
本文探讨MyBatis-Plus在高并发场景下的批量数据库操作优化。重点分析批量更新和自定义批量插入的实现原理:批量更新通过动态拼接CASE WHEN语句实现单SQL多记录更新,减少网络请求;自定义批量插入突破MyBatis-Plus默认的逐条插入模式,通过SQL注入器和动态代理机制实现高效批量处理。文章提供了详细的XML配置示例、性能优化建议(如分批次提交、数据库参数配置)以及避坑指南,帮助开发者在处理大数据量时显著提升系统性能。
2025-03-26 20:08:16
1626
原创 Java实现HTTPS双向认证的终极指南:从原理到实战
在与某个外部系统进行API对接,比如银行支付网关或第三方服务,这些系统通常要求双向SSL认证来确保通信双方的身份;前端端交互的时候或者进行HTTPS协议传输的时候,其实已经帮我实现了,就不需要通过代码层进行解决了,但是目前就有这个需求,在于第三方系统接口交互的时候需要进行双向认证,那么在实战之前,大家肯定需要对进行个熟悉的认知。
2025-02-14 16:11:19
1410
原创 Spring Boot 线程池自定义拒绝策略:解决任务堆积与丢失问题
Overridelog.error("异常: {},线程: {}", ExceptionUtils.getStackTrace(e), t.getName());作用:防止线程因未捕获异常直接终止,提升系统稳定性。当然这个是处理线程池中子任务处理业务逻辑的时候发生业务异常的处理方式,除此之外还有其他的解决方案@Overridetry {if (!log.info("队列已满,阻塞等待...");log.info("任务已加入队列");log.error("拒绝策略异常", e);
2025-02-08 16:53:44
1230
原创 基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案
开始方法] → [AOP 拦截] → [开始计时] → [业务逻辑执行] → [结束计时] → [MDC 存储时间]↓[日志输出] ← [MDC 输出时间]通过结合 Slf4j + Logback 和 AOP,我们可以自动化地记录方法执行的时间,并将其通过 MDC 传递到日志系统中,而无需手动添加时间记录的代码。这种方式在生产环境中非常方便,可以让你实时了解应用的性能瓶颈,且对代码的侵入性非常低。
2024-12-27 20:43:59
1263
转载 【高性能缓存方案】SpringCache整合Redis+Caffeine两级缓存架构
本文按照对业务入侵的递减程度,依次介绍了三种管理两级缓存的方法。至于在项目中是否需要使用二级缓存,需要考虑自身业务情况,如果Redis这种远程缓存已经能够满足你的业务需求,那么就没有必要再使用本地缓存了。毕竟实际使用起来远没有那么简单,本文中只是介绍了最基础的使用,实际中的并发问题、事务的回滚问题都需要考虑,还需要思考什么数据适合放在一级缓存、什么数据适合放在二级缓存等等的其他问题。
2024-12-14 13:51:53
397
原创 从存储到展示:全球化平台的时区转换完整方案
跨时区时间处理方案:MySQL数据库推荐使用TIMESTAMP类型,因其支持自动时区转换。需加载时区表并设置会话或全局时区,业务处理时前端转换时区显示,后台统一使用UTC时间存储。注意自动更新字段和SQL函数的时区行为,程序传入时间需显式指定时区。案例中需使用UTC时区进行时间戳转换而非系统默认时区。
2024-11-09 15:49:20
1253
原创 纯干货!详解Java并发之线程中断机制
Java并发之线程中断阻塞队列的工作原理BlockingQueue 是 Java 中提供的一种线程安全的队列实现,它在多线程环境下非常有用,尤其适合生产者-消费者模式。常见的 BlockingQueue 实现包括:BlockingQueue 提供了以下两类方法来插入和获取元素:线程中断与阻塞队列的结合在使用 BlockingQueue 时,通常会涉及到多线程的生产者-消费者模式。如果某个线程在 BlockingQueue 上调用了阻塞操作(如 take() 或 put()),而同时需要终止该线程,通常
2024-10-11 18:36:35
1239
原创 jmeter实现SSL双向验证
预先了解:SSL单向/双向认证详解握手请求以及tomcat配置https请求的请到以下网址了解der,cer文件一般是二进制格式的,只放证书,不含私钥crt文件可能是二进制的,也可能是文本格式的,应该以文本格式居多,功能同der/cerpem文件一般是文本格式的,可以放证书或者私钥,或者两者都有pem如果只含私钥的话,一般用.key扩展名,而且可以有密码保护pfx,
2024-10-10 17:00:42
850
原创 解密 MyBatis 插件链:为什么你的自定义插件被分页插件 “堵“ 住了?
在 MyBatis 的分页插件设计中,通常会在 intercept 方法中对 SQL 语句进行修改,而不是直接调用 invocation.proceed()。这是因为分页插件的主要目的是修改 SQL 语句,使其包含分页逻辑(例如添加 LIMIT 和 OFFSET 子句),而不是简单地继续执行原生的 SQL 语句。拦截 SQL 语句:当 MyBatis 准备执行一个 SQL 语句时,分页插件会在 intercept 方法中拦截到这个 SQL 语句。
2024-09-25 14:05:29
1355
原创 Spring Boot项目中实现OAuth2客户端模式(Client Credentials Grant Type)
创建一个实现了ClientDetailsService接口的服务类,用于加载客户端详情。
2024-09-13 21:13:41
2211
原创 easy-es动态索引支持
很多项目目前都引入了es,由于es弥补了mysql存储及搜索查询的局限性,随着技术的不断迭代,原生的es客户端使用比较繁琐不直观,上手代价有点大,所以easy-es框架就面世了,学习成本很低,有空大家可以去了解下那说回主题,我们项目会发布在测试环境,也会部署在UAT环境,最后上线,但是ES可能就部署一套或者和别的业务进行公用,此时我们需要按照不同环境进行es数据隔离,由于代码肯定是一套的,那此时方案就需要通过nacos的动态配置进行索引自动更新新的索引名了。
2024-09-13 15:20:10
1443
1
原创 搞定数据同步:Maxwell 解析 MySQL binlog 的配置、验证与 Kafka 集成方案
本文介绍了如何配置MySQL binlog并使用Maxwell工具监听数据库变更。主要内容包括:1)修改my.cnf文件配置binlog日志;2)初始化Maxwell所需的数据库和用户权限;3)下载安装Maxwell;4)通过控制台和Kafka两种方式监听数据库变更,包括插入、更新和删除操作;5)详细解析Maxwell返回的JSON数据结构及其字段含义。文中还提供了Maxwell连接Kafka的配置参数说明,并建议了解决Kafka分区倾斜问题的方案。最后给出了操作示例和参考视频链接。
2024-09-03 17:17:12
665
转载 jasypt 敏感信息加密方案
使用Jasypt(Java Simplified Encryption)进行数据加密和解密主要涉及几个步骤,包括引入依赖、配置加密密码、加密敏感信息、将加密信息存储到配置文件中,以及应用程序启动时自动解密。
2024-09-03 17:13:45
539
原创 maven仓库密码加密方案原理
有一个要求就是说不能使用明文密码,需要对 settings.xml 文件中的password密码进行加密原始配置是没有对密码进行加密的。
2024-08-02 16:46:17
1274
1
原创 【三方对接】接口HTTP交互方案集合
我们很多项目难免会遇到和外围系统对接,尤其在车企行业尤其突出,比如对接PKI系统、TSP基础信息对接、VSP电子档案对接等,那就会涉及到接口调用方式,当然本篇的博文不是为了演示如何去交互,是为了收集哪些交互方式比较优雅,数据过来如何去规整,分发等策略,我们无论内网外网都是通过HTTP进行交互,包括认证等。
2024-07-30 19:41:30
448
转载 揭开浏览器验证HTTPS证书的合法性底层面纱
浏览器拿到了服务端的数字证书后,要怎么校验该数字证书是真实有效的呢?这个过程很多人没有关注到,我这里详细说下。
2024-06-15 14:28:49
531
原创 并发编程:ScheduledThreadPoolExecutor你真的了解吗?
创建一个配置类来定义你的ScheduledThreadPoolExecutor实例。@Bean// 设置线程池大小// 设置线程前缀// 取消任务时是否移除注意,虽然上述示例中使用了ThreadPoolTaskScheduler,它是Spring对定时任务线程池的封装,底层也是基于实现的,因此适合用于集成定时任务。
2024-05-25 15:28:16
964
转载 Spring Upload File 报错FileNotFoundException
我们在项目中肯定经常遇到文件流相关的问题,本篇博文就是记录下使用文件路径不当引发的错误。
2024-05-24 18:23:56
153
原创 链路追踪原理
随着业务需求的快速变化和技术的演进,当一个用户请求需要跨越多个线程时,形成了复杂的调用链路。当出现性能问题、错误或故障时,导致故障排查、性能优化和业务逻辑理解变得困难。本文主要论述链路追踪的原理。
2024-05-21 18:39:14
389
原创 线程池异常如何处理?
忽的一下,想到了线程池的比较重要的一个参数:ThreadFactory接口,这个接口的作用是按需创建新线程的,使用线程工厂消除了对Thread#Thread(Runnable) new Thread的强依赖,使应用程序能够使用特殊的Thread子类、优先级等。大白话就是让线程池中的线程使用我们自定义的线程,这个自定义可不是我们通过execute()或submit()传进来的自定义线程,而是Worker类中的thread变量,也就是实际运行的线程,我们看一下Worker类的构造方法。
2024-05-17 17:04:28
2666
原创 服务调用中的异常处理方案
在微服务架构中,A服务调用B服务,当B服务中抛出异常时,我们的意愿是能够获取到所有的异常信息,并且可以触发服务的熔断降级。但由于全局异常处理机制的存在,会帮我们处理B服务中抛出的异常,并把HTTP的状态码设置为200,那么此时对A服务来说,对B服务抛出的异常是无感知的,仍会继续业务代码的执行,并且不会触发服务的熔断降级,可能会导致微服务系统的雪崩。注意:这里要区分业务状态码和HTTP的相应状态码,业务状态码是无法触发降级的。现在有个服务A 和服务B部分代码服务A 的代码Feign客户端的代码服务B的代码
2024-05-13 16:04:50
1099
原创 如何优雅的实现接口限流?
首先限流,其实解决方案有很多,比如通过nginx配置,通过gateway网关进行限流,比如Spring Cloud GateWay整合熔断器实现限流但是以上都是全局的,如何灵活的针对某些接口进行不同级别的限流呢?
2024-05-09 20:32:30
525
原创 SpringBoot中多数据源灵活切换解决方案
本篇内容介绍了“SpringBoot中如何使用Dynamic Datasource配置多数据源”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持无数据源启动,支持配置懒启动数据源(3.3.2+)。支持数据库敏感配置信息 加密 ENC()。支持每个数据库独立初始化表结构schema和数据库database。
2024-04-26 18:11:35
1372
3
原创 如何解决线程池引发的future性能问题?
这个自定义拒绝策略里面其实就打印个日志没有抛出异常,也就是说不管你处理什么逻辑,但是如果不抛出异常的话呢,那么这个任务其实是没有结束的@overrideSystem.out.println("线程池有任务被拒绝了,请关注");上面两个方法就是核心了,也就是说在刚开始把task任务包装成FutureTask任务的时候,也就是new FutureTask()初始化的状态值是0,所以调用get方法的时候状态值还是0,并没有把状态值改变成1,所以对于线程池而已这个任务并没有完成,就会一直阻塞,那如何处理呢?
2024-04-16 10:09:24
730
原创 SSE高可用方案
SSE(Server-Sent Events)是一种用于实现服务器主动向客户端推送数据的技术,也被称为“事件流”(Event Stream)。它基于 HTTP 协议,利用了其长连接特性,在客户端与服务器之间建立一条持久化连接,并通过这条连接实现服务器向客户端的实时数据推送。
2024-04-07 11:29:06
1596
翻译 Spring Retry重试机制
重试的使用场景比较多,比如调用远程服务时,或者feign远程调用的重试,由于网络或者服务端响应慢导致调用超时,此时可以多重试几次。用定时任务也可以实现重试的效果,但比较麻烦,用Spring Retry的话一个注解搞定所有。话不多说,先看演示。
2024-03-22 13:56:35
235
原创 网关限流全解析:从 Hystrix 到 Resilience4J 的实践之路
本文介绍了Spring Cloud Gateway网关限流的两种方案:整合Hystrix和CircuitBreaker。通过配置Hystrix的信号量隔离模式(SEMAPHORE)和线程池隔离模式(THREAD),详细说明了maxConcurrentRequests、timeoutInMilliseconds等关键参数的作用。同时指出Hystrix已被CircuitBreaker取代,并给出了Spring Cloud Gateway整合CircuitBreaker的配置示例。文章还强调了信号量隔离与线程池隔
2024-03-07 14:18:25
821
原创 《Token+Redis双核防御:高并发系统幂等设计的落地实践》
在车联网OTA升级场景中,接口防重放攻击是保障系统安全的核心需求。本文重点剖析Redis分布式方案在车辆接口调用频控中的实践,该方案通过RedisKey.API_ATTACK构建车辆唯一标识+签名特征的复合键,实现分钟级访问频次控制。
2024-03-06 16:08:02
551
转载 CompletableFuture在异常处理方面的一些常见问题和解决方案!
CompletableFuture是Java 8引入的一个类,位于java.util.concurrent包下。它提供了一种方便的方式来进行异步编程,尤其是在处理一系列并发任务时非常有用。CompletableFuture支持链式调用和组合多个异步任务。我们可以通过调用各种方法来注册回调函数,在任务完成时获取结果或处理异常CompletableFuture提供了强大的功能来处理异步编程中的结果和异常。然而,在处理异常时,我们需要注意一些常见的陷阱。
2024-02-26 17:55:44
1171
1
原创 玩转Java8新特性
*** 整车大版本策略-有效/无效处理逻辑* @param status 有效:1 无效:0**//*** 如果参数为有效:1 ---> 该目标大版本下所有原版本策略都是有效的,可以继续* 反之无效:0 ----> 该目标大版本下所有原版本策略都是无效的,需要将策略都设置失效状态 2、策略关联的任务都设置为失效状态* @param status 有效:1 无效:0**/// 通过目标大版本号且是有效状态的获取所有的关联任务id// 批量修改任务的状态置为已失效。
2024-02-07 13:59:40
438
原创 【Elasticsearch】从入门到精通
吕老师:但是 Lucene 还是一个库,必须要懂一点搜索引擎原理的人才能用的好,所以后来又有人基于 Lucene 进行封装,写出了 Elasticsearch吕老师:类型是用来定义数据结构的,你可以认为是 MySQL 中的一张表。文档就是最终的数据了,你可以认为一个文档就是一条记录吕老师:比如一首诗,有诗题、作者、朝代、字数、诗内容等字段,那么首先,我们可以建立一个名叫 Poems 的索引,然后创建一个名叫 Poem 的类型,类型是通过 Mapping 来定义每个字段的类型。
2024-02-04 14:31:58
1425
原创 mysql锁的实际场景分析
首先判断该where的条件列是否命中索引了,注意是命中哈,也就说即使加了索引但是实际上并未命中,都是导致全表扫描,给所有的数据加上了行锁+间隙锁,相当于表锁如果命中了索引,如果更新操作未提交事务,此时记录不存在那么就会产生间隙锁,存在就行锁,也可能两个锁同时存在,如果记录存在那一定是行锁如果命中了索引,如果插入操作未提交事务,一定是行锁,不会产生间隙锁,及时事务未提交也不会影响别的事务进行更新或者插入操作。
2023-12-27 17:41:01
806
原创 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏【权限控制】
我们在使用手机银行的时候经常能看到APP上会将银行卡的卡号中间部分给隐藏掉使用 ***** 来代替,在某些网站上查看一些业务密码时(例如签到密码等)也会使用 ***** 来隐藏掉真正的密码,那么这种方式是如何实现的呢?我们这篇文章的实现思路就基于Hutool来实现,在Hutool中提供了一个名为 DesensitizedUtil 的工具类,我们使用这个工具类来加密。
2023-12-26 11:06:22
1308
转载 还在无脑使用synchronized?volitale或许能更优雅的帮到你
volatile 修饰符适用于以下场景:某个属性被多个线程共享,其中有一个线程修改了此属性,其他线程可以立即得到修改后的值。比如boolean flag ,或者监视数据变化,实现轻量级同步单纯的赋值,比如将flag的值改为true或者false,不适用于count++这样的非原子操作监视数据变化,比如检测到flag的值变为true,就退出循环等操作,当温度超过40度就报警等。
2023-12-09 18:15:23
196
原创 【CompletableFuture】批量异步任务处理
当我们在项目中遇到很多业务同时处理,如果是串行肯定是影响性能的,这时候就需要异步执行了,说道异步肯定就有很多方案了。
2023-11-07 17:11:06
949
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人