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