- 博客(269)
- 资源 (2)
- 收藏
- 关注
原创 Spring AI:Java开发者的人工智能集成利器
Spring AI是Spring生态中应用于人工智能领域的应用框架,它的目标是将Spring 生态系统的设计原则(如可移植性、模块化设计)应用于AI领域,并在AI领域中推广使用POJO(Plain Old Java Objects)作为应用的构建模块。
2026-02-02 16:33:01
986
8
原创 Java线程池
摘要:本文深入探讨Java线程池在生产环境中的实践应用与风险防范。主要内容包括:1.适用场景分析:针对IO密集型、CPU密集型、异步解耦和定时任务提供配置策略;2.常见陷阱及解决方案:如无界队列OOM风险、父子任务死锁、线程泄漏、ThreadLocal污染等;3.高级技巧:动态线程池调整、线程隔离、全链路监控、优雅关闭等最佳实践;4.源码级原理剖析:ctl状态机、Worker类实现等底层机制。文章强调必须手动配置线程池参数,采用有界队列和合理拒绝策略,并提供完整的监控方案和异常处理机制,确保系统稳定性和性能
2026-02-02 08:42:35
1024
原创 Spring Boot 监控实战:集成 Prometheus 与 Grafana,打造全方位监控体系
本文介绍了Grafana和Prometheus两大监控工具及其在Spring Boot应用监控中的应用。Grafana是一个开源的仪表盘可视化工具,支持多种数据源;Prometheus是一个时间序列数据库,专门用于系统监控。二者配合使用,Grafana通过查询Prometheus获取数据并可视化展示。文章详细说明了如何在Spring Boot项目中集成Prometheus,配置Grafana数据源,创建监控仪表盘,并设置告警规则。同时提供了JVM核心指标的PromQL查询示例,涵盖内存、GC、线程等关键维度
2026-01-13 21:22:13
659
2
原创 提示词工程 (Prompt Engineering) 的核心技巧
摘要:提示词工程是与大语言模型交互的关键技能,涉及理论知识和方法论。核心内容包括:理解词元化(Tokenization)和模型偏差/幻觉;掌握工程层面的版本控制、评估和元提示词设计;学习进阶交互模式如思维树、自我完善回路和提示词压缩。实用技巧包括角色设定、输出格式约束、少样本学习、任务拆解等。未来趋势是从"艺术"转向"科学",强调可复用性和自动化。掌握这些知识能帮助开发者从提示词"使用者"转变为AI交互逻辑的设计者。
2026-01-01 19:41:53
1313
1
原创 OpenSpec 实战:用规范驱动开发破解 AI 编程协作难题
OpenSpec是一个面向AI编程助手的规范驱动开发框架,通过"规范→执行→验证"的闭环流程提升开发效率。其核心是让AI先撰写结构化规范(包括功能描述、测试用例等),再基于规范生成代码并自动验证。该框架特别适合功能迭代和多人协作场景,能有效解决企业级项目改造和团队协作的难题。 使用流程包括:1)安装OpenSpec CLI工具;2)初始化项目并选择AI工具;3)通过/openspec命令创建提案、执行需求和归档变更。框架会生成规范的目录结构,包含specs(规范文档)和changes(变
2026-01-01 19:41:04
1979
1
原创 Excel中三种数据匹配方法
本文介绍了Excel中三种数据匹配方法: VLOOKUP - 查找J列值,返回K列对应数据,语法:=VLOOKUP(A2,J:K,2,FALSE) INDEX+MATCH - 更灵活,不受列位置限制,语法:=INDEX(K:K,MATCH(A2,J:J,0)) XLOOKUP(推荐) - 最新函数,语法简洁:=XLOOKUP(A2,J:J,K:K) 建议用IFERROR处理错误值(如"未找到"),并用$绝对引用(如$J:$K)方便拖动公式。XLOOKUP性能最佳且自带错误处理功能。
2025-12-01 08:44:45
1279
3
原创 Record-API 性能优化实战:从“锁”到“快”的深度治理
摘要:本文记录了record-api服务因PostgreSQL数据库锁冲突导致性能雪崩的完整处理过程。问题源于高频DELETE请求与定时任务并发操作同一数据表,引发严重行级锁竞争。解决方案分三阶段实施:1)紧急暂停定时任务、限制删除接口频率、设置数据库超时;2)重构定时任务为分批处理;3)重构删除接口体系,引入Redis分布式锁和异步队列机制。最终不仅解决了服务瘫痪问题,还通过架构优化显著提升了系统稳定性。文章总结了快速定位SQL问题、及时止血、架构转型等成功经验,并提出了后续优化方向。
2025-12-01 08:42:37
800
2
原创 AI保险顾问系统:基于LangChain4j的智能保险咨询实践
本文介绍了一个基于LangChain4j框架的智能保险顾问系统,旨在通过AI技术解决传统保险咨询服务的问题。系统采用Spring Boot+Vue技术栈,集成通义千问大模型,提供7×24小时的智能化保险咨询、产品推荐和条款解释服务。文章详细阐述了系统的技术实现,包括工具调用、对话管理、安全防护等核心功能,并展示了LangChain4j在Java生态中的优势。该系统已实现响应速度快、准确率高、用户满意度好的效果,未来计划扩展多模态交互和智能核保功能。
2025-11-18 21:42:32
869
4
原创 解密Java性能瓶颈:一个ThreadLocal引发的10倍性能提升实战
摘要: 在高并发后端服务中,不当使用ObjectMapper导致性能问题:频繁创建实例引入GC压力与CPU开销。优化历程从全局单例(减少对象创建)到ThreadLocal隔离(消除锁竞争),最终实现吞吐量提升10倍,延迟降低80%。ThreadLocal适用于昂贵对象复用或非线程安全对象隔离,但需警惕内存泄漏(及时调用remove())。案例启示:性能优化常始于基础细节,而非复杂架构;合理运用对象复用与线程隔离模式,可显著提升系统效率。
2025-11-03 11:03:10
623
6
原创 雪花算法分布式锁竞争事故分析与解决方案
本文分析了分布式系统中雪花算法ID生成时的Redis锁竞争问题。事故表现为服务启动失败和ID生成异常,主要原因是开发环境共享Redis导致datacenterId分配冲突。通过源码分析发现:1)雪花算法采用主动争抢的ID分配机制;2)Redis锁服务无重试且长期续期;3)本地与线上环境共享资源。解决方案包括:1)分离本地与线上Redis实例;2)优化ID分配逻辑,增加区间配置和重试机制;3)调整锁超时参数和监控策略。优化后,服务启动成功率和锁竞争问题显著改善。经验表明,分布式系统需严格隔离环境,精细管理有限
2025-11-03 11:02:40
1130
6
原创 别再写一次性脚本了!我开源了一个Go语言ETL小神器
Go-Pocket-ETL一个为开发者和运维人员设计的、轻量级、高性能的命令行ETL工具。无需复杂的配置和部署,通过一个简单的二进制文件和一个YAML配置文件,即可快速实现常见的数据提取、转换和加载任务。
2025-10-21 08:28:27
666
8
原创 精通Java策略模式:从优化条件逻辑到构建弹性系统的实战指南
策略模式是Java开发中解决复杂条件逻辑的利器,通过定义算法族并封装为可互换策略,实现算法的独立变化。文章深入解析策略模式的核心组成(环境类、策略接口、具体策略)及其优势:遵循SOLID原则、提升可维护性、增强可测试性。通过电商折扣计算和SpringBoot税费处理两个典型场景,展示策略模式与依赖注入的优雅结合,并延伸探讨其与枚举、工厂模式及Lambda表达式的组合应用。该模式特别适用于算法频繁变化的场景,但需避免对简单逻辑的过度设计。合理运用策略模式能显著提升代码的灵活性和可扩展性。
2025-10-07 17:57:55
773
原创 基于 Go 的PostgreSQL 数据库清理工具完整实现方案
该数据库维护工具包含两个核心功能:1.数据统计功能,可查询record_v2表中已删除数据量、一年前未删除数据量和总记录数;2.数据清理功能,可安全删除半年前标记为删除的数据。工具采用PostgreSQL驱动,实现连接池优化、事务处理和安全查询,通过参数化防止SQL注入,并设置超时控制。使用时需配置数据库连接信息,运行后将输出统计报表和清理结果,包括各类数据数量和成功清理的记录数。
2025-10-05 21:39:33
388
原创 Java开发者LLM实战——LangChain4j最新版教学知识库实战
LangChain4j是一个简化Java应用与大模型集成的框架,提供统一API支持15+大语言模型和20+嵌入模型。它具有以下核心功能:1) 支持多模型切换;2) 提供记忆对话功能;3) 实现工具调用(Tools)实现业务逻辑交互;4) 支持检索增强生成(RAG),通过文档解析、分块、向量化存入向量数据库;5) 支持多模型链式协作任务编排。框架支持JDK 17+,可独立使用或与Spring Boot集成,相比Spring AI更灵活但Spring生态集成稍弱。典型应用场景包括智能客服、知识问答等需要结合业务
2025-09-14 22:20:54
1891
1
原创 Spring 正在淘汰 @Autowired —— 你应该使用以下更现代的方法
Spring框架正逐步淡化@Autowired注解的使用,推荐改用构造函数注入方式。@Autowired存在运行时反射多、隐藏依赖关系、单元测试困难等问题,而构造函数注入能提供显式依赖关系、编译期检查和更好的可测试性。Spring 6+推荐使用显式构造函数注入或jakarta.inject.Inject注解,避免字段注入带来的设计问题。迁移建议包括利用IDE生成构造函数、final修饰字段和新项目统一采用构造函数注入。这种转变旨在推动更清晰、可维护的代码架构,符合现代Java开发趋势。
2025-09-03 14:57:28
1189
1
原创 从静态到智能:用函数式接口替代传统工具类
本文探讨了Java开发中从静态工具类向函数式接口的演进。传统静态工具类存在行为固定、难以测试等缺陷,而Java8引入的函数式接口(如Predicate、Function)通过Lambda表达式实现了动态规则切换、易测试性和灵活组合。文章通过验证器、输入处理流水线等实例展示了函数式编程的优势,并提供了渐进式迁移方案:保留旧方法→添加函数式版本→方法引用兼容→组合逻辑→最终替换。这种转变提升了代码的可维护性和扩展性,更符合现代Java开发理念。迁移过程中应分模块逐步实施,同时加强团队培训。
2025-09-02 20:59:39
1524
5
原创 spring security入门
SpringSecurity最适合需要复杂权限控制(RBAC)、多认证方式集成、OAuth2生态构建及高安全标准的企业级应用。对于微服务API保护,即使只有几个接口,也建议优先使用SpringSecurity的OAuth2资源服务器模块,通过JWT验证实现零代码安全防护。本教程演示了如何快速构建一个安全的REST API:配置无状态安全策略、创建JWT工具类、实现认证过滤器和API端点。测试表明,系统能有效区分公开/私有端点,并通过Token验证保护API访问。SpringSecurity为现代微服务提供了
2025-09-02 20:59:03
801
原创 构建高可用Agent状态管理API:Gin+GORM全流程解析
本文介绍了一个基于Go1.21+Gin1.9+GORM2.0+MySQL5.7+Docker的技术栈开发教程。主要内容包括:1)技术选型分析,突出Gin框架的高性能和GORM的简洁性;2)项目搭建过程,从模块初始化到关键配置;3)GORM模型设计最佳实践,包括MySQL5.7兼容方案;4)API实现细节,展示Gin路由、控制器和服务层逻辑;5)企业级增强功能,如错误处理和参数校验;6)测试策略,包含单元测试和集成测试;7)部署方案,提供Docker多阶段构建和监控配置。教程特别针对Java开发者转型Go开发
2025-08-24 13:50:54
562
原创 一文搞懂: PostgreSQL的FOR UPDATE SKIP LOCKED
PostgreSQL的FOR UPDATE SKIP LOCKED子句详解 FOR UPDATE SKIP LOCKED是PostgreSQL中用于高并发场景的行级锁机制。它由两部分组成:FOR UPDATE锁定查询到的行,SKIP LOCKED则跳过已被锁定的行,避免阻塞等待。该机制主要用于解决高并发系统中的锁竞争问题,典型应用是数据库任务队列的实现。 主要优势包括: 事务原子性:将作业处理与业务逻辑更新整合在单个ACID事务中 高并发性:多个工作进程可并行获取作业而不相互阻塞 架构简单性:复用现有数据库
2025-08-01 09:02:21
1339
原创 从惊艳到教训:Java Lambda 在真实生产环境的反思与最佳实践
摘要:Java Lambda表达式和StreamAPI带来的简洁性背后隐藏着严重的生产风险。本文基于两起真实事故:一是NullPointerException因Stream堆栈信息混乱导致定位困难;二是批处理作业因sorted()操作引发性能崩溃,测试显示Stream方案比传统循环慢15倍、内存高2.7倍。分析揭示了Stream在调试性、性能和可维护性上的三大挑战:堆栈失真、GC压力大、业务逻辑碎片化。建议在核心业务和高负载场景回归显式循环,提出分阶段处理、防御性编程等2025稳健编码原则,强调"
2025-08-01 08:59:04
1056
原创 写在 35 岁生日的时候
文章摘要:针对35岁程序员面临的职业倦怠、中年焦虑等问题,提出分阶段解决方案。首先3-6个月恢复期,重点改善睡眠健康,优化工作方式,建立学习微习惯;随后6-18个月提升期,专攻技术方向(云原生或大数据),开发AI项目,提升英语能力;最后18个月以上拓展期,规划职业跃迁。强调"整合"而非"叠加",通过健康管理、技术深化和AI赋能实现转型,建议从解决夜尿问题等具体行动入手,逐步重获工作掌控感和生活平衡。
2025-07-18 15:47:00
1003
原创 Spring Boot 响应统一封装实战:ResponseBodyAdvice深度解析
在构建RESTful API时,保持响应格式的一致性至关重要。Spring Boot提供了ResponseBodyAdvice接口,允许我们在控制器方法返回后统一处理响应体。本文将通过一个健康检查接口案例,展示如何通过自定义注解+响应处理器实现响应格式的标准化封装。
2025-07-01 10:05:46
717
原创 停止如此使用 @KafkaListener:一个被忽视的 Spring Boot 反模式
在Spring Boot中使用@KafkaListener注解可以快速实现Kafka消息的消费,但这种便捷性往往掩盖了生产环境中可能遇到的复杂问题。默认配置下,开发者可能忽视了错误处理、重试机制、偏移量提交、消息顺序和并发性等关键环节,这些疏忽可能导致严重的生产事故。本文深入探讨了这些潜在问题,并提出了构建健壮Kafka消费者的最佳实践,包括手动管理偏移量、智能重试策略、合理并发规划、保障消息顺序、健壮的反序列化处理、优雅应对再均衡以及全面的可观测性。通过这些措施,开发者可以确保Kafka消费者在生产环境中
2025-07-01 10:05:24
1232
原创 Flink 重启后事件被重复消费的原因与解决方案
Flink 是一个强大但“状态驱动”的系统,一切幂等、容错、精确语义的背后,都依赖 checkpoint 的精确控制和 Source/Sink 的协同。Flink 重启后并不是“理所当然”地继续执行,而是带着上一次 checkpoint 的记忆“穿越回来”继续工作。如果中间没有状态标记,事件自然可能被重复读取和处理。因此我们在实际使用 Flink 时,应从以下几个方面着手提高系统的鲁棒性:明确语义需求(Exactly-Once vs At-Least-Once);
2025-06-03 09:37:03
1415
原创 优化 Spring Boot API 性能:利用 GZIP 压缩处理大型有效载荷
本文讨论了如何通过启用GZIP压缩来优化大型有效载荷的响应时间。作者指出,即使在没有复杂逻辑或繁重数据库查询的情况下,返回大量数据的API(如包含10,000种产品的列表)仍可能因有效载荷过大而响应缓慢。通过在Spring Boot的application.properties中启用GZIP压缩,可以显著减少JSON等文本数据的传输大小,最多可减少90%。这种方法无需修改现有代码,且兼容不支持GZIP的客户端。作者还提供了实际应用案例,展示了启用压缩后API响应时间显著提升的效果,并建议在返回大型JSON或
2025-06-03 09:35:36
2267
2
原创 写给 Javaer 看的 Go Gin 教程
在国内,Gin 被广泛认为是使用最为广泛的 Go 语言 Web 开发框架。它以高性能和简洁的 API 设计而著称,特别适合构建高并发的服务。此外,Kratos 作为 B 站开源的微服务框架,也在国内拥有一定的用户基础,适用于构建复杂的分布式系统。其他流行的 Go 语言 Web 框架还包括 Beego、Echo 和 GoFrame 等,它们各自提供不同的特性,满足开发者的多样化需求。
2025-05-06 09:33:38
1494
原创 Kafka系列教程 - Kafka 存储 -6
Kafka 将消息存储为分区中的日志文件,每个日志文件包含了一系列的消息,并通过日志段(log segments)进行组织。消息按时间顺序存储:消息在分区内按照生产时间顺序写入,保证消息顺序性。持久化存储:消息被持久化到磁盘上,不会丢失,除非超出了保留策略。无锁高吞吐量写入:Kafka 使用内存和磁盘缓存,并通过顺序写入和零拷贝技术实现高吞吐量。文件日志分段:为了提高读取效率,Kafka 将日志分成多个固定大小的段,每个段都有一个索引。Kafka 存储模型Kafka 采用分区(Partition)
2025-05-06 09:31:18
799
原创 Kafka系列教程 - Kafka 流式处理 -7
在使用 Kafka Streams 时,需要关注状态管理、时间处理、容错性、性能优化和资源消耗等方面。理解和合理配置这些内容,能够有效地避免流处理过程中常见的问题,并确保应用的高效和稳定性。
2025-04-01 11:33:05
1091
1
原创 深入解析 Flink 批量插入 MariaDB 不生效问题
在使用 Flink 进行数据处理时,批量插入(batch insert)数据库是一种常见的优化策略,可以减少数据库压力,提高写入吞吐量。然而,近期在一个 Flink Job的升级过程 中,我们发现新的 job 老是无法实现数据插入到数据库中, 定位到设置时,数据并未插入数据库,而修改为后,数据却能立刻写入。为什么会这样呢?又该如何优化批量写入策略?我们对此进行深入探讨。
2025-03-06 14:22:09
1606
原创 Kafka系列教程 - Kafka 可靠传输 -5
更加通用的方法是,给数据增加一个版本号属性,每次更数据前,比较当前数据的版本号是否和消息中的版本号一致,如果不一致就拒绝更新数据,更新数据的同时将版本号 +1,一样可以实现幂等更新。需要注意的是,“检查消费状态,然后更新数据并且设置消费状态”中,三个操作必须作为一组操作保证原子性,才能真正实现幂等,否则就会出现 Bug。具体的实现方法是,在发送消息时,给每条消息指定一个全局唯一的 ID,消费时,先根据这个 ID 检查这条消息是否有被消费过,如果没有消费过,才更新数据,然后将消费状态置为已消费。
2025-03-03 11:21:53
1156
原创 Kafka系列教程 - Kafka 集群 -4
每个 Partition 都有一个 Leader,零个或多个 Follower。Leader 处理一切对 Partition (分区)的读写请求;而 Follower 只需被动的同步 Leader 上的数据。同一个 Topic 的不同 Partition 会分布在多个 Broker 上,而且一个 Partition 还会在其他的 Broker 上面进行备份。
2025-02-07 08:59:27
1706
原创 Kafka系列教程 - Kafka 消费者 -3
分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为分区再均衡(Rebalance)。Rebalance 实现了消费者群组的高可用性和伸缩性。Rebalance 本质上是一种协议,规定了一个 Consumer Group 下的所有 Consumer 如何达成一致,来分配订阅 Topic 的每个分区。比如某个 Group 下有 20 个 Consumer 实例,它订阅了一个具有 100 个分区的 Topic。正常情况下,Kafka 平均会为每个 Consumer 分配 5 个分区。
2025-01-02 09:46:35
1997
原创 Kafka系列教程 - Kafka 生产者 -2
Overridetry {// 使用 Jackson 序列化对象总结文本数据推荐使用。二进制数据直接使用。数值类型使用或。对于复杂的对象或自定义需求,可以自行实现序列化逻辑。选择合适的序列化器是确保消息高效传输和处理的关键。Kafka 的数据结构采用三级结构,即:主题(Topic)、分区(Partition)、消息(Record)。
2024-12-11 11:49:17
1930
原创 Kafka系列教程 - Kafka 快速入门 -1
官网定义:Apache Kafka是一个开源的分布式事件流式平台,被数千个公司用于高性能的数量管道,流式数据分析,数据集成和关键任务应用程序。Kafka由LinkedIn公司开发并于2011年早期开源,2012年10月23日从Apache Incubator毕业。
2024-12-02 09:31:40
1204
1
原创 编程和英语
对于咱们程序员来说,英语水平可以说是突破能力天花板的一个必选项。毕竟高级编程语言几乎都是英语的子集,不说本来就是欧美人设计的各种语言,就连日本人设计的 Ruby、巴西人设计的 Lua,它们的语法采用的也全都是英语。学好英语对学好编程的重要性可见一斑。
2024-11-05 18:21:18
703
原创 React18-useEffect函数
useEffect hook 简介钩子是一个函数,它可以让你在不编写ES6类的情况下使用状态和其他react特性。
2024-10-25 15:50:44
1177
原创 Grrenplum本地开发使用
数据准备(千万级别准备,数据分布尽量贴近真实,比如有的租户的数据量比较大,比如工作时间内的数据比较集中,非工作时间内的数据量比较少等,这么划分不一定完全准确仅供参考)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Greenplum自动根据create_time创建分区~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Greenplum的查询~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2024-10-03 21:40:11
990
原创 Java开发学习Kotlin 笔记
class A{} 等价于 final class A{} // 注意,则的`final`修饰符在编辑器中是灰色的,因为Kotlin中默认的类默认是final的。类内部的对象声明可以用 companion 关键字标记,这样它就与外部类关联在一起,我们就可以直接通过外部类访问到对象的内部元素。//Koltin要修改数据类的属性,则使用其独有的copy()函数。密封类的子类必须是在密封类的内部或必须存在于密封类的同一文件。OuterClass.companionFun()//调用伴生对象方法。
2024-09-03 17:28:51
930
原创 React组件之间通信
PropsContextPortalsRedux等十种方法,每种方法都有对应的适合它的场景,大家在设计自己的组件前,一定要好好考虑清楚采用哪种方式来解决通信问题。文初提到的那个小问题,最后我采用方案9,因为既然是小迭代项目,又是改别人的代码,当然最好避免对别人的代码进行太大幅度的改造。而pub/sub这种方式就挺小巧精致的,既不需要对别人的代码结构进行大改动,又可以满足产品需求。
2024-08-01 09:35:10
1555
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅