- 博客(60)
- 收藏
- 关注
原创 Spring & Spring Boot 架构设计与最佳实践面试题
监控告警:基于 Metrics+Logging+Tracing 构建可观测体系,通过「告警定位范围→链路锁定节点→日志获取详情→交叉验证修复」实现快速排查。Spring AOP 解耦:通过「切面 + 注解」封装日志、权限、校验等非业务逻辑,实现业务与非业务代码分离,提高复用性。灾备架构:采用「同城多机房 + 跨区域部署」,数据层实时同步,应用层无状态设计,调度层自动切换,确保 RTO/RPO 达标。
2025-12-30 14:19:40
282
原创 Spring Boot核心原理与架构设计面试题
系列注解是 Spring Boot 自动配置的 “开关控制” 核心,用于判断自动配置类 / Bean 是否满足生效条件,只有当条件满足时,对应的配置类 / Bean 才会被初始化到容器中。其核心价值是实现 “按需装配”,避免无用组件的初始化,减少资源占用,提升系统灵活性。当 Spring Boot 内置的系列注解无法满足业务需求时(如判断指定服务是否可用、判断数据库是否连接正常),可通过「自定义注解 + 自定义Condition以 “判断配置文件中是否存在指定前缀的属性” 为例:java运行。
2025-12-30 14:18:59
468
原创 Spring 核心原理面试题
和是 Spring 提供的两大核心扩展接口,用于对 IOC 容器和 Bean 进行自定义增强,二者在执行时机、执行顺序、功能定位上存在本质区别,是 Spring 框架灵活性的重要体现。通过实现步骤 1:自定义 BeanFactoryPostProcessor// 实现 BeanFactoryPostProcessor 接口,无需实现排序接口(默认最低优先级)@Component@Override// 1. 获取指定 Bean 的 BeanDefinition。
2025-12-29 20:50:57
882
原创 RabbitMQ Java Client源码解析——FrameHandler
要想知道有哪些类型的FrameHandler,主要是看对应的FrameHandlerFactory子类即可,根据使用的通信方式分成NettyFrameHandlerFactory、SocketChannelFrameHandlerFactory和SocketChannelFrameHandlerFactory。实现类必须是线程安全的,确保帧不会交错读写。在NettyFrameHandlerFactory类中,创建FrameHandler是构建NettyFrameHandler实例来实现的。
2025-12-24 18:26:07
256
原创 Dubbo注册中心故障深度解析:Provider与Consumer全行为链路
注册中心作为Dubbo微服务架构的核心组件,其故障影响范围广,但通过Dubbo的“本地缓存+长连接复用”核心设计,以及Provider/Consumer侧的容错、兜底优化,可最大限度降低故障影响。本文通过对注册中心故障分类、Provider与Consumer完整行为链路的深度解析,结合大厂高可用实践,给出了全流程的治理方案,核心结论如下:注册中心故障的核心影响边界是“新服务注册、新Consumer订阅、状态动态变更”,不影响已建立连接的服务调用,这是Dubbo高可用的核心基础。
2025-12-23 23:17:45
847
原创 RabbitMQ Java Client源码解析——ConnectionFactory和Connection
下面通过一段 Java 代码示例,展示如何基于 RabbitMQ 搭建一个简单的消息队列系统,并进行消息的收发操作。在上述生产者代码中,首先创建了一个ConnectionFactory,并设置了 RabbitMQ 服务器的地址为本地localhost。然后通过ConnectionFactory创建了一个Connection,并在该连接上创建了一个Channel。接着使用channel.queueDeclare方法声明了一个队列,如果队列不存在则会创建。
2025-12-23 21:04:56
674
原创 线程池参数怎么配置?大厂是如何解决的?
定类型:区分任务是 CPU/IO/ 混合密集型,用公式锚定 corePoolSize 初始值;配队列:使用有界队列,计算合理容量,避免无界队列;设拒绝:自定义拒绝策略,优先保证任务不丢失 + 可重试;加监控:埋点核心指标,实时监控线程池和系统状态;动态调:通过配置中心动态调整参数,适配业务变化;做隔离:按业务拆分线程池,避免雪崩;兜底策:超时控制 + 熔断降级,保证服务稳定性。没有最优配置,只有适配配置。
2025-12-22 15:52:36
894
原创 MySQL InnoDB 事务隔离与 MVCC、版本链与 ReadView 原理详解
面试官在问 MVCC 的时候,都是直接问你这几个问题。你是否了解 MVCC?MVCC 是什么?MySQL 的 InnoDB 引擎是怎么控制数据并发访问的?当一个线程在修改数据的时候,另外一个线程还能不能读到数据?为什么要调整为已提交读?主要原因有两个:一是因为业务用不上,二是为了提升性能。这时候你就要简明扼要地把原理解释清楚。按照基本定义、实现机制、隔离级别的逻辑顺序来回答。MVCC 是 MySQL InnoDB 引擎用于控制数据并发访问的协议。MVCC 主要是借助于版本链来实现的。
2025-12-20 21:10:08
886
原创 高并发、高可用、高性能系统架构设计方案(万字详解版)
同时,优先使用缓存技术提升数据访问效率,减少对底层存储系统的访问压力,从而提升系统的整体性能。在实际的系统架构设计中,存在两种常见的误区:一是过度设计,为了追求技术的先进性和架构的完整性,在业务初期就设计复杂的分布式架构、微服务架构,导致系统建设成本高、运维复杂度大、开发效率低,无法快速响应业务需求;同时,通过将系统划分为多个独立的故障域(如不同的机房、不同的服务器集群、不同的业务模块),每个故障域内的组件独立运行,故障域之间通过标准化的接口进行通信,确保单个故障域内的故障不会影响其他故障域的正常运行。
2025-12-20 12:32:22
782
原创 高并发、高可用、高性能系统架构设计方案(简版)
高并发:突破单机性能瓶颈,实现系统处理能力的规模化扩展,支撑海量用户同时访问与请求处理。高性能:缩短请求响应时间(RT),提升单位时间内请求处理量(吞吐量),保障用户操作体验流畅。高可用:通过容错设计与故障应对机制,减少系统不可用时间,确保核心业务持续稳定服务。
2025-12-20 11:37:44
793
原创 分布式事务的解决方案
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器。一个大的操作由N多的小的操作共同完成。而这些小的操作又分布在不同的服务上。针对于这些操作,。原子性一致性隔离性(isolation,又称独立性)以及持久性这就是事务的ACID原则。
2025-12-20 10:56:31
646
原创 MySQL面试题
相信大家小时候学习汉字的时候都会查字典,想想你查字典的步骤,我们是通过汉字的首字母 a~z 一个一个在字典目录中查找,最终找到该字的页数。想想,如果没有目录会怎么样,最差的结果是你有可能翻到字典的最后一页才找到你想要找的字。索引就「相当于我们字典中的目录」,可以极大的提高我们在数据库的查询效率。回表就是先通过数据库索引扫描出该索引树中数据所在的行,取到主键 id,再通过主键 id 取出主键索引数中的数据,即基于非主键索引的查询需要多扫描一棵索引树.
2025-12-19 17:06:57
696
转载 JVM调优面试
Java中「「Stop-The-World机制简称 STW」」 ,是在执行垃圾收集算法时,Java 应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。「Java 中一种全局暂停现象,全局停顿」,所有 Java 代码停止,native 代码可以执行,但不能与 JVM 交互。从线程角度看,安全点可以理解成是在「「代码执行过程中」」的一些「「特殊位置」」,当线程执行到这些位置的时候,说明「「虚拟机当前的状态是安全」」的。比如:「「方法调用、循环跳转、异常跳转等这些地方才会产生安全点」
2025-12-16 16:14:16
13
原创 什么是软件架构?软件架构如何演进?
系统架构(System Architecture) 是描述单个或多个系统整体结构的设计蓝图,定义了系统的组件划分、部署策略、交互方式以及非功能性需求(性能、可用性、可扩展性...)。系统架构通过集群实现资源聚合与高可用,借助分布式提升容错与扩展性,并依托弹性机制动态适应变化。其核心目标是通过结构化设计实现系统功能的高效运行、资源的灵活调度以及对外部环境变化的动态适应能力。系统的主要模块(如服务、模块、数据库)。模块之间的关系(模块间如何通信、数据流以什么协议传递)。
2025-06-29 11:26:39
1220
原创 监控平台——SkyWalking部署
先下载SkyWalking安装包,需要注意的是SkyWalking 版本在10.X以上使用的nacos-client是2.X,如果安装的Nacos版本是1.X就会存在兼容性的问题。由于本人使用的SpringBoot项目是2.7.X版本,安装的Nacos版本只能是1.X版本的,就选择最新的是1.4.8,所以只能选择SkyWalking版本是9.7.0,对应的nacos-client版本是1.4.2。,针对该问题,这里会详细描述遇到的问题和解决方案。修改SkyWalking的配置文件。
2025-03-30 01:02:44
1169
原创 JetCache源码解析——API实现
*** 抽象缓存类,提供了缓存的基本实现,支持键值对的存取操作。该类是线程安全的。* @param 键的类型* @param 值的类型*//*** 通知缓存事件监听器。* @param e 缓存事件。*//*** 获取缓存中指定键的值。* @param key 键。* @return CacheGetResult 获取结果,包含值和操作状态。*/@Override// 对于null键,直接返回错误结果。} else {
2024-03-03 22:19:45
1529
1
原创 JetCache源码解析——缓存处理
在Java技术体系中,如果想要在不改变已有代码逻辑的情况下,对已有的函数进行功能增强,一般可以使用两种方式,如AOP(Aspect Oriented Programming),即面向切面编程,以及代理模式,如使用JDK 动态代理或 CGLIB 动态代理。例如Mybatis的源码中同时使用了JDK 动态代理或 CGLIB 动态代理,但是对于Mapper接口是使用JDK动态代理模式。
2024-01-11 22:33:44
3231
原创 SpringMVC源码解析——HTTP请求处理
这个函数是一个公共方法,它调用了其他的方法来处理HTTP请求,并根据处理结果进行相应的操作。如果返回值为null,它会判断请求是否未修改、响应状态是否为null或请求是否已处理,如果满足条件,则设置请求已处理并返回。媒体类型包括在请求映射中指定的可生成媒体类型、能够写入特定返回值的配置转换器的媒体类型,或者所有媒体类型。函数首先从请求中获取可生成媒体类型集合,如果不为空,则直接返回该集合。否则,函数遍历所有消息转换器,判断是否能够写入特定返回值,如果可以,则将支持的媒体类型添加到结果集中。
2024-01-07 15:25:07
1185
原创 JetCache源码解析——配置加载和初始化
JetCache的配置加载主要是在jetcache-autoconfigure模块中完成的,无论是使用内存缓存LinkedHashMap和caffeine,亦或是通过lettuce、redisson和spring-data-redis来操作Redis服务缓存数据,其自动加载配置的操作基本上都是相似的。
2024-01-06 22:59:19
1736
原创 Spring国际化的应用及原理详解
通过Spring国际化,开发者可以将应用程序的文本、标签、消息等资源抽取出来,并使用合适的语言文件进行翻译,使得应用程序能够根据用户的语言偏好自动切换语言。在Spring国际化的实现中,主要涉及到了MessageSource、LocaleResolver等核心组件,它们共同协作,实现了语言切换的功能。如果 ApplicationContext 无法找到任何消息源,则会实例化一个空的 DelegatingMessageSource,以便能够接受对上述方法的调用。如果在指定的本地没有找到消息,则使用默认消息。
2024-01-04 09:13:07
1595
原创 JetCache源码解析——概览
JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。当前有四个实现,RedisCacheTairCache(此部分未在github开源)、(in memory)和一个简易的(in memory),要添加新的实现也是非常简单的。通过统一的API访问Cache系统通过注解实现声明式的方法缓存,支持TTL和两级缓存。
2024-01-02 21:07:49
1684
原创 Redis源码——压缩列表
压缩列表ziplist本质上就是一个字节数组,是Redis为了节约内存而设计的一种线性数据结构,可以包含多个元素,每个元素可以是一个字节数组或一个整数。Redis的有序集合、散列和列表都直接或者间接使用了压缩列表。当有序集合或散列表的元素个数比较少,且元素都是短字符串时,Redis便使用压缩列表作为其底层数据存储结构。列表使用快速链表(quicklist)数据结构存储,而快速链表就是双向链表与压缩列表的组合。例如,使用如下命令创建一个散列键并查看其编码。
2024-01-01 15:51:28
970
原创 SpringMVC源码解析——DispatcherServlet的逻辑处理
DispatcherServlet类相关的结构图如下:其中jakarta.servlet.http.HttpServlet的父类是jakarta.servlet.GenericServlet,实现接口jakarta.servlet.Servlet。其实,关键的三个函数init、service和destroy分别用于控制Servlet的初始化、运行和销毁。在。
2023-12-30 16:37:20
2035
原创 SpringMVC源码解析——DispatcherServlet初始化
Servlet是一个JAVA编写的程序,此程序是基于HTTP协议的,在服务端运行的(如Tomcat),是按照Servlet规范编写的一个JAVA类。主要是处理客户端的请求并将其结果发送到客户端。作为总控制器的派遣servlet通过处理器映射得到处理器后,会轮询处理器适配器模板,查找能够处理当前HTTP请求的处理器适配器的实现,处理器适配器模块根据处理器映射返回的处理器类型,例如简单的适配器类型、注解控制器类型或者远程调用处理器类型,来选择一个适当的处理器适配器的实现,从而适配当前的HTTP请求。
2023-12-29 22:28:53
2276
1
原创 VMware虚拟机网络配置——桥接模式
VM虚拟机配置桥接模式,可以让虚拟机和物理主机一样存在于局域网中,可以和主机相通,和互联网相通,和局域网中其它主机相通。vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。什么是桥接模式?桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。
2023-12-25 15:46:42
2255
原创 SpringMVC源码解析——ContextLoaderListener
在配置中只允许声明一次ServletContextListener,多次声明会扰乱Spring的执行逻辑,所以这里首先做的就是对此进行验证,在Spring中如果创建WebApplicationContext实例会记录在ServletContext中以方便全局调用,而使用的key就是WebApplicationContext的ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,所以验证的方式就是查看ServletContext实例中是否有对应的Key的属性。否则返回默认的上下文类。
2023-12-24 22:14:08
1429
原创 SpringMVC源码解析——基础篇
Spring MVC是Spring提供的构建Web应用程序的框架,该框架遵循了Servlet规范,负责接收并处理Servelt容器传递的请求,并将响应写回Response。Spring MVC以DispatcherServlet为核心,众多组件如HandlerMapping为辅助,为用户封装了请求映射等底层逻辑,让用户可以更专注与业务逻辑的处理。本文会对Spring MVC整体结构做简单介绍。
2023-12-23 21:06:22
112
原创 Spring源码解析——容器的功能扩展
ApplicationContext和BeanFactory都是用于加载bean的,但是相比之下,ApplicationContext提供了更多的扩展功能,ApplicationContext包含BeanFactory的所有功能,通常建议比BeanFactory优先,除非在一些限制的场合,比如字节长度对内存有很大的影响时。设置了路径是必不可少的步骤,ClassPathXmlApplicationContext中可以将配置文件路径以数组的方式传入,可以对数组进行解析并加载。
2023-12-17 13:15:00
123
原创 Spring源码解析——创建Bean
结合上面的代码发现,主要是调用createBean函数来创建Bean的,该函数是一个类的中心方法,用于创建bean实例,包括填充bean实例,应用后处理器等。否则要进行常规bean的创建。4、依赖处理,在Spring中会有循环依赖的情况,例如当A中有B的属性,而B中又含有A的属性时就会构成一个循环依赖,此时如果A和B都是单例,那么Spring中的处理方式就是当创建B的时候,涉及自动注入A的步骤时,并不是直接去再次创建A,而是通过放入缓存中的ObjectFactory来创建实例,这样就解决了循环依赖的问题。
2023-12-10 11:30:59
364
原创 Spring源码解析——加载Bean
结合上面的代码发现,主要是调用createBean函数来创建Bean的,该函数是一个类的中心方法,用于创建bean实例,包括填充bean实例,应用后处理器等。因为在创建单例bean的时候会存在依赖注入的情况,而在创建依赖的时候为了避免循环依赖,在Spring中创建bean的原则是不等Bean创建完成就会将创建Bean的ObjectFactory提前加入到缓存中,一旦下一个bean创建的时候需要依赖上一个bean,则直接使用ObjectFactory。最后,根据是否为单例对象,在缓存中存储对象。
2023-12-07 23:24:20
167
原创 Redis源码——压缩列表
压缩列表ziplist本质上就是一个字节数组,是Redis为了节约内存而设计的一种线性数据结构,可以包含多个元素,每个元素可以是一个字节数组或一个整数。Redis的有序集合、散列和列表都直接或者间接使用了压缩列表。当有序集合或散列表的元素个数比较少,且元素都是短字符串时,Redis便使用压缩列表作为其底层数据存储结构。列表使用快速链表(quicklist)数据结构存储,而快速链表就是双向链表与压缩列表的组合。例如,使用如下命令创建一个散列键并查看其编码。
2023-11-23 00:18:06
122
原创 Redis源码——跳跃表
在了解跳跃表之前,我们先了解一下有序链表。有序链表是所有元素以递增或递减方式有序排列的数据结构,其中每个节点都有指向下个节点的next指针,最后一个节点的next指针指向NULL。递增有序链表举例如下图所示。如上图所示的有序链表,如果要查询值为51的元素,需要从第一个元素开始依次向后查找、比较才可以找到,查找顺序为1→11→21→31→41→51,共6次比较,时间复杂度为O(N)。
2023-11-19 15:26:34
246
原创 超级有用的c++库
C++ 标准库——包括 STL Containers、STL Algorithm、STL Functional等。C++ 标准库- 类和函数的集合,它们是用核心语言编写的,也是 C++ ISO 标准本身的一部分。标准模板库- 标准模板库 (STL)。C POSIX library - POSIX 系统的 C 标准库规范。ISO C++ 标准委员会- ISO/IEC JTC1/SC22/WG21 - C++ 标准委员会。网站GNU C 库- 本手册的目的是告诉您如何使用 GNU C 库的工具。
2023-11-09 09:50:28
3393
原创 MyBatis——级联映射与懒加载
MyBatis其中一个比较强大的功能是支持查询结果级联映射。使用MyBatis级联映射,我们可以很轻松地实现一对多、一对一或者多对多关联查询,甚至可以利用MyBatis提供的级联映射实现懒加载。所谓的懒加载,就是当我们在一个实体对象中关联其他实体对象时,如果不需要获取被关联的实体对象,则不需要为被关联的实体执行额外的查询操作,仅当调用当前实体的Getter方法获取被关联实体对象时,才会执行一次额外的查询操作。通过这种方式在一定程度上能够减轻数据库的压力。
2023-11-05 11:35:14
330
原创 Mybatisplus源码解析——分页插件
必须要确保自定义的Mapper接口继承Mybatis-plus的BaseMapper接口,然后才能调用BaseMapper的分页函数。实例时传的是MapperMethod对象实例,而在mybatis-plus中传的是MybatisMapperMethod实例,两者在逻辑上差异不大,主要是在execute()函数中。,MyBatis中通过MapperProxy类实现动态代理,在Mybatis-plus中,也使用MapperProxy类实现动态代理的。
2023-10-28 18:43:39
1680
原创 MyBatis——插件原理及应用
MyBatis框架允许用户通过自定义拦截器的方式改变SQL的执行行为,例如在SQL执行时追加SQL分页语法,从而达到简化分页查询的目的。用户自定义的拦截器也被称为MyBatis插件,本章我们就来分析一下MyBatis插件的实现原理以及如何开发一个插件。
2023-10-24 22:53:25
525
原创 Spring Cloud——概述
Spring Cloud为开发人员提供了工具来快速构建分布式系统中的一些常见模式(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)。微服务的出现有助于开发人员用更低的成本和更少的错误来开发程序,因此成为Java开发人员需要掌握的最重要的技术之一。Spring Cloud是Spring旗下的项目之一,Spring擅长的就是集成,把世界上的好框架“拿”过来,集成到自己的项目中。Spring Cloud的官方简介如下图所示。
2023-10-23 18:01:11
108
原创 MyBatis源码解析——动态SQL实现原理
如果读者有过JDBC编程经验,肯定能体会到SQL语句拼接的痛苦。在有些情况下,我们需要根据不同的查询条件动态地拼接SQL语句,拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号,这个过程非常容易出错,导致我们需要在调试SQL语句的正确性上花费一定的时间。MyBatis的动态SQL特性能够彻底解决我们的烦恼,本章我们就来学习MyBatis动态SQL的使用及它的实现原理。
2023-10-22 22:44:19
1229
原创 MyBatis源码解析——MyBatis缓存
缓存是MyBatis中非常重要的特性。在应用程序和数据库都是单节点的情况下,合理使用缓存能够减少数据库IO,显著提升系统性能。但是在分布式环境下,如果使用不当,则可能会带来数据一致性问题。MyBatis提供了一级缓存和二级缓存,其中一级缓存基于SqlSession实现,而二级缓存基于Mapper实现。本章我们就来学习一下MyBatis缓存的使用,并分析MyBatis缓存的实现原理。
2023-10-20 18:04:20
269
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅