
源码学习
文章平均质量分 95
小道仙97
一个不务正业的程序员,梦想成为家庭煮夫。【五十岁退休】
展开
-
Nacos热更新
(这里是循环获取本地的阻塞队列数据,至于Nacos如何把任务塞到队列的代码可以自行去看看,有了队列还会找不到塞的操作吗)判断的逻辑也很简单,拿配置文件里面的全部内容生成一个 md5,和上一次的md5进行对比,如果两个md5不一致,则说明有变化。最近有一个需求,需要把Nacos上某个配置文件,从A_data-id迁移到B_data-id上。,这个方法会去判断当前data-id的内容是否有变动,如果有变动就会发送事件去处理。这个方法里面会去解析配置文件里面的内容,然后发一个事件,这个事件就是热更新的核心了。原创 2024-12-29 16:26:08 · 915 阅读 · 0 评论 -
Dubbo生产者一次请求的过程 (Dubbo源码三)
Dubbo底层通讯是基于Netty,请求第一步肯定是从Netty收到消息开始的。Netty收到消息也肯定是不是明文的,这一节要解决如下问题Netty接收消息的入口如何把消息解析成明文怎么通过消息找到对应的服务原创 2024-12-15 15:15:35 · 680 阅读 · 0 评论 -
SpringBoot 热插拔AOP,动态的实现AOP【简单易懂,有大用】
下面就来实现一个动态的添加/删除动态代理的功能,它的源码很简单,但这会打开你的新世界原创 2024-05-25 17:23:37 · 1505 阅读 · 3 评论 -
Java全局异常处理,@ControllerAdvice异常拦截原理解析【简单易懂】
最近在做系统升级的时候,引发了一个BUG,原本系统是有一个异常处理器A,引入了某个底包中也带了一个异常处理器B,最终走了底包的异常处理器B。在DispatcherServlet里面有一个onRefresh方法,它是重写的父类FrameworkServlet的,在初始化ServletBean的时候会被调用一次,它里面会做很多初始化的操作,其中一个就是获取容器里面的全局异常拦截器。并不是系统任何异常都会被它所拦截,因为我们已经知道它的执行点是在MVC的流程中,所以就只有HTTP异常才会被拦截处理。原创 2024-05-13 21:59:03 · 3052 阅读 · 0 评论 -
RocketMQ 消费者源码解读:消费过程、负载原理、顺序消费原理
看完上面的源码你最少可以回答下面几个问题RocketMQ消费的流程是怎么样的为什么消费者大于queue的时候,消费者就没用了顺序消费如何保证顺序的添加消费者的时候,如何重新分配的。原创 2024-04-02 22:01:46 · 1198 阅读 · 0 评论 -
一文弄懂@Async代理执行原理(从源码的角度深入理解@EnableAsync 注解开启原理)
一直只知道 @Async是通过代理来实现的,在同一个方法里面调用为什么不可以,只是懵懂知道一点,抽时间刚好研究一下它的原理,发现和 @Transactional 的实现原理完全一样。原创 2023-12-16 10:35:56 · 677 阅读 · 0 评论 -
基于MyBatis二级缓存深入装饰器模式
装饰器模式是一种能够在不改变原对象代码的情况下,动态地为对象添加新功能的设计模式。通过将对象包装在装饰器类中,可以透明地、在运行时选择性地、以任意顺序地应用这些功能。最终效果是通过组合不同的装饰器,扩展原对象功能,使系统更灵活可扩展。原创 2023-12-10 18:36:00 · 344 阅读 · 0 评论 -
Java日志源码详解,SpringBoot日志 slf4j、logback、log4j
在读取配置文件的时候无非就几种情况,既然有多种情况,那肯定是有一个优先级的——即下面的排序指定自己的配置文件 (logging.config: classpath:logback.xml)默认读取的配置文件,本质上和【1】一样,只是文件的位置不同logback自己的默认配置文件 (“logback-test.groovy”, “logback-test.xml”, “logback.groovy”, “logback.xml”)原创 2023-09-24 21:46:47 · 935 阅读 · 0 评论 -
Spring事务源码解析【一次一篇文章弄懂】
上一篇文章我们已经知道了Java中Spring的事务,尤其是声明事务,这篇文章我们来深入探讨一下Spring的声明事务是如何实现的。首先Spring的声明事务是基于AOP实现的,说到AOP我们就要搞清楚两点:1. 何时何地基于什么规则生成的代理对象2. 生成了代理对象后,拦截器做了什么原创 2023-07-23 12:26:51 · 683 阅读 · 1 评论 -
RocketMQ 消费者运行原理,Consumer 集群消费、广播消费
上次我们整体的看了一下RocketMQ Consumer 的消费过程,今天再来聚焦看一下 Consumer 是如何进行集群消费和广播消费的。原创 2023-05-23 22:54:21 · 1364 阅读 · 0 评论 -
RocketMQ之 Consumer,消费者消费原理解析
每个使用了 @RocketMQMessageListener 注解的消费者,都会被解析成一个 ListenerContainerListenerContainer 在解析出来后,就被开启了,它会运行一个死循环的代码(如果当前线程不终止的话,会一直运行),这段代码会不停的去 pull 消息如果 pull到了消息,就会被丢入一个线程池,等待资源去处理消息。原创 2023-04-16 19:07:16 · 1665 阅读 · 0 评论 -
Java线程池运行原理,线程池源码解读【Java线程池学习二】
但随着时间的推移在闲下来的时候我突然想,当任务进入了队列之后是怎么取出来的呢?然后列举了几个问题毫无疑问想要解决上面的问题,那只有研究源码,下面我们就来看下 ThreadPoolExecutor 的源码,此次目的就是解决上面的问题,先对线程池的核心工作原理进行理解,后面我们再来对线程池来一个全面的解读。1. 添加的一个任务是怎么运行的?2. 任务丢到了队列,怎么取出来呢?3. 过了时间怎么销毁线程?4. 怎么拒绝的?5. 线程池,这个池是什么? 线程怎么放进去?原创 2023-02-19 13:08:37 · 482 阅读 · 0 评论 -
Java锁之ReentrantLock(源码详解)
ReentrantLock 这个Java中重要的锁,我想可能很多人只是听过,并没有使用过,我在看RocketMQ客户端源码的时候发现大量的使用了这个ReentrantLock,从而引起了我的兴趣,下面我们一起从源码的角度来学习ReentrantLock。我们先来看一下ReentrantLock的继承关系。原创 2023-01-12 21:46:27 · 1067 阅读 · 0 评论 -
深入理解MyBatis一级缓存和二级缓存【超详细源码解析】
深入理解MyBatis一级缓存和二级缓存【超详细源码解析】一级缓存的作用域为何是 sqlSession、二级缓存的作用域为何是 mapper怎么理解 一、二级缓存都是基于 PerpetualCache 的HashMap的本地缓存为什么一级缓存无法被关闭怎么才能使用二级缓存?如果使用了二级缓存一级缓存还有用么如果一级缓存不可以关闭,那在分布式的系统中,如何解决数据一致性问题如果开启了二级缓存,那缓存的命中顺序将是如何呢原创 2022-11-04 16:55:48 · 1434 阅读 · 1 评论 -
MyBatis 执行原理,源码解读,基于SpringBoot讲解
这里是讲解MyBatis执行的逻辑的一个基础版本,虽说如此,但东西已经很多了,可以先理解个大概,然后再逐步去细化理解,比如 - xml具体是如何解析的- 事务是如何执行的- 缓存是如何处理的- 怎么创建自定义插件、插件在何时执行原创 2022-09-17 18:24:54 · 880 阅读 · 0 评论 -
HTTP执行流程,SpringMVC执行流程,Java一次HTTP请求容器做了哪些事情,过滤器、拦截器、AOP执行流程【超详细解答】
HTTP执行流程,SpringMVC执行流程,Java一次HTTP请求容器做了哪些事情,过滤器、拦截器、AOP执行流程原创 2022-07-24 21:36:43 · 931 阅读 · 0 评论 -
源码学习之【OpenFeign工作原理】
我们知道openfeign是一个rpc远程调用框架,目的是使的我们调用接口和调用本地方法一样简单,本质上还是需要http请求。openFeign是通过jdk代理来实现这个操作的,下面我们将通过源码一步步探寻它的运作原理。我们的目的很简单,因为我们在使用的时候是直接进行注入的,我们只需要知道每一个接口是如何被注入到Spring容器的,找到代理所做的事情即可。原创 2022-02-28 20:00:32 · 2318 阅读 · 1 评论