- 博客(72)
- 收藏
- 关注

原创 企业级 Java 应用灰度发布设计方案与实践全解析
摘要:灰度发布作为互联网产品迭代的关键技术,通过渐进式部署实现风险可控、快速验证和平稳过渡。文章系统剖析了6种主流实现方案:代码硬编码、配置中心、网关层、服务网格、Kubernetes Ingress和Java Agent,对比了各方案的技术复杂度、业务侵入性和适用场景。针对中大型系统,推荐采用配置中心或网关层方案实现灰度规则与业务解耦;云原生环境建议结合服务网格或K8s Inress;遗留系统可采用Java Agent改造。
2025-06-25 22:58:03
1105

原创 Spring Cache+Redis缓存方案 vs 传统redis缓存直接使用RedisTemplate 方案对比
SpringCache结合Redis的优势在于简化开发、提升灵活性和增强分布式支持。通过注解驱动的声明式缓存(@Cacheable等),开发者可以减少冗余代码,实现业务与缓存逻辑解耦。该方案提供统一的缓存抽象层,支持灵活切换底层实现,并天然适配Redis的分布式特性。此外,自动序列化、全局TTL配置、防缓存穿透等机制进一步提升了系统的可靠性和可维护性。相较于直接使用RedisTemplate,这种组合方案显著降低了开发复杂度,特别适合需要快速实现高效缓存的中大型分布式系统。
2025-06-11 14:35:37
1061

原创 Spring Plugin框架应用实践:医院多租户客户端动态路由方案解析
本文以医院多租户系统为例,探讨了基于SpringPlugin框架实现动态业务路由的解决方案。通过策略模式设计插件接口,结合PluginRegistry实现策略自注册和动态匹配,有效解决了SaaS系统中客户需求差异化的痛点。文章详细解析了核心实现机制,包括插件定义、策略枚举、动态路由控制等关键技术点,并总结了配置驱动扩展的设计优势。该方案已在三甲医院落地验证,具有核心模块零修改、策略间完全隔离、支持热部署等特点,为类似场景提供了可复用的架构范式。
2025-06-05 16:07:21
986

原创 Redis延时队列在订单超时未报到场景的应用分享
Redis 延时队列是一种特殊的队列,它允许元素在指定的时间后才被消费。在 Redis 中,通常可以使用有序集合(Sorted Set)或 Redisson 提供的延迟队列来实现。有序集合的分数可以用来表示元素的过期时间,通过不断轮询有序集合,当分数小于当前时间时,就将元素取出消费。而 Redisson 则提供了更方便的 API 来实现延时队列,它内部封装了很多复杂的操作,让开发者可以更简单地使用。
2025-03-29 10:46:30
998

原创 关于java对接微信公众号(对接百度AI实现图片文字识别,对接聚合数据实现笑话、谜语大全,成语接龙等功能)
关于java对接微信公众号(对接百度AI实现图片文字识别,对接聚合数据实现笑话、谜语大全,成语接龙等功能):只是自己学习使用,所以有点不规范,请见谅。本文直接附上源码与效果图,具体操作步骤请参考另一篇文章:http://t.csdnimg.cn/PQu25
2024-04-26 17:51:37
886
2

原创 关于JAVA如何对接海康威视(iSecure Center综合安防管理平台)门禁和摄像头视频取流
根据自己的需求灵活选用对接方式。我们客户购买了海康的综合安防管理平台,经与海康交流过后,我这里选择直接通过调用海康的综合安防管理平台的Open Api进行对接这篇文章只包含java如何对接海康威视,不涉及前端具体技术需求:对接海康威视的视频与门禁。(1)大屏可视化,实现视频的取流,摄像头监控实时预览。(2)获取摄像头监控点与门禁设备的状态,是否运行正常(3)获取门禁设备的事件,用户进出情况记录。大致对接流程:注册登录后,在场景方案中选择基础对接,先了解接口安全认证规则,确保必要参数客户/海康已经提供,
2024-04-25 13:30:35
11339
3

原创 深入理解Lambda表达式-函数式编程-Stream流(最全学习笔记)
Lambad表达式:Lambda是JDK8中一个语法糖。他可以对某些罩名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。
2024-03-01 14:44:09
1344
2
原创 Spring Cloud LoadBalancer 详解
在分布式系统快速发展的当下,服务间的调用日益频繁且复杂。如何合理分配请求流量,避免单个服务节点过载,保障系统的稳定性与高效性,成为关键问题。负载均衡技术便是解决这一问题的重要手段。Spring Cloud LoadBalancer 作为 Spring Cloud 官方推出的负载均衡器,在微服务架构中发挥着至关重要的作用。本文将对其进行详细解析。
2025-07-17 23:10:09
13
原创 Spring Boot 自动配置:从 spring.factories 到 AutoConfiguration.imports 的演变
spring.factories 曾是 Spring Boot 自动配置的基石,但其设计缺陷在微服务和云原生时代逐渐暴露。AutoConfiguration.imports 通过精准加载、类型安全和模块化支持,从根本上提升了自动配置的可靠性与性能。对于新项目,应直接采用 AutoConfiguration.imports;对于存量系统,建议分阶段迁移:先创建新配置文件,再逐步替换旧逻辑,最终实现全面升级。这一演变不仅是技术细节的优化,更是 Spring Boot 拥抱现代化开发范式的重要标志。
2025-07-17 17:07:23
489
原创 Java 常见工作流引擎深度对比与企业选型指南
Java 工作流引擎的选型需综合考量业务复杂度、技术栈适配性和长期运维成本。Camunda 凭借其企业级特性和云原生能力,成为中大型企业的首选;Flowable 则以高性价比和灵活扩展能力,在中小型项目中占据优势;Activiti 仍在传统企业中发挥价值,但其市场份额正逐步被 Flowable 侵蚀。
2025-07-15 17:03:33
694
原创 《Spring 中上下文传递的那些事儿》Part 8:构建统一上下文框架设计与实现(实战篇)
统一上下文框架设计与实现摘要 本文介绍了一个可插拔的统一上下文管理框架设计方案,用于整合Web请求、RPC调用、日志追踪等多种上下文来源。该框架具备多上下文兼容、自动传播、配置化扩展等核心功能,支持与Spring Boot无缝集成。文章详细展示了架构设计、核心接口定义(ContextManager和ContextProvider)、三种典型上下文提供者实现(Web、RPC、日志),以及统一上下文管理器和Spring自动配置的实现。通过这种设计,开发人员可以统一管理各类上下文信息,避免分散维护带来的问题
2025-07-12 23:39:05
763
原创 《Spring 中上下文传递的那些事儿》Part 11:上下文传递最佳实践总结与架构演进方向
本文总结了Spring应用中上下文传递的最佳实践与未来发展方向。通过系列探讨,我们系统梳理了从Web请求到异步任务、多租户隔离到日志脱敏等场景下的上下文管理方案。文章提炼出四大核心挑战(线程复用、异步调用、多源冲突、安全问题)并提供详细解决方案Checklist,涵盖初始化、调用链路、安全审计、多租户等维度。同时展示了推荐的上下文框架结构图,并展望了标准化协议、智能识别、服务网格集成、Serverless支持等未来演进方向。
2025-07-12 23:38:10
887
原创 《Spring 中上下文传递的那些事儿》Part 10:上下文敏感信息脱敏与审计日志记录
在现代企业级系统中,日志安全和数据隐私保护变得越来越重要。随着 GDPR、网络安全法等法规的出台,开发者必须确保在日志中不泄露用户敏感信息(如手机号、身份证号、银行卡号等),同时又要保留足够的上下文用于问题排查和操作审计。
2025-07-11 14:47:27
1158
原创 《Spring 中上下文传递的那些事儿》Part 9:上下文安全隔离与租户上下文设计
在多租户系统中,租户上下文(Tenant Context) 是一个非常关键的概念。它用于标识当前请求属于哪个租户,并在整个调用链路中进行透传和校验,以实现数据隔离、权限控制和资源访问限制。然而,在实际开发中,由于线程复用、异步任务、服务间调用等问题,很容易出现租户信息丢失或被错误覆盖的情况,进而导致严重的安全漏洞或数据泄露。本文将带你深入探讨如何构建一个安全、可扩展、可透传的租户上下文框架,并结合 Spring Boot 实现完整的集成方案。
2025-07-11 11:40:23
636
原创 《Spring 中上下文传递的那些事儿》Part 7:异步任务上下文丢失问题详解
在现代 Java 应用中,异步编程已经成为提升性能、解耦业务逻辑的重要手段。无论是使用 CompletableFuture、线程池(ExecutorService)、定时任务(ScheduledExecutorService),还是 Spring 的 @Async 注解,我们都可能遇到一个共同的问题:上下文信息丢失。本文将带你深入理解为什么异步任务中会出现上下文丢失,并提供多种解决方案,包括手动拷贝、TTL 封装、AOP 自动注入等,帮助你在各种场景下都能正确地传递上下文。
2025-07-10 16:13:12
977
原创 微服务架构的演进:迈向云原生——Java技术栈的实践之路
随着云计算技术的快速发展,微服务架构正逐步向云原生(Cloud Native)演进。云原生不仅是一种技术体系,更是一种开发和运维理念的革新。本文将以Java技术栈为例,结合Kubernetes(K8s)、服务网格(Istio)等关键技术,探讨微服务如何通过云原生实现高效、弹性、可观测的现代化架构。
2025-07-10 15:51:43
1041
原创 《Spring 中上下文传递的那些事儿》Part 6:链路追踪方案对比实践 —— Sleuth vs SkyWalking vs OpenTelemetry
在现代微服务架构中,链路追踪(Distributed Tracing) 已经成为系统可观测性(Observability)的核心组成部分。它可以帮助我们清晰地看到请求在整个分布式系统中的流转路径、耗时分布、错误节点等关键信息。
2025-07-05 10:00:00
1069
原创 《Spring 中上下文传递的那些事儿》Part 5:分布式链路追踪——SkyWalking 实战指南
随着微服务架构的广泛应用,分布式系统的链路追踪和性能监控变得尤为重要。在之前的文章中,我们探讨了如何使用 Sleuth 和 Zipkin 实现基本的链路追踪。今天,我们将介绍另一种强大的工具——Apache SkyWalking,它不仅提供了全面的链路追踪功能,还支持 JVM、数据库、消息队列等多方面的监控。本文将带你了解 SkyWalking 的核心概念,并通过实际案例展示如何将其集成到 Spring Boot 应用中,实现全栈监控。
2025-07-05 09:00:00
920
原创 微服务架构的演进:迈向云原生
随着互联网技术的发展,软件开发模式经历了从单体应用到微服务架构的重大转变。而在今天,微服务架构正朝着**云原生(Cloud Native)**的方向发展。本文将探讨为什么越来越多的企业选择将微服务架构转变为云原生,并介绍这一转型带来的主要优势和技术挑战。
2025-07-04 16:15:27
374
原创 《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
在微服务架构中,一个请求可能会经过多个服务节点。为了准确地监控调用链、定位性能瓶颈和排查问题,分布式链路追踪(Distributed Tracing) 是必不可少的能力。Spring Cloud 提供了对 Sleuth + Zipkin 的开箱即用支持,帮助开发者轻松实现全链路追踪。本文将带你了解 Sleuth 和 Zipkin 的工作原理,并结合实际项目演示如何配置和使用它们。
2025-07-04 10:40:06
883
原创 《Spring 中上下文传递的那些事儿》Part 3:Dubbo 中的 RpcContext 与上下文透传
在构建微服务架构时,服务间的上下文传递是保障链路追踪、权限校验、日志审计等能力的关键。RpcContext 是 Apache Dubbo 提供的一个核心上下文管理机制,用于在一次 RPC 调用中携带附加信息(如 traceId、userId、tenantId 等)。本文将带你深入理解 RpcContext 的原理、使用方式以及如何结合 Spring 上下文体系实现跨服务的上下文透传,并给出实际开发中的最佳实践。
2025-07-04 10:27:04
738
原创 《Spring 中上下文传递的那些事儿》Part 2:Web 请求上下文 —— RequestContextHolder 与异步处理
Spring MVC 的 RequestContextHolder 基于 ThreadLocal 实现请求上下文管理,但在异步场景下会因线程切换导致上下文丢失。本文介绍了 RequestContextHolder 的原理和使用方法,包括拦截器设置和业务层获取上下文,重点分析了异步任务中上下文失效问题,并提供了两种解决方案:手动拷贝上下文和使用 TransmittableThreadLocal 自动传递
2025-07-03 23:21:34
812
原创 《Spring 中上下文传递的那些事儿》 Part 1:ThreadLocal、MDC、TTL 原理与实践
本文深入探讨了Java开发中线程上下文信息传递的三种方案:ThreadLocal、MDC和TTL。ThreadLocal是基础的线程本地变量,但不支持跨线程;MDC是日志框架提供的诊断上下文机制,适合日志追踪;TTL是阿里开源的增强版ThreadLocal,支持线程池上下文传递。文章分析了各方案的原理、使用场景和注意事项,并给出了Spring整合建议。最后通过对比表总结了三者的优缺点,推荐在微服务架构中使用TTL+MDC+Sleuth的组合方案,以实现高效的上下文管理和日志追踪体系。
2025-07-03 23:16:07
1065
原创 云原生灰度方案对比:服务网格灰度(Istio ) 与 K8s Ingress 灰度(Nginx Ingress )
本文对比了服务网格灰度(以Istio为例)与Kubernetes Ingress灰度两种主流灰度发布方案。服务网格工作在L7网络层,支持全链路精细流量控制,适合复杂微服务场景,但部署复杂且资源消耗较高;K8s Ingress则聚焦集群入口流量,实现简单但功能有限。选型建议:简单场景使用K8s Ingress,复杂需求采用服务网格。随着云原生发展,服务网格将成为主流,企业可根据业务规模和技术能力渐进式演进方案。
2025-06-25 23:04:29
1097
原创 @Cacheable 和 @CacheEvict 注解的详细使用说明及参数解析,结合 Spring Cache 的核心功能和实际开发场景
本文详细介绍了Spring缓存注解@Cacheable和@CacheEvict的使用方法。@Cacheable用于缓存方法返回值,支持设置缓存名称、键值生成、条件判断等参数,适用于查询和静态数据场景。@CacheEvict则用于清除缓存,可以删除单个条目或清空整个缓存区,常用于删除/更新操作后保持缓存一致性。文章对比了两者特性,提供了组合使用示例,并针对缓存穿透、雪崩、击穿等问题给出了解决方案。合理使用这些注解能有效提升系统性能,同时避免缓存一致性问题。
2025-06-11 15:01:38
971
原创 Spring Cache+Redis缓存方案详解:从代码到实践
本文深入探讨了SpringCache与Redis的集成实现方案。通过ModuleDatabaseInfoService接口展示@Cacheable和@CacheEvict注解的声明式缓存应用,详细解析RedisConfig中的关键配置:使用Jackson序列化复杂对象、设置10分钟默认TTL、利用SCAN命令优化批量操作。文章还分析了缓存穿透问题及解决方案,对比了空值缓存、布隆过滤器等不同策略。自定义的TtlRedisCacheManager支持动态过期时间控制,多缓存管理器设计提升了系统灵活性。
2025-06-11 14:55:25
921
原创 任务调度器-关于中心化调度 vs 去中心化调度的核心区别
✅ 已具备分布式基础设施(如ZooKeeper/Etcd)✅ 任务规模大且需弹性扩展(如秒级百万任务调度)✅ 对高可用性要求苛刻(如7x24小时不可中断)✅ 任务规模较小(如日执行量<10万次)✅ 需要强一致性(如定时对账、支付结算)✅ 团队技术栈偏向轻量级架构。
2025-06-05 16:56:35
660
原创 Spring @Scheduled vs XXL-JOB vs DolphinScheduler vs Airflow:任务调度框架全景对比
从单机定时任务到分布式工作流调度,不同场景需要选择匹配的调度框架。本文对比 Spring @Scheduled、XXL-JOB、DolphinScheduler (海豚调度器)和 Apache Airflow 的核心差异,助你避免过度设计或功能不足。
2025-06-05 16:39:36
1155
原创 Redis延时队列在订单超时未报到场景的应用补充说明
本方案已在三甲医院预约系统中验证,支撑日均10万+订单量,平均延迟处理时间≤500ms。实际部署时建议配合APM工具(SkyWalking)进行全链路监控。定时任务每10分钟向所有队列发送心跳消息("keepAlive"),避免云Redis因空闲断开连接。RocketMQ:固定延迟级别(如1s/5s/10s/30s/1m等)分片标识,可将不同业务类型订单分散到多个队列。设计,支持任意业务对象入队,如订单ID、DTO等。Redis延时队列:秒级精度(最高)定时任务:依赖扫描间隔(通常分钟级)
2025-03-29 10:54:57
533
原创 关于使用Mybatis-plus的TableNameHandler动态表名处理器实现分表业务的详细介绍(跨系统交互接口日志业务举例)
总结而言,如果项目的需求相对简单,主要集中在单个数据库实例内,并且团队对 MyBatis-Plus 已经有一定的熟悉度,那么利用 TableNameHandler 实现分表是一个高效的选择。然而,对于那些需要跨数据库实例、具备复杂查询要求或需要更多高级数据库管理特性的应用场景,选择像 Apache ShardingSphere 或 MyCat 这样的专业工具可能是更好的解决方案。
2025-01-27 15:24:12
1484
2
原创 关于使用Mybatis-Plus的MetaObjectHandler(元对象处理)来实现自动填充实体对象字段
当你实现了并希望它能生效时,确保该类已经被 Spring 容器管理(即加上@Component注解)。如果你的项目中有多个实现,它们会按照 Spring Bean 的加载顺序依次执行。在使用和方法时,确保传递的类型与实体类中字段的类型相匹配,否则可能会抛出异常。通过这种方式,MyBatis-Plus 能够极大地简化开发过程中的数据操作,减少手动设置字段值的工作量,提高开发效率。
2024-11-19 11:00:00
691
原创 关于Java处理Excel常规列表记录,并入库的操作
对于常规的Excel列表(二维表格)的入库处理,一般的mysql连接工具,例如Navicat就支持。但是,因为业务需要,不想每次都去手动导入,所以这里采用编码且定时任务的形式来实现。
2024-11-18 16:34:24
1115
原创 关于Java合并多个Excel中的数据【该数据不是常规列表】,并入库保存的方案
使用hutool工具包的ExcelReader,进行数据处理,合并多个Excel
2024-11-18 15:40:29
1347
原创 关于Spring 注解实现服务启动时自动运行某个方法。
@PostConstruct:适用于简单的初始化操作。CommandLineRunner和ApplicationRunner:适用于需要在应用启动后立即执行的任务,特别是需要访问命令行参数或应用参数的情况。@EventListener:适用于需要在应用启动完成时执行的任务。@Scheduled:适用于定时任务,但也可以用于一次性任务。
2024-11-04 12:15:00
459
原创 使用mybatisplus执行批量保存时出现错误:Error: Cannot execute table Method, ClassGenricType not found
使用mybatisplus执行批量保存时出现错误:Error: Cannot execute table Method, ClassGenricType not found
2024-11-03 22:32:00
1360
原创 git使用HTTP的形式克隆gitlab项目报错:OpenSSL/3.2.3: error:0A0000C6:SSL routines::packet length too long
git使用HTTP的形式克隆gitlab项目报错:OpenSSL/3.2.3: error:0A0000C6:SSL routines::packet length too long
2024-11-03 21:14:46
1971
2
原创 关于@TableField中TypeHandler属性,自定义的类型处理器的使用(密码加密与解密举例)
在 MyBatis 和 MyBatis-Plus 中,是一个用于处理 Java 类型和 JDBC 类型之间转换的接口。MyBatis 默认已经提供了很多类型处理器,用于处理常见的Java类型与JDBC类型之间的转换。然而,在某些特定场景下,通过自定义将Java对象转换为数据库中特定的列类型(如枚举类型、加密后的字符串等)。从数据库读取特定列类型时,转换为Java中的对象。字段类型处理器 | MyBatis-Plus创建 TypeHandler 类实现接口。或者继承类,它提供了默认实现的一些方法。
2024-07-28 12:38:34
2413
6
原创 关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)
@JsonSerialize 和 @JsonDeserialize 是 Jackson 库提供的注解,用于在序列化(将对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为对象)过程中对特定字段进行自定义处理。这些注解允许你控制 JSON 数据的格式和内容,而不需要改变对象本身的数据结构。举例:(1)数据库中性别字段为数字,将性别转化为汉字给前端进行展示(2)保存密码时,进行加密存储,查询时给它明文展示(这里只是举例查所有,真正的场景肯定不能这样搞)
2024-07-28 11:17:07
2094
原创 spring-boot3.x整合Swagger 3 (OpenAPI 3) +knife4j
OpenAPI阶段的Swagger也被称为Swagger 3.0。在Swagger 2.0后,Swagger规范正式更名为OpenAPI规范,并且根据OpenAPI规范的版本号进行了更新。因此,Swagger 3.0对应的就是OpenAPI 3.0版本,它是Swagger在OpenAPI阶段推出的一个重要版本。与前几个版本相比,Swagger 3.0更加强调对RESTful API的支持和规范化,提供了更丰富和灵活的定义方式,并且可以用于自动生成文档、客户端代码、服务器代码和测试工具等。
2024-07-21 22:41:49
1841
原创 idea连接mysql生成对象实体,Mybatis-X插件自动生成代码
如果下载有问题,在这边可以配置驱动,根据自己的mysql版本来配置:idea版本不一样,步骤会有所不同配置根据自己情况修改:1.4开始生成2、Mybatis-X插件自动生成代码2.1安装Mybatis-X插件File–>Settings–>Plugins–>Marketplace,搜索MyBatisX–>install(1)侧边栏打开数据库,选择要生成代码的表格,在表名上右击,点击MybatisX-Generator(2)设置类名生成规则及生成代码的路径路径的生成按照物理路径是: m
2024-07-21 14:57:22
1830
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人