程序员
文章平均质量分 88
程序员托尼
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
在Spring Boot 中使用 JSON Schem实现复杂对象、可变结构参数校验!
假设业务要求用户名在同一租户内唯一,这属于跨记录的业务规则,JSON Schema 本身不提供此类校验。我们可以通过自定义关键字来实现。/** 自定义关键字工厂 */@Component@Override@Override/** 关键字实现类 */@Override// 这里的 node 为待校验的字段值(如 username)// 假设有一个租户 ID 已经在上下文中获取// 调用业务服务检查唯一性(这里用伪代码演示)原创 2025-11-20 21:49:20 · 551 阅读 · 0 评论 -
Spring 官宣正式弃用 RestTemplate
并在后续版本中逐步移除。这意味着伴随开发者十余年的经典 HTTP 客户端,终于要走向历史舞台的终点。原创 2025-11-20 21:48:47 · 490 阅读 · 0 评论 -
Spring + asyncTool:实现复杂任务的优雅编排与高效执行
EnableAsync // 开启线程池@Autowired@Bean// 核心线程池大小// 最大线程数// 队列容量// 活跃时间// 线程名字前缀// 拒绝策略。原创 2025-11-20 21:48:15 · 413 阅读 · 0 评论 -
Java泛型:T、E、K、V、?,你还在傻傻分不清?
在Java后端开发中,你一定在写集合类或工具类时,见过 T、E、K、V、?这样的泛型通配符。但你是否有过以下疑惑:• T、E、K、V 到底有什么区别?为什么大家都用这些字母?•List<?和 List 有什么不同?什么时候该用通配符,什么时候该用类型参数?• 如果不用泛型,代码也能跑,为什么一定要用泛型?原创 2025-11-20 21:47:34 · 961 阅读 · 0 评论 -
Redis 磁盘 I/O 阻塞导致连接超时问题复盘!
某日上午,生产环境监控系统触发大量告警,显示系统接口响应超时率异常升高。本次Redis连接超时问题的成功解决,充分体现了系统性问题排查方法的重要性。通过深入的日志分析、指标诊断和配置审查,我们准确定位了磁盘I/O阻塞这一根本原因,并制定了针对性的优化方案。这次经历提醒我们,在分布式系统中,性能问题往往涉及多个层面的交互。Redis作为内存数据库,其性能不仅取决于内存和网络,持久化机制对磁盘I/O的依赖同样不可忽视。只有建立全面的监控体系,深入理解各组件的工作原理,才能在问题发生时快速定位并有效解决。原创 2025-11-20 21:46:55 · 894 阅读 · 0 评论 -
Java 25 发布:更简洁、更高效、更现代!
Java 25 的核心方向:•模式匹配、紧凑源码、灵活构造器、Record•结构化并发、Scoped Values、Stable Values•向量 API、紧凑对象头、Shenandoah GC、AOT•JFR、性能分析工具增强对新手来说,这些改进让 Java 更容易入门,也更现代化;对老手,提升了开发效率、性能和安全性。原创 2025-11-20 21:46:25 · 804 阅读 · 0 评论 -
玩点新花样,Java与Wasm的集成开发!
WebAssembly(Wasm)是一种由W3C标准化(2019年)的低级二进制格式,设计目标是高效、安全、可移植。其核心特性:•高性能:接近原生速度,优于JavaScript。•跨平台:支持浏览器、服务器、嵌入式设备。•安全沙箱:隔离执行环境,防止恶意代码。•多语言支持:C/C++、Rust、Java等可编译为Wasm。Wasm应用场景:•Web前端:高性能计算(如游戏、图像处理)。•服务器端:轻量微服务、FaaS(如AWS Lambda)。•边缘计算:低延迟IoT应用。•区块链。原创 2025-11-20 21:45:48 · 777 阅读 · 0 评论 -
彻底爆了!一文吃透AIGC、Agent、MCP的概念和关系
近两年 AI 技术发展迅猛,日新月异。大语言模型 (LLM)、AIGC、多模态、RAG、Agent、MCP 等各种相关概念层出不穷,若不深入了解,极易混淆。本文旨在简要介绍这些 AI 技术的核心概念、基本原理及其相互关系,主要帮助非 AI 行业的开发者建立基础认知。文中涉及的每项技术在其垂直领域都值得深入探索,本文仅作概念性和原理性的概述。如有疏漏或错误,欢迎指正。近年来,人工智能领域涌现出许多新概念和新技术,其中AIGC、MCP和Agent成为了业界和学术界的热门话题。本文将深入浅出地介绍这三个概念,帮助原创 2025-11-06 21:54:12 · 558 阅读 · 0 评论 -
Kafka为何支持每秒上百万的高并发写入?架构是怎样的?
Kafka 通过无锁轻量级 offset 的设计,实现了高性能、高吞吐和低延时的目标。其 Reactor I/O 网络模型、磁盘顺序写入、内存映射文件、零拷贝、数据压缩和批量处理等技术,为 Kafka 提供了强大的数据处理能力和高效的消息队列服务。Reactor I/O 网络模型:通过 I/O 多路复用机制,Kafka 能够同时处理大量的网络连接请求,而不需要为每个连接创建一个线程,从而节省了系统资源。顺序写入。原创 2025-11-06 21:53:05 · 1005 阅读 · 0 评论 -
聊聊 RocketMQ 4.X 知识体系?
本文将带您深入了解 RocketMQ 4.X 的核心知识体系,从架构设计到关键机制,一探这款高可用消息中间件的底层逻辑。原创 2025-11-06 21:51:54 · 744 阅读 · 0 评论 -
聊聊四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE!
特性短轮询长轮询SSEWebSocket协议HTTPHTTPHTTPWebSocket(基于TCP)实时性低中高极高资源消耗高(频繁请求)中(挂起连接)低低(长连接)选择建议需要简单兼容性→ 短轮询需要中等实时性→ 长轮询只需服务器推送→ SSE需要全双工实时交互。原创 2025-11-06 21:51:02 · 548 阅读 · 0 评论 -
MyBatis拦截器在服务内存防护场景中的应用?
MyBatis拦截器采用动态代理模式,在SQL执行关键节点插入自定义逻辑(比如修改 SQL、处理参数、包装结果等), 在不破坏原有代码结构的前提下,对 MyBatis 的核心流程进行改造。核心原理:4大对象 + 拦截器链一个拦截器从定义到生效,需要经历三个关键阶段:定义阶段:通过和@Signature注解声明拦截目标注册阶段:在MyBatis配置文件中配置拦截器执行阶段:当目标方法被调用时,拦截器链按顺序执行拦截逻辑// 统一Histogram指标.help("SQL执行综合统计")原创 2025-11-06 21:50:31 · 561 阅读 · 0 评论 -
如何去阅读源码?我总结了18条心法!
当我们在读完一个类的代码的时候,一定要总结这个类的职责,明白这个类存在的意义。一般情况下一个类核心职责只有一个,遵循单一职责的设计原则。举个例子,在RocketMQ中有一个类MQClientAPIImpl。原创 2025-11-04 21:54:37 · 472 阅读 · 0 评论 -
20张图剖析Spring启动时核心的12个步骤!
这里再来简单回顾一下Spring启动大致的几个过程最开始的准备操作,这部分就是准备一些配置属性相关的之后连续好几个方法都是准备BeanFactory的,我把上面那张图拿过来整个准备BeanFactory过程大致如下:先配置BeanFactory通过ConfigurationClassPostProcessor加载Bean到BeanFactory中从上一步加载的Bean中获取BeanFactoryPostProcessor,完成对BeanFactory做自定义处理。原创 2025-11-04 21:53:14 · 848 阅读 · 0 评论 -
盘点Spring 9大核心基础功能!
本节主要讲了实现IOC的几个核心的组件BeanFactory及其接口体系:BeanDefinition及其相关组件:BeanDefinitionReader和ClassPathBeanDefinitionScanner:读取资源,生成BeanDefinitionBeanDefinitionRegistry:存储BeanDefinitionBeanFactory核心实现:DefaultListableBeanFactory:IOC容器,同时实现了BeanDefinitionRegistry接口。原创 2025-11-04 21:52:22 · 687 阅读 · 0 评论 -
探秘SpringCloud配置中心的核心原理!
到这我们就弄明白了在项目启动中加载配置中心的配置了其实就是项目在启动时会额外创建一个跟配置中心相关的Spring容器这个容器会去加载bootstrap配置文件和所有的spring.factories中的键为对应的配置类之后会去调用这个容器中所有的PropertySourceLocator对象,从配置中心获取配置再放到Environment中就完成了启动时从配置中心获取配置的方式最后,来张全家福概括一下前面整体的步骤其实到这就弄明白了Bean的属性动态刷新的原理。原创 2025-11-04 21:50:31 · 601 阅读 · 0 评论 -
看一遍就理解:零拷贝详解!
零拷贝字面上的意思包括两个,“零”和“拷贝”:“拷贝”:就是指数据从一个存储区域转移到另一个存储区域。“零” :表示次数为0,它表示拷贝数据的次数为0。合起来,那零拷贝就是不需要将数据从一个存储区域复制到另一个存储区域咯。零拷贝是指计算机执行IO操作时,CPU不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及CPU的拷贝时间。它是一种I/O操作优化技术。如果进程运行于内核空间,被称为进程的内核态如果进程运行于用户空间,被称为进程的用户态。什么是CPU上下文?原创 2025-11-03 21:51:47 · 252 阅读 · 0 评论 -
Spring依赖注入Bean类型的8种情况??
到这Spring能够注入的Bean的8种类型就讲完了,其实这8种类型可以分为以下几种功能:单一注入,就是注入一个单一的对象集合注入,可以注入数组或者集合延迟注入,比如@Lazy、ObjectFactory、ObjectProvider、JSR-330 Provider安全注入,不存在不会抛异常,比如Optional、ObjectProvider这几种方式并不是互斥的,比如说延迟注入也可以注入的是一个集合,前面举的MyBaisPlus自动装配时ObjectProvider的使用就是很好的例子。原创 2025-11-03 21:50:32 · 329 阅读 · 0 评论 -
MySQL中,21个写SQL的好习惯!!!
NOT NULL列更节省空间」,NULL列需要一个额外字节作为判断是否为 NULL 的标志位。「NULL列需要注意空指针问题」,NULL列在计算和比较的时候,需要注意空指针问题。原创 2025-11-03 21:46:32 · 578 阅读 · 0 评论 -
Java日常开发的21个坑,你踩过几个?
try {try {//这里有问题//这里有问题exceptionTwo抛出的异常,很可能是 exceptionOne的异常哦。正确使用方法,应该是new 一个出来。throw new BusinessException("业务异常", 0001);原创 2025-11-03 21:45:51 · 612 阅读 · 0 评论 -
放弃老旧的Mybatis,强类型替换字符串,这款ORM框架很强!!!
转java后的几年时间里面一直在寻找一个类.net的orm,不需要很特别的功能,仅希望90%的场景都可以通过强类型语法来编写符合直觉的sql来操作数据库编写业务。但是一直没有找到,Mybatis-Plus的单表让我在最初的时间段内看到了希望,不过随着使用的深入越发的发现Mybatis-Plus只是一个残缺的orm。因为大部分场景不支持表达式或者强类型会导致它本身的很多特性都无法使用。比如你配置了软删除,如果你遇到了join,不好意思软删除你需要自己处理。原创 2025-11-03 21:45:07 · 348 阅读 · 0 评论 -
mysql查询 limit 1000,10 和limit 10 速度一样快吗?如果我要分页,我该怎么办?
比limit size要慢,且offset的值越大,sql的执行速度越慢。当offset过大,会引发深度分页问题,目前不管是mysql还是es都没有很好的方法去解决这个问题。只能通过限制查询数量或分批获取的方式进行规避。遇到深度分页的问题,多思考其原始需求,大部分时候是不应该出现深度分页的场景的,必要时多去影响产品经理。如果数据量很少,比如1k的量级,且长期不太可能有巨大的增长,还是用的方案吧,整挺好,能用就行。原创 2025-11-02 21:41:48 · 344 阅读 · 0 评论 -
分库分表的 21 条法则,hold 住!
本文介绍了关于分库分表架构的21个通用概念,有一定的了解之后,接下来我们将进入更深度的内容,包括读写分离数据脱敏分布式主键分布式事务配置中心注册中心Proxy服务等实战案例的讲解和源码分析。原创 2025-11-02 21:40:29 · 383 阅读 · 0 评论 -
接口请求重试的8种方法,你用哪种?
如果说我们不想在项目里额外地引入一些重试的框架,自己定义一个重试工具类也是可以的,这是我在某个第三方提供的client-sdk里发现的一套重试工具类,比较轻量级,给大家分享一下。首先,定义一个实现了Callback抽象类的具体回调类,实现其中的方法来执行需要重试的逻辑。回调类的方法返回一个对象,表示重试的结果。然后,定义一个类,用于封装重试的结果。类包含一个isRetry属性表示是否需要进行重试,以及一个obj属性表示重试的结果对象。// 构造方法和getter方法省略最后,定义一个。原创 2025-11-02 21:39:13 · 378 阅读 · 0 评论 -
Spring Boot 封装一个万能 Excel 导出工具,传什么都能导出!
如题,这个小玩意,就是不限制你查的是哪张表,用的是什么类。我直接一把梭,嘎嘎给你一顿导出。我知道,这是很多人都想过的, 至少我就收到很多人问过我这个类似的问题。我也跟他们说了,但是他们就是不动手,其实真的很简单。不动手怎么办?我出手呗。不多说开搞。玩法很简单,我之前有写过一篇利用csv文件内容格式做excel文件导出的。如果没有看过的,还等什么,现在就去看看:SpringBoot 那年我双手插兜,手写一个excel导出要实现的效果 :类是不确定的 ,User?Student?原创 2025-11-02 21:38:21 · 257 阅读 · 0 评论 -
8000字 + 25图探秘Xxl-Job核心架构原理
最后我从官网捞了一张Xxl-Job架构图奈何作者不更新呐,导致这个图稍微有点老了,有点跟现有的架构对不上比如说图中的自研RPC(xxl-rpc)部分已经替换成了Http协议,这主要是拥抱生态,方便跨语言接入但是不要紧,大体还是符合现在的整个的架构从架构图中也可以看出来,本文除了日志部分的内容没有提到,其它的整个核心逻辑基本上都讲到了而日志部分其实是个辅助的作用,让你更方便查看任务的运行情况,对任务的触发逻辑是没有影响的,所以就没讲了。原创 2025-11-02 21:37:21 · 349 阅读 · 0 评论 -
SpringCloud 远程调用为啥要采用HTTP,而不是RPC?
关于SpringCloud远程调用采用HTTP而非RPC。首先SpringCloud开启Web服务依赖于内部封装的Tomcat容器,而今信息飞速发展,适应大流量的微服务,采用Tomcat处理HTTP请求,开发者编写Json作为资源传输,服务器做出相应的响应,可以更加的灵活处理业务数据,而HTTP协议是跨平台的,符合微服务B/C数据交互的方式,可以的一套服务器对应移动H5、App、小程序提供服务。RPC基于TCP协议,客服端与服务端需要进行三次握手完成可靠连接,第四步进行数据传输。原创 2025-11-02 21:36:03 · 404 阅读 · 0 评论 -
面试被问:OOM类型有哪些?怎么答?
OOM 的根本原因是JVM 内存区域不足或资源耗尽,需结合错误类型分析具体内存区域(堆、元空间、直接内存等)。排查时可通过以下步骤:1、确定 OOM 类型(通过错误日志)。2、使用工具分析(如jstatjmapVisualVMMAT3、调整 JVM 参数或优化代码逻辑。JAVA面试:Java八股文+Java涨薪场景题+Java互联网大厂真题(含答案)原创 2025-10-31 19:47:09 · 479 阅读 · 0 评论 -
面试官问:你写代码会复用公共 SQL 么?
我告诉面试官:“是的,我在开发中经常会复用公共SQL,尤其是在Java后端项目中。我通常会结合具体的业务场景和框架特性来实现,比如使用MyBatis这样的ORM框架,或者通过自定义工具类来管理公共SQL片段。最后,我总结道:“在Java后端开发中,复用公共SQL是一个很实用的习惯。面试官听完点了点头,似乎对我的回答还挺满意。如果项目中不完全依赖MyBatis,或者有些SQL是直接通过JDBC执行的,我会用Java的常量类来管理公共SQL片段。有时候,SQL的复用不仅仅是字段列表,还可能是复杂的条件逻辑。原创 2025-10-31 19:44:02 · 240 阅读 · 0 评论 -
万字聊一聊RocketMQ一条消息短暂而又精彩的一生
为了更好地理解本文,这里再来总结一下RokcetMQ消息一生的各个环节。原创 2025-10-31 19:30:30 · 294 阅读 · 0 评论 -
美团一面:RocketMQ消费者消费的时候,宕机了,消息会丢失吗?
最近一位朋友去美团面试,问了这么一道题: RocketMQ消费者消费的时候,宕机了,消息会丢失吗?一个消息从,主要经过这3个过程:因此,本文将从以下这几个维度来回答:生产者如何保证不丢消息存储端如何保证不丢消息消费者如何保证不丢消息最后消费者消费的时候,宕机,消息会不会丢呢?原创 2025-10-30 21:41:19 · 369 阅读 · 0 评论 -
不要再封装各种 Util 工具类了,这个神级框架值得拥有!
今天给大家推荐一个非常好用的Java工具类库,企业级常用工具类,基本都有,能避免重复造轮子及节省大量的开发时间,非常不错,值得大家去了解使用。谐音 “糊涂”,寓意追求 “万事都作糊涂观,无所谓失,无所谓得” 的境界。Hutool 是一个 Java 工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让 Java 语言也可以 “甜甜的”。原创 2025-10-30 21:40:28 · 260 阅读 · 0 评论 -
字节校招一面:聊聊https 原理!
有位朋友校招面试了字节的后端岗位,问到这道面试题:https 原理。这道题其实比较简单,我们如何更好地回答呢?我来跟大家聊聊。可以从这几个维度逐层扩展来讲http为什么不安全?对称算法加密+HTTP非对称加密+HTTP非对称加密+对称加密+HTTP数字签名,给你的公钥盖个章完整的HTTPS运行流程图我们先来看看HTTP传输:客户端,把一条消息,以明文的方式,发送到服务器。服务的响应报文,也是以明文的方式,发回给客户端。Http 明文传输,主要有这些缺点:窃听风险、篡改风险、冒充风险既然,明文传输不安全,那我原创 2025-10-30 21:39:55 · 253 阅读 · 0 评论 -
盘点 Mybatis 使用过程中遇到的坑!
学会查看分析异常栈,可以为我们工作大大提高效率,希望这篇文章给大家带来收获,最后再送给大家一个小技巧。异常栈不仅仅可以用来排查异常哦,还可以帮助大家学习源码,debug 源码找不到入口怎么办,那就创造一个异常!原创 2025-10-30 21:37:37 · 407 阅读 · 0 评论 -
如何设计一个秒杀系统?
最近有位星球好友问我,如何从整体角度,去设计一个秒杀系统。秒杀系统主要有这几个特征:瞬时间的流量特别高。过了秒杀的时间,流量就会瞬时结束大批量用户同时请求极少数商品在秒杀时间前,可能会有很多请求过来。比如在11点抢票开始,10点59分你可能会提前去刷新页面请求。所以特意写篇文章给大家说说。原创 2025-10-29 21:58:56 · 338 阅读 · 0 评论 -
Feign如何设置超时时间,不同情况下还真不一样!
今天给大家扒了扒在不同使用条件下Feign的超时时间设置,总结起来大致如下:单独使用Feign时:通过和方法参数SpringCloud环境下单独使用Feign:方法参数、配置文件、声明OptionsBean跟Ribbon配合使用:通过Ribbon的超时参数设置跟Hystrix配合使用:修改默认的超时时间,尽量符合 Hystrix超时时间 >= (连接超时时间 + 读超时时间) * 重试次数。原创 2025-10-29 21:56:54 · 636 阅读 · 0 评论 -
SpringBoot接口防抖(防重复提交)的一些实现方案
设置额外选项:过期时间和SET_IF_ABSENT选项”,有些同学可能不太清楚SET_IF_ABSENT是个啥,这里我解释一下:SET_IF_ABSENT是 RedisStringCommands.SetOption 枚举类中的一个选项,用于在执行 SET 命令时设置键值对的时候,如果键不存在则进行设置,如果键已经存在,则不进行设置。从测试的结果上看,防抖是做到了,但是随着缓存消失、锁失效,还是可以发起同样的请求,所以要真正做到接口幂等性,还需要业务代码的判断、设置数据库表的UK索引等操作。原创 2025-10-29 21:55:31 · 300 阅读 · 0 评论 -
为什么说 Zookeeper 不适合做服务注册中心?
综上所述,尽管Zookeeper是一个强大且成熟的分布式协调服务,但它并不是为了做服务注册中心而设计的。在选择服务注册中心时,需要考虑到具体的需求和场景,并选择最适合的解决方案。对于大规模、高性能的服务注册中心场景,可以考虑使用其他专门为服务注册中心设计的工具,如Nacos,而不是基于Zookeeper进行额外的配置和开发。这样可以提高系统的稳定性、性能和开发效率,从而更好地支持微服务架构的发展。原创 2025-10-29 21:49:09 · 286 阅读 · 0 评论 -
把 Spring Boot 项目从 18.18M 瘦身到 0.18M,部署超级快!
SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼:编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud等),那就更大了。这个时候如果想要对线上运行工程有一些微调,则非常痛苦。原创 2025-10-29 21:48:31 · 232 阅读 · 0 评论 -
阿里二面:听说过 HashMap 会导致CPU飙升100%吗?
一、问题描述经常有些面试官会问,关于这个问题,很多年前,在淘宝内网里就有很多的程序员发过这种帖子说,并且这个事发生了很多次。虽然 Java 官方明确表示,在多线程环境下不推荐使用 HashMap,但是对于这种问题,小编其实也比较意外,如果不是深入的去了解 HashMap,都不知道有这样的问题。为什么会产生死循环呢?下面我们来还原一下问题的经过。原创 2025-10-29 21:47:52 · 252 阅读 · 0 评论
分享