自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

长河的博客

一个不断前进的开发者

  • 博客(255)
  • 资源 (2)
  • 收藏
  • 关注

原创 Spring 正在淘汰 @Autowired —— 你应该使用以下更现代的方法

Spring框架正逐步淡化@Autowired注解的使用,推荐改用构造函数注入方式。@Autowired存在运行时反射多、隐藏依赖关系、单元测试困难等问题,而构造函数注入能提供显式依赖关系、编译期检查和更好的可测试性。Spring 6+推荐使用显式构造函数注入或jakarta.inject.Inject注解,避免字段注入带来的设计问题。迁移建议包括利用IDE生成构造函数、final修饰字段和新项目统一采用构造函数注入。这种转变旨在推动更清晰、可维护的代码架构,符合现代Java开发趋势。

2025-09-03 14:57:28 963 1

原创 从静态到智能:用函数式接口替代传统工具类

本文探讨了Java开发中从静态工具类向函数式接口的演进。传统静态工具类存在行为固定、难以测试等缺陷,而Java8引入的函数式接口(如Predicate、Function)通过Lambda表达式实现了动态规则切换、易测试性和灵活组合。文章通过验证器、输入处理流水线等实例展示了函数式编程的优势,并提供了渐进式迁移方案:保留旧方法→添加函数式版本→方法引用兼容→组合逻辑→最终替换。这种转变提升了代码的可维护性和扩展性,更符合现代Java开发理念。迁移过程中应分模块逐步实施,同时加强团队培训。

2025-09-02 20:59:39 1299 5

原创 spring security入门

SpringSecurity最适合需要复杂权限控制(RBAC)、多认证方式集成、OAuth2生态构建及高安全标准的企业级应用。对于微服务API保护,即使只有几个接口,也建议优先使用SpringSecurity的OAuth2资源服务器模块,通过JWT验证实现零代码安全防护。本教程演示了如何快速构建一个安全的REST API:配置无状态安全策略、创建JWT工具类、实现认证过滤器和API端点。测试表明,系统能有效区分公开/私有端点,并通过Token验证保护API访问。SpringSecurity为现代微服务提供了

2025-09-02 20:59:03 712

原创 构建高可用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 451

原创 一文搞懂: 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 845

原创 从惊艳到教训:Java Lambda 在真实生产环境的反思与最佳实践

摘要:Java Lambda表达式和StreamAPI带来的简洁性背后隐藏着严重的生产风险。本文基于两起真实事故:一是NullPointerException因Stream堆栈信息混乱导致定位困难;二是批处理作业因sorted()操作引发性能崩溃,测试显示Stream方案比传统循环慢15倍、内存高2.7倍。分析揭示了Stream在调试性、性能和可维护性上的三大挑战:堆栈失真、GC压力大、业务逻辑碎片化。建议在核心业务和高负载场景回归显式循环,提出分阶段处理、防御性编程等2025稳健编码原则,强调"

2025-08-01 08:59:04 924

原创 写在 35 岁生日的时候

文章摘要:针对35岁程序员面临的职业倦怠、中年焦虑等问题,提出分阶段解决方案。首先3-6个月恢复期,重点改善睡眠健康,优化工作方式,建立学习微习惯;随后6-18个月提升期,专攻技术方向(云原生或大数据),开发AI项目,提升英语能力;最后18个月以上拓展期,规划职业跃迁。强调"整合"而非"叠加",通过健康管理、技术深化和AI赋能实现转型,建议从解决夜尿问题等具体行动入手,逐步重获工作掌控感和生活平衡。

2025-07-18 15:47:00 795

原创 Spring Boot 响应统一封装实战:ResponseBodyAdvice深度解析

在构建RESTful API时,保持响应格式的一致性至关重要。Spring Boot提供了ResponseBodyAdvice接口,允许我们在控制器方法返回后统一处理响应体。本文将通过一个健康检查接口案例,展示如何通过自定义注解+响应处理器实现响应格式的标准化封装。

2025-07-01 10:05:46 501

原创 停止如此使用 @KafkaListener:一个被忽视的 Spring Boot 反模式

在Spring Boot中使用@KafkaListener注解可以快速实现Kafka消息的消费,但这种便捷性往往掩盖了生产环境中可能遇到的复杂问题。默认配置下,开发者可能忽视了错误处理、重试机制、偏移量提交、消息顺序和并发性等关键环节,这些疏忽可能导致严重的生产事故。本文深入探讨了这些潜在问题,并提出了构建健壮Kafka消费者的最佳实践,包括手动管理偏移量、智能重试策略、合理并发规划、保障消息顺序、健壮的反序列化处理、优雅应对再均衡以及全面的可观测性。通过这些措施,开发者可以确保Kafka消费者在生产环境中

2025-07-01 10:05:24 926

原创 Flink 重启后事件被重复消费的原因与解决方案

Flink 是一个强大但“状态驱动”的系统,一切幂等、容错、精确语义的背后,都依赖 checkpoint 的精确控制和 Source/Sink 的协同。Flink 重启后并不是“理所当然”地继续执行,而是带着上一次 checkpoint 的记忆“穿越回来”继续工作。如果中间没有状态标记,事件自然可能被重复读取和处理。因此我们在实际使用 Flink 时,应从以下几个方面着手提高系统的鲁棒性:明确语义需求(Exactly-Once vs At-Least-Once);

2025-06-03 09:37:03 1193

原创 优化 Spring Boot API 性能:利用 GZIP 压缩处理大型有效载荷

本文讨论了如何通过启用GZIP压缩来优化大型有效载荷的响应时间。作者指出,即使在没有复杂逻辑或繁重数据库查询的情况下,返回大量数据的API(如包含10,000种产品的列表)仍可能因有效载荷过大而响应缓慢。通过在Spring Boot的application.properties中启用GZIP压缩,可以显著减少JSON等文本数据的传输大小,最多可减少90%。这种方法无需修改现有代码,且兼容不支持GZIP的客户端。作者还提供了实际应用案例,展示了启用压缩后API响应时间显著提升的效果,并建议在返回大型JSON或

2025-06-03 09:35:36 1986 2

原创 写给 Javaer 看的 Go Gin 教程

在国内,Gin 被广泛认为是使用最为广泛的 Go 语言 Web 开发框架。它以高性能和简洁的 API 设计而著称,特别适合构建高并发的服务。此外,Kratos 作为 B 站开源的微服务框架,也在国内拥有一定的用户基础,适用于构建复杂的分布式系统。其他流行的 Go 语言 Web 框架还包括 Beego、Echo 和 GoFrame 等,它们各自提供不同的特性,满足开发者的多样化需求。

2025-05-06 09:33:38 1286

原创 Kafka系列教程 - Kafka 存储 -6

Kafka 将消息存储为分区中的日志文件,每个日志文件包含了一系列的消息,并通过日志段(log segments)进行组织。消息按时间顺序存储:消息在分区内按照生产时间顺序写入,保证消息顺序性。持久化存储:消息被持久化到磁盘上,不会丢失,除非超出了保留策略。无锁高吞吐量写入:Kafka 使用内存和磁盘缓存,并通过顺序写入和零拷贝技术实现高吞吐量。文件日志分段:为了提高读取效率,Kafka 将日志分成多个固定大小的段,每个段都有一个索引。Kafka 存储模型Kafka 采用分区(Partition)

2025-05-06 09:31:18 721

原创 Kafka系列教程 - Kafka 流式处理 -7

在使用 Kafka Streams 时,需要关注状态管理、时间处理、容错性、性能优化和资源消耗等方面。理解和合理配置这些内容,能够有效地避免流处理过程中常见的问题,并确保应用的高效和稳定性。

2025-04-01 11:33:05 898 1

原创 Kafka系列教程 - Kafka 运维 -8

现在您已经在您的机器上下载了最新版本的 Kafka。kafka运维.

2025-04-01 11:32:13 1384

原创 深入解析 Flink 批量插入 MariaDB 不生效问题

在使用 Flink 进行数据处理时,批量插入(batch insert)数据库是一种常见的优化策略,可以减少数据库压力,提高写入吞吐量。然而,近期在一个 Flink Job的升级过程 中,我们发现新的 job 老是无法实现数据插入到数据库中, 定位到设置时,数据并未插入数据库,而修改为后,数据却能立刻写入。为什么会这样呢?又该如何优化批量写入策略?我们对此进行深入探讨。

2025-03-06 14:22:09 1475

原创 Kafka系列教程 - Kafka 可靠传输 -5

更加通用的方法是,给数据增加一个版本号属性,每次更数据前,比较当前数据的版本号是否和消息中的版本号一致,如果不一致就拒绝更新数据,更新数据的同时将版本号 +1,一样可以实现幂等更新。需要注意的是,“检查消费状态,然后更新数据并且设置消费状态”中,三个操作必须作为一组操作保证原子性,才能真正实现幂等,否则就会出现 Bug。具体的实现方法是,在发送消息时,给每条消息指定一个全局唯一的 ID,消费时,先根据这个 ID 检查这条消息是否有被消费过,如果没有消费过,才更新数据,然后将消费状态置为已消费。

2025-03-03 11:21:53 868

原创 Kafka系列教程 - Kafka 集群 -4

每个 Partition 都有一个 Leader,零个或多个 Follower。Leader 处理一切对 Partition (分区)的读写请求;而 Follower 只需被动的同步 Leader 上的数据。同一个 Topic 的不同 Partition 会分布在多个 Broker 上,而且一个 Partition 还会在其他的 Broker 上面进行备份。

2025-02-07 08:59:27 1479

原创 Kafka系列教程 - Kafka 消费者 -3

分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为分区再均衡(Rebalance)。Rebalance 实现了消费者群组的高可用性和伸缩性。Rebalance 本质上是一种协议,规定了一个 Consumer Group 下的所有 Consumer 如何达成一致,来分配订阅 Topic 的每个分区。比如某个 Group 下有 20 个 Consumer 实例,它订阅了一个具有 100 个分区的 Topic。正常情况下,Kafka 平均会为每个 Consumer 分配 5 个分区。

2025-01-02 09:46:35 1747

原创 Kafka系列教程 - Kafka 生产者 -2

Overridetry {// 使用 Jackson 序列化对象总结文本数据推荐使用。二进制数据直接使用。数值类型使用或。对于复杂的对象或自定义需求,可以自行实现序列化逻辑。选择合适的序列化器是确保消息高效传输和处理的关键。Kafka 的数据结构采用三级结构,即:主题(Topic)、分区(Partition)、消息(Record)。

2024-12-11 11:49:17 1485

原创 Kafka系列教程 - Kafka 快速入门 -1

官网定义:Apache Kafka是一个开源的分布式事件流式平台,被数千个公司用于高性能的数量管道,流式数据分析,数据集成和关键任务应用程序。Kafka由LinkedIn公司开发并于2011年早期开源,2012年10月23日从Apache Incubator毕业。

2024-12-02 09:31:40 1056 1

原创 编程和英语

对于咱们程序员来说,英语水平可以说是突破能力天花板的一个必选项。毕竟高级编程语言几乎都是英语的子集,不说本来就是欧美人设计的各种语言,就连日本人设计的 Ruby、巴西人设计的 Lua,它们的语法采用的也全都是英语。学好英语对学好编程的重要性可见一斑。

2024-11-05 18:21:18 618

原创 React18-useEffect函数

useEffect hook 简介钩子是一个函数,它可以让你在不编写ES6类的情况下使用状态和其他react特性。

2024-10-25 15:50:44 1084

原创 Grrenplum本地开发使用

数据准备(千万级别准备,数据分布尽量贴近真实,比如有的租户的数据量比较大,比如工作时间内的数据比较集中,非工作时间内的数据量比较少等,这么划分不一定完全准确仅供参考)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Greenplum自动根据create_time创建分区~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Greenplum的查询~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2024-10-03 21:40:11 935

原创 Java开发学习Kotlin 笔记

class A{} 等价于 final class A{} // 注意,则的`final`修饰符在编辑器中是灰色的,因为Kotlin中默认的类默认是final的。类内部的对象声明可以用 companion 关键字标记,这样它就与外部类关联在一起,我们就可以直接通过外部类访问到对象的内部元素。//Koltin要修改数据类的属性,则使用其独有的copy()函数。密封类的子类必须是在密封类的内部或必须存在于密封类的同一文件。OuterClass.companionFun()//调用伴生对象方法。

2024-09-03 17:28:51 848

原创 React组件之间通信

PropsContextPortalsRedux等十种方法,每种方法都有对应的适合它的场景,大家在设计自己的组件前,一定要好好考虑清楚采用哪种方式来解决通信问题。文初提到的那个小问题,最后我采用方案9,因为既然是小迭代项目,又是改别人的代码,当然最好避免对别人的代码进行太大幅度的改造。而pub/sub这种方式就挺小巧精致的,既不需要对别人的代码结构进行大改动,又可以满足产品需求。

2024-08-01 09:35:10 1446

原创 写在34岁生日之时-随笔

短期目标:优先学习前端技术,成为全栈开发者,以获得更多职业选择的灵活性。长期目标:在继续工作的同时,逐步提升后端技术深度,确保在未来能够成为某一领域的技术专家。认证选择:根据自己的学习进度和预算,选择合适的认证进行考试,增加职场竞争力。希望这些建议对你有所帮助,祝你在职业发展中取得更大成功!短期目标:通过系统学习 React,掌握前端开发技能,成为全栈开发者。长期目标:在后端技术方面深入发展,成为微服务、高并发处理、分布式系统等领域的专家。具体计划。

2024-07-29 17:32:41 1232 2

原创 Jackson使用详解

Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一。Spring MVC 的默认 json 解析器便是 Jackson。Jackson 优点很多。Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;

2024-07-01 16:24:15 1362

原创 因为附件服务重启的问题

在使用容器时,我们应该始终使用 UseContainerSupport、InitialRAMPercentage、MinRAMPercentage 和 MaxRAMPercentage 而不是 Xmx & Xmn 来限制内存等资源。强烈建议将PRD中的最小荚数设置为大于1,否则,一旦遇到严重问题,API将完全无法对外开放,这将严重影响客户体验。需要定期检查pod的健康状态。如果前端没有遇到 503 错误,我们可能需要更多时间来确定问题。1.API报503,

2024-06-07 11:07:16 460

原创 SpringBoot web项目性能监控

用于获取 Java 应用程序的内存堆转储(heap dump)和线程转储(thread dump)。

2024-05-06 09:18:03 364

原创 提问的智慧-怎么提问

怎么提问

2024-04-02 10:38:45 1458

原创 SpringBoot2升级到SpringBoot3总结

我们这边的项目大多数都是Kotlin+SpringBoot2.X的技术栈,现在要全部升级到最新的SpringBoot3.2.2或者SpringBoot3.2.3,还是以Kotlin为主。最近公司在做监控日志平台的迁移,从NewRelic迁移到Dynatrace,为了配合迁移,有一个前提就是把SpringBoot2升级到SpringBoot3。首先做的第一件事:把JDK11升级到JDK17,以及把kotlin升级到1.9.21。注意查看升级后的驱动的依赖版本,注意出现不兼容的情况。等等,还有一些就不列举了。

2024-04-01 09:02:12 1547

原创 2.并发编程

文章迁移自语雀。并发编程2

2024-03-01 17:39:21 1087

原创 代码审查最佳实践与规则

当需要在现有项目中添加新代码时,应在主代码库(通常是 master/main/qa 分支)的基础上创建功能分支。这样,个人或团队就可以对新功能或任务进行开发,直到完成为止,并将他们的提交推送到这个不受保护的分支。开发完成后,就需要打开一个拉取请求(PR),将这些更改合并到主代码库中。这是为什么呢?因为代码审查必须由作者以外的人员执行,以检查源代码并查找问题,确保不良代码不会进入生产。此外,知识共享、提高安全性、降低开发成本和促进团队合作也是代码审查的好处。

2024-03-01 17:38:29 1128

原创 1.并发编程

并发编程

2024-02-02 10:34:56 860

原创 springboot使用 response 做文件下载, 图片预览

​​​​​​​这样就实现了功能。

2024-02-02 10:34:14 698

原创 Spring-IOC综述

说到spring的ioc,其实就是控制反转,为啥需要控制反转呢,其实是为了功能的增强,如果不用spring, 我们直接使用工厂方法,静态工厂方法, 都是是可以获取到对象的,但是如果需求变了,我们在类的生成时,添加了很多信息,使用工厂就不方便了,还有事务等需要统一的处理.一个典型的应用就是mybatis的接口,平时我们都是只需要写mybatis的接口,但是不写他的实现类,由spring生成一个代理的实现类,来进行方法的调用.对于事务的调用,在service上添加了事务,需要调用dao进行统一的控制.所以需要一

2024-01-02 09:42:32 1155

原创 Spring-AOP综述

Pointcut("execution(* com.chenss.dao.*.*(java.lang.String))")//匹配com.chenss.dao包下的任意接口和类的只有一个参数,且参数为String类型的方法。@Pointcut("execution(* com.chenss.dao.*.*(java.lang.String))")//匹配com.chenss.dao包下的任意接口和类的只有一个参数,且参数为String类型的方法。并扩充实现了proceed()方法,用于继续执行连接点。

2024-01-02 09:41:59 980

原创 Spring源码编译

Spring源码编译

2023-12-04 10:05:28 908

原创 Spring源码解析1

去读加了注解的类 和扫描的.在看第二行代码register**()**;这个其实就是把这个配置类注册到了spring中, 当然了这里也可以放一个普通的对象, 例如放一个UserDaoImpl.class, 也是可以注册到spring中去的, 当然了, 这里注册配置类和普通类的过程有些区别, 主要是涉及到对注解的处理, 过滤过程,再就是下一行代码refresh**()**;这一行代码很重要, 这是在初始化spring的环境,加载Spring中配置的6个类.

2023-12-04 10:05:20 930

Java系统分布式缓存PPT

Java系统分布式缓存PPT

2022-04-06

UML基础与Rose建模教程-GOOG.pdf

UML基础与Rose建模教程.pdf,非常好的文档教程

2019-06-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除