自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 Kafka服务端处理producer请求原理解析

本文深入解析了Kafka服务端处理Producer请求的核心流程。首先通过RequestHandlerPool接收请求,经KafkaApis路由到ProduceRequest处理逻辑。随后ReplicaManager将数据写入本地日志,经过Partition校验后调用LogSegment执行文件写入操作。关键点包括:数据分片处理、日志分段策略(基于大小/时间)、索引文件维护等。整个流程展现了Kafka高效处理写入请求的分层设计,从请求接收、权限校验到最终数据持久化,各组件职责明确,共同保障了高吞吐的消息写入

2025-10-19 18:50:53 884

原创 Safepoint的秘密探寻

这是一篇关于Java虚拟机(JVM)安全点(safepoint)的技术文章摘要: 文章主要介绍了JVM中安全点的概念、作用机制和相关源码分析。安全点是JVM中一个重要的同步机制,主要用于垃圾回收、JIT逆优化等场景。当需要执行GC等操作时,VM线程会通知所有Java线程到达安全点,通过轮询机制检查是否需要暂停。Java线程在不同状态(解释执行、本地代码、编译代码等)下有不同的安全点处理方式。文章还分析了安全点的执行流程、触发场景以及源码实现,包括VMThread、SafepointSynchronize等关

2025-10-02 08:44:15 618

原创 Spring实现proxy的流程

Spring代理机制解析 本文深入分析了Spring框架中的代理实现机制,主要包括: 代理实现方式:Spring通过BeanPostProcessor在bean生命周期最后阶段或循环依赖时提前创建代理对象,对原始bean方法进行增强。 代理流程: 正常流程:通过postProcessAfterInitialization创建代理 循环依赖:通过getEarlyBeanReference提前创建代理 两种方式最终都调用wrapIfNecessary确保代理逻辑一致 注解差异: @Transactional可以

2025-09-20 13:02:43 604

原创 再探volatile原理

volatile关键字与JIT编译优化探究 摘要 本文通过实验探究了volatile关键字在Java中的作用机制,发现JIT编译器C2阶段的优化可能导致无volatile修饰的变量出现死循环问题。实验表明: 无volatile时,C2编译器会优化循环逻辑,直接跳转形成死循环 添加volatile后,编译代码保持对变量的每次读取检查 通过JITWatch工具可观察汇编代码变化,验证了volatile防止编译器优化的效果 该现象揭示了JIT优化与内存可见性间的微妙关系,说明volatile不仅解决CPU缓存一致

2025-09-10 14:27:14 862

原创 kafka服务端架构总览

本文分析了Kafka服务端的架构设计,重点阐述了其计算与IO分离的核心思想。文章指出Kafka通过RequestChannel和Processor的responseQueue实现IO层与计算层的解耦,类似于Producer端通过batches解耦accumulator和Sender线程。服务端架构包含网络IO处理请求/响应(详见系列前两篇)和线程池处理业务逻辑两部分,这种分离设计提升了系统性能和可维护性。文章最后预告将深入探讨Kafka计算逻辑的具体实现。

2025-08-31 10:08:34 1073

原创 Kafka服务端NIO操作原理解析(二)

本文是Kafka系列文章的第三篇,主要解析Kafka服务端的NIO操作原理。文章首先展示了Kafka服务端IO类关系图,说明Acceptor和Processor都是线程,服务端启动后会以"一个Acceptor+多个Processor"模式运行。随后重点分析了Acceptor和Processor的核心流程:Acceptor通过selector监听accept事件,采用轮询方式将新连接分配给Processor;Processor则负责处理多个socketChannel,维护连接状态和数据读写

2025-08-09 15:57:47 938

原创 Kafka服务端NIO操作原理解析(一)

Kafka服务端NIO操作解析:Kafka利用Java NIO实现高性能网络通信,核心是通过Selector监听多个Channel事件(连接、读写)。服务端流程包括:创建ServerSocketChannel并绑定端口,设置为非阻塞模式,注册到Selector监听ACCEPT事件;当客户端连接时,创建SocketChannel并注册READ事件;通过ByteBuffer处理数据读写。相比BIO,NIO能单线程处理大量连接,显著提升吞吐量。Kafka在此基础上实现了更高效的自定义网络层,但基本原理与此类似。本

2025-08-05 07:52:42 976

原创 利用springEvent,进行服务内部领域事件处理

本文介绍了Spring Event在B端系统开发中的最佳实践方案。作者提出通过封装领域事件(DomainEvent)实现业务解耦,并针对事务和性能问题给出解决方案。关键点包括:1)利用事务钩子函数确保事务提交后才发布事件;2)使用@Async异步处理事件并配合TTL线程池解决日志追踪问题;3)建议根据业务需求选择最终一致性方案。该方案适用于流量不大的B端系统,在保证事务的同时兼顾性能,为开发人员提供了一种轻量级的解耦实现方式。

2025-07-01 21:33:55 836

原创 基于Kafka2.1解读Consumer原理

Producer的逻辑是把消息往外发,所以Sender运行的越快,client这边为了维护batch而消耗的资源(内存和CPU越少);而如果Consumer也这么干,实际消费速度赶不上fetch速度的话,会需要额外的内存和CPU资源来维持更多的completedFetchs,更别说如果发生了rebalance的话,fetch过来的completedFetchs可能都是白fetch了。从Fetcher的数据结构里其实就可以猜到它的作用:缓存已Fetch到的records、去fetch更多的records。

2024-11-17 10:43:54 1281

原创 基于Kafka2.1解读Producer原理

相信现在的javer对于Kafka应该都很熟悉了,不管是八股文还是工作中使用。虽然Kafka server是scala写的,但是client是java写的,所以咱们理解client的代码还是比较容易的,今天先来基于源码解读下Kafka Producer的主体流程Kafka的消息发送其实就是一个RPC的过程,有自己的网络协议、消息协议、消息序列化方式、数据批量发送(增加吞吐量)、超时处理、底层网络模型。不过Producer对于batch的复用,其实还是有一定的厉害之处的,等下次有空分析下~

2024-10-09 13:05:37 1122

原创 通过JITWatch查看汇编代码,观测jdk17改动对代码的影响

我们可以使用JITWatch来观测线上代码实际运行逻辑,来进行一些问题分析和学习参考。虽然线上运行的是机器指令,但是为了方便阅读和理解,JITWatch执行的都是汇编代码,是ARM指令集的汇编代码,不过咱们可以借助chat-gpt或者豆包等大模型帮忙解读没有想到C2编译器相对于C1编译器的高级优化(激进优化)里还有「分支预测」这一步JIT的编译优化也是有可能误判(错误优化)导致实际代码运行过程中需要进行逆优化再编译的。

2024-10-06 09:21:53 1309 2

原创 Springboot结合Mockito写单元测试实践和原理

相信看我博客的都是javaer,工作中一般都是使用Springboot框架。之前介绍过,可以利用@Transactional注解实现单测方法回滚,其实大家都知道Springboot-Test里面集成了Mockito,今天我们来介绍下怎么使用,以及原理是什么。文章主要讲了Springboot中的@MockBean和@SpyBean的使用场景和简单原理。

2023-10-16 20:27:37 1637

原创 DependsOn注解失效问题排查

@DependsOn注解失效分析及解决

2023-10-08 20:14:33 2082

原创 AQS源码解读

AQS是AbstractQueuedSynchronizer的缩写,也是大神Doug Lea的得意之作。今天我们来进行尽量简化的分析和理解性的代码阅读。竞争资源总体分三步1. 尝试获取资源,成功就返回2. 失败了的线程封装成Node,加入到队列3. 加入到队列的Node,不停经历(阻塞-非阻塞-tryAcquire),直到获取资源成功释放资源分两步4. 尝试释放资源,失败了就返回5. 释放成功了,需要把头结点的waitStatus置空,唤醒下一个非CANCELED的Node进行资源获取操作。

2023-08-19 12:05:12 532

原创 一个反序列化问题引发的思考

由于合作团队使用的JSON序列化组件不同而导致的问题

2022-10-27 15:51:43 498

原创 手写简单的spring(2):实现循环依赖

文章目录前言一、前期辅助1.1 最朴素的想法1.2 真的这么丝滑么二、使用步骤1.引入库2.读入数据总结前言相信凡是写Java的同学都知道或者背过Spring实现循环依赖的方式吧,无非是三个缓存工厂,然后每个工厂放object的什么形态,bla-bla之类的。之前我也写过一篇博客,图解过 。不过,如果我们自己来实现,该如何写呢?接着我们上一篇的博客,继续探索一下。一、前期辅助1.1 最朴素的想法既然我们需要实现一个循环依赖,那么我们首先来写个demopublic class CycleSer

2022-04-04 19:30:11 711

原创 手写简单的spring(1):了解Spring的原理

通过简单的代码模拟来解释Spring到底是怎么实现的

2022-03-09 20:30:24 416

原创 Spring的AOP执行顺序

Spring中的Advisors的执行顺序

2022-01-26 19:42:36 4158

原创 单元测试加上@Transactional就能实现回滚【原理】

单元测试自动回滚

2021-12-18 08:22:28 3772

原创 从硬件到软件去理解一致性

看了很多操作系统和软件中间件之类的知识之后发现,软件和硬件在大的方面有时候解决的是一样的问题软件层面需要解决的问题,其实在硬件层面早就解决过,在软件层面进行技术架构时可以进行参考。不过硬件层面比软件层面又好在没有网络因素在里面,所以需要对于具体的业务或者功能有相应的取舍。

2021-12-10 14:36:43 1702

原创 mac下配置PrintAssembly

有时候难免想看下对应的Java代码JIT编译之后的汇编代码是什么样有了printAssembly方式,咱们相当于可以查看JIT下class对应的执行的汇编指令。所以我们可以看看加了volatile的变量执行方式上具体有什么差异,相关内容已更新到这篇文章,欢迎不吝赐教。

2021-11-01 15:10:52 1477

原创 添加@Async注解,导致spring启动失败

文章目录前言一、异常表现,抛出内容1.1循环依赖的两个class1.2 启动报错二、原因分析2.1 主要原因2.2 循环依赖放入二级缓存处逻辑2.3 initializeBean生成的对象2.4 再次分析原因总结前言在这篇文章里,最后总结处,我说了会讲讲循环依赖中,其中一个类添加@Async有可能会导致注入失败而抛异常的情况,今天就分析一下。一、异常表现,抛出内容1.1循环依赖的两个classCycleService1@Servicepublic class CycleService1

2021-08-29 10:22:42 4309 4

原创 spring源码解读:@Async的原理——默认配置

文章目录前言一、如何使用@Async二、源码解读1.@EnableAsync的作用2. AsyncConfigurationSelector的作用3. adviceMode:PROXY(默认值)3.1 ProxyAsyncConfiguration3.2 AsyncAnnotationBeanPostProcessor3.3 AsyncAnnotationAdvisor3.3.1 buildAdvice3.3.1.1 AnnotationAsyncExecutionInterceptor,异步执行的原理3.

2021-08-22 21:38:29 1932

原创 spring循环依赖原理图解+bean的生命周期图解

Spring是如何处理循环依赖的,又是怎么做到,互相注入对方的proxy bean而不是raw bean的?现在就分析一下循环依赖其实耐下功夫读源码,也没有那么难。下次分享为什么循环依赖的其中一个类添加@Async有可能会导致注入失败而抛异常–这篇博客。

2021-08-15 12:20:57 509

原创 基于Spring,属性注入动态对象

文章目录前言一、思路二、使用步骤1.注入对象类型必须是接口2. 注入的实际对象必须是一个ObjectFactory3. 注入的对象属性必须在DefaultListableBeanFactory#resolvableDependencies里4. 测试实现三、ObjectFactory 和 FactoryBean3.1 ObjectFactory3.2 FactoryBean四、一个新方案(prototype + @Lazy)4.1 将WangObj的作用域scope改为prototype4.2 将WangO

2021-08-10 12:27:16 1042

原创 关于Java的Interrupt的一些知识

文章目录前言一、interrupt()二、interrupted()和isInterrupted()1.interrupted()2. isInterrupted()3. isInterrupted(boolean ClearInterrupted)总结前言对于Java的InterceptException以及interrupt()等方法总会有疑惑,或者记不清,其实最好的解释就是方法的doc注释一、interrupt()咱们看看源码上,对于interrupt()方法的注释:/** *

2021-08-08 17:00:07 310

原创 spring源码解读:@Lazy延迟注入的逻辑

文章目录前言一、一个简单的小例子二、源码解读1. 注入2. 使用逻辑总结前言有时候我们会在属性注入的时候添加@Lazy注解实现延迟注入,今天咱们通过阅读源码来分析下原因一、一个简单的小例子代码如下:@Servicepublic class NormalService1 { @Autowired @Lazy private MyService myService; public void doSomething() { myService.getName(); }}作用

2021-08-03 18:11:39 1827 3

原创 为什么有了MESI还需要volatile关键字

MESI的概念此处不再累赘,有兴趣的可以搜索store buffer引入store buffer是为了将同步改为异步引入store forwarding技术是为了让CPU可以直接从store buffer里加载数据但是因此可能会发生乱序情况,譬如a在store buffer里,b在cache里,但是赋值操作虽然先设置了a,后设置了b,但是实际上却可能是b先被刷新到cache里,因为store buffer里的a在等待其他cpu返回invalid ack引入写屏障技术,添加smp_w

2021-07-08 10:45:45 1142 1

原创 java堆内堆外内存困惑

操作系统IO分为 直接IO和缓存IO可以参考:1. https://www.icode9.com/content-4-450323.html2. https://blog.youkuaiyun.com/lzh1179805109/article/details/79883523简单的理解缓存IO就是:可以把缓存IO认为是系统给磁盘增加的缓存,Linux的实现是通过内核缓存,这样的话,用户进程的数据write和read其实针对的就是内核缓存,至于内核缓存什么时候和磁盘同步,这个在此不多介绍。Linux系统默认.

2021-06-08 17:09:05 554

原创 阻塞/非阻塞IO和同步/异步IO

文章目录前言一、IO的理解二、IO的使用1.传统IO2.NonBlocking IO 非阻塞IO3. New IO : NIO4. 异步IO:AIO总结前言IO是个比较废人思量的东西,不管是自己理解,还是面试提问。一、IO的理解IO的作用一般分为,获取文件数据或网络请求数据。数据处理过程其实分为两阶段:A. 数据内核准备数据(把数据从网卡拷贝到内核的page cache或者把文件数据从磁盘拷贝到内核的page cache);B. 把数据从内核的page cache拷贝给用户的用户进程(用户空间

2021-05-10 11:20:19 375

原创 利用AOP实现打印接口调用基本信息(统计接口调用时长)

文章目录前言一、AOP是什么二、打印接口调用信息1.why?2. code2.读入数据总结前言之前写过一篇博客,利用AOP进行接口调用频控设置;这次写一篇利用AOP打印接口调用基本信息。一、AOP是什么aop的基本使用和解释,可以参考其他博客,或者Spring的官网:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-api二、打印接口调用信息1.why?有时候线上或者某个环境发

2021-04-30 14:59:26 972

原创 @ControllerAdvice和@ExceptionHandler的原理

文章目录前言一、简单使用1. jar的引入2. 废话不多说,上代码二、查看原理1.抽丝剥茧1.1 WebMvcAutoConfiguration2.读入数据总结前言现在大家都习惯使用Spring框架了,而且平时的业务系统中的异常捕捉及处理都是靠@ControllerAdvice和@ExceptionHanlder两个注解配合使用的。一、简单使用1. jar的引入其实我不写,哈哈哈哈。看了下这两个注解都是spring-web里的,不过因为现在一般项目都是使用springboot启动的,所以不用自

2021-04-22 20:43:05 1274 1

原创 利用ThreadLocal和StopWatch实现一个简单的埋点计时工具

文章目录前言一、一般做法二、更优雅的做法1. 考虑线程的概念2. 考虑如何计时3. 优化的计时方法类总结前言写代码的时候,我们有时候需要获取方法调用详细耗时。一、一般做法一般情况下,对于接口调用耗时,简单的做法都是通过System.currentTimeMillis()来获取时间,然后分别相减,获取某个代码块的执行耗时; public ApiResponseEntity exTest() { long start = System.currentTimeMillis();

2021-04-21 21:50:13 1248

原创 IDEA 2020.3启动项目:java: java.lang.IllegalArgumentException

java: java.lang.IllegalArgumentException

2021-04-17 17:46:15 24919 14

原创 @Autowired注解的原理、源码

文章目录前言一、@Autowired怎么使用?二、注入干了啥1.查找一个类的所有注入点1.1 在Spring中Bean的生态位置1.2 detail,源码解读2.读入数据总结前言@Resource注解和@Autowired注解是咱们使用Spring的两大利器,用来进行属性注入。在上一篇文章中,我们解析了@Resource的源码,同时在总结里解释了下为什么@Resource被称为先按byName后按byType进行依赖注入。今天咱们来分析下@Autowired注解的源码和原理。一、@Autowired

2021-03-24 11:55:32 772

原创 @Resource注解的原理、源码

文章目录前言一、@Resource怎么用?二、那么注入做了些啥1.查找一个类的所有注入点1.1 在Spring中Bean的生态位置1.2 detail,源码解读2. 注入2.1 在Spring中bean的生态的位置总结前言@Resource注解和@Autowired注解是咱们使用Spring的两大利器,用来进行属性注入。这篇文章来简单分析下@Resource的原理一、@Resource怎么用?很简单的啦,譬如如下:@Servicepublic class TestService {

2021-03-15 21:07:38 1621

原创 Spring源码解读:Spring的Event编程以及实现原理

文章目录前言一、使用传统方式观察者模式二、源码解读1.引入库2.读入数据总结前言要想代码写得好,设计模式不可少。Spring框架启动过程中,有两个设计模式使用较多,一个是观察者模式,一个是processor处理时用的链式模式。今天我们来介绍观察者模式的Event一、使用传统方式咱们写业务代码,经常会涉及到某种业务场景,譬如A的改变,B或者C需要知道,以便改变。一般程序员写代码可能会写成下面这种@Servicepublic class AService { @Autowired pr

2021-02-02 18:08:54 1103 1

原创 Spring源码解读:@Transactional原理(2)

文章目录前言一、类图二、MethodInterceptor#invoke1.方法拦截器?2.TransactionInterceptor#invoke3. TransactionAspectSupport#invokeWithinTransaction3.1 createTransactionIfNecessary3.1.1 AbstractPlatformTransactionManager#getTransaction,获取事务状态TransactionStatus3.1.1.1 调用当前事务方法前,已

2021-01-26 19:39:31 675

原创 基于AOP+Redis实现一个简单频控拦截器

文章目录前言一、定义注解二、Aspect三、使用示例总结前言为了实现频控,并且可插拔形式,那么AOP无疑是一个非常好的选择。咱们这个Aspect实现依赖了redis一、定义注解今天咱们做一个简单的频控组件,可以实现某个接口针对某个用户某个时间段只能调用1次注解如下:@Inherited@Documented@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface FrequencyC

2021-01-26 15:27:31 1598

原创 线上问题引发的对于Map.values()的探究思考

项目场景:项目场景:我们的数据需要同步到es,以供列表页查询。产品反映修改了数据之后,列表页显示的字段可能是修改之前的甚至更老版本的数据。问题描述:我们目前做的一个系统,表单数据会有多个版本,但是不同版本字段不一定相同。需要把所有数据同步到es,在es进行列表搜索显示。上线几天后发现一个诡异的事儿是,某些表单,在经过多次编辑之后,从es查到的列表数据某些字段会展示位旧数据,而表单详情是最新数据。定位问题,问题一定出现在表单多版本数据融合,然后同步到es的地方查看代码 List<S

2021-01-19 18:01:35 944 2

空空如也

空空如也

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

TA关注的人

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