框架源码
常用框架底层源码的分析、启动流程、核心功能的实现
胡尚
只要学不死就往死里学
展开
-
Seata源码分析 全局事务开启&提交&回滚流程
Seata源码版本为1.7.0源码下载路径一阶段这是分支事务主要的执行流程,不在本章节的源码分析范围内业务数据和志记录在同回滚日一个本地事务中提交,释放本地锁和连接资源。核心在于对业务sql进行解析,转换成undolog,并同时入库二阶段分布式事务操作成功,则TC通知RM异步删除undolog分布式事务操作失败,TM向TC发送回滚请求,RM 收到协调器TC发来的回滚请求,通过 XID 和 Branch ID 找到相应的回滚日志记录,通过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚。Seata生命原创 2024-07-17 22:05:48 · 968 阅读 · 0 评论 -
Spring事务的源码底层实现
当我们使用Spring事务这个功能,在方法上加了@Transactional注解,并通过代理对象调用该方法时,就会最开始进入到Interceptor的invoke()方法中。它和pointcut有关系,Pointcut会用到该类,我们可以把它简单理解为就是一个工具类,它会去解析方法上写的@Transactional注解信息。代理对象到时候执行目标方式之前,会经过Pointcut匹配,再到Interceptor链,会进行事务相关的处理,再去调用目标方法。注解的总体功能就是这样,剩下的只是各个类中的详细实现。原创 2024-06-27 19:22:31 · 897 阅读 · 1 评论 -
Nacos2.X源码分析:服务注册、服务发现流程
方法中会判断当前要注册的实例是否为临时实例,如果是临时实例就使用grpc的方式请求NacosService,如果是持久化实例就还是使用http的方式请求,一般情况下都是临时实例,所以会采用grpc的方式调用。至此,NacosClient端请求NacosServer端进行服务注册的一次请求就结束了,但NacosServer端真正处理的逻辑还没有结束,接下来要去看监听事件是如何进行处理的。进行全文搜索,看看某个事件对象到底是在哪里进行处理的。处理该事件的位置和处理服务注册的位置是一样的,都是。原创 2024-07-07 20:04:25 · 1303 阅读 · 1 评论 -
sentinel源码分析:@SentinelResource的实现原理、SphU.entry()方法中ProcessorSlotChain链、entry.exit()
我们刚开始使用sentinel时,我们会先引入下面这个maven依赖然后编写这样的demo这种方式使得sentinel的定义资源、保护业务代码逻辑这些和我们的业务代码耦合在一起了。后来就使用了注解来解决这个问题但其实通过这个注解,它底层还是使用的上面的那一套try{}catch(){}finally()。只不过是利用了AOP的机制实现罢了sentinel中,其实核心的代码都是在微服务客户端这边,重点都是在sentinel-core这个包下。而sentinel控制台那边的代码其实只是一个web界面和微服原创 2024-07-11 20:47:23 · 894 阅读 · 0 评论 -
Gateway源码分析:路由Route、断言Predicate、Filter
又是一些异步调用,但我们从方法名就能看出来,这里根据我们yml配置文件中路由定义的断言去调用对应的断言对象。方法,在该方法中会找一个与WebHandler匹配的HandlerAdapter来适配WebHandler对象,最终去调用WebHandler的。方法中,先获取路由的局部Filter,在创建一个集合存放全局Filter,在把局部Filter和全局Filter放在一起。方法的作用就是就是遍历Gateway所有的HandlerMapper,我们这里肯定最终是使用的。原创 2024-07-20 12:47:50 · 1159 阅读 · 0 评论 -
Nacos服务注册总流程(源码分析)
添加实例的方法中了,这个方法中主要做的事就是将当前service的所有实例通过一个key存入一个Map中,然后保存在一个dataStore这个Map中,同时再把这个key和相关的操作类型存入一个阻塞队列中,至此NacosClient发送的请求就处理完成了。其实我们就可以双击shift键,直接搜索controller,一个一个文件夹找,或者是直接加上关键字,就比如我这里加上了instance这个关键字就找到了真正处理这个请求的controller,类名为。我们启动一个微服务,引入nacos客户端的依赖。原创 2024-07-06 20:11:18 · 996 阅读 · 0 评论 -
Spring底层架构核心概念
Spring启动的时候需要去扫描,如果指定的包路径比较宽泛,那么扫描的类是非常多的,那如果在Spring启动时就把这些类全部加载进JVM了,这样不太好,因为JVM的类加载是在类要使用时才会加载,而现在都没有使用就都加载了,所以使用了ASM技术。Bean的后置处理器,我们可以定义多个BeanPostProcessor,在创建Bean时,每个Bean都会执行这其中的前置和后置方法,我们也可以加if来判断给特定某个Bean执行某些特定的方法。Spring中需要去解析类的元数据信息,比如类名、方法名、类上注解等。原创 2023-04-19 19:11:49 · 1744 阅读 · 0 评论 -
SpringMVC启动流程
SpringMVC启动流程如下。原创 2024-06-28 17:51:12 · 1159 阅读 · 0 评论 -
Nacos2.X 配置中心源码分析:客户端如何拉取配置、服务端配置发布客户端监听机制
接下来的源码就是这里一块的流程,它是如何调用到。原创 2024-07-09 22:05:07 · 1068 阅读 · 0 评论 -
sentinel源码分析: dashboard与微服务的交互、pull模式持久化
前置知识 @SentinelResource的实现原理、SphU.entry()方法中ProcessorSlotChain链、entry.exit()建议先会使用sentinel,并对底层实现有一些理解再来看sentinel规则持久化。当然你直接看也能看懂。Sentinel规则的推送有下面三种模式:微服务与控制台通信流程 在线流程图如果不做任何修改,Dashboard 的推送规则方式是通过 API 将规则推送至客户端 并直接更新到内存中:我们先来看看我们微服务这边规则是如何保存的。就以流控为例在FlowS原创 2024-07-13 14:32:25 · 1071 阅读 · 2 评论 -
Spring 解析配置类的详细过程
这里也就是真正去解析配置类的方法,去解析@Component、@PropertySources、@ComponentScans、@Import、@ImportResource、@Bean。接口的实现类,所以在执行BeanFactoryPostProcessor时就会执行该类的。方法,将包扫描得到的BeanDefinition添加到BeanFactory中。我们在启动Spring容器时,会传一个配置类,如下所示。接下来就是详细的解析配置类的代码,通过调用。源码如下,首先是上图中左边部分的代码。原创 2024-06-25 16:16:20 · 511 阅读 · 0 评论 -
Spring底层核心原理
cjlib和jdk两种动态代理的实现都是有一个target属性来存储普通对象,代理对象中重写要执行的方法,首先执行增强逻辑,然后通过target属性去执行目标方法。下面这几行代码是一个Spring的入门代码,第一行是通过java配置类 注解的方式创建一个Spring容器,第二行是通过XML配置文件的方式创建一个Spring容器。代理对象中操作的是事务管理器的连接对象,而业务方法却是使用的JdbcTemplate,所以就导致了Spring事务失效。如果显示写了多个构造方法没有空参的构造方法时,运行时会报错。原创 2023-04-18 15:50:58 · 648 阅读 · 0 评论 -
Spring 依赖注入源码
Spring早期依赖注入的两种方式:BY_NAME 和 BY_TYPE寻找所有的注入点,为注入点赋值,入口处理@Value注解,根据type,然后遍历所有的BeanDefinition,找到匹配的beanName集合。判断1,处理@Bean注解的autowireCandidate=false,判断BeanDefinition中的autowireCandidate属性值判断2,处理泛型的情况判断3,处理@Qualifier注解,原创 2023-04-30 20:22:05 · 1005 阅读 · 1 评论 -
SpringBoot的启动流程
在线思维导图原创 2024-07-01 21:38:24 · 534 阅读 · 0 评论 -
SpringBoot自动配置&properties文件配置项优先级
方法,去读取+过滤spring.factories文件中的自动配置类,并最终将selectImport()方法返回的自动配置类加载进Spring容器并解析。ImportSelect接口,解析配置类时在使用@Import注解,如果导入的类型是ImportSelect,所导入的配置类会直接进行解析导入。,在启动Spring容器时就会用到该配置类,通过解析该配置类最终会往Spring容器中添加很多的BeanDefinition。主要作用:Spring容器启动时使用配置类,而解析配置类的过程中就会用到这里的。原创 2024-07-02 15:12:20 · 1035 阅读 · 0 评论 -
Nacos源码分析:心跳机制、健康检查、服务发现、AP集群
官方文档:发送某个实例的心跳接口信息心跳机制 在线流程图健康检查在线流程图健康检查:现在先回到NacosClient进行服务注册时的代码,通过调用方法进行服务注册再来看类中run()方法具体的实现接收客户端的心跳接口,该接口找到instance所属的service后,再调用方法进行处理修改instance的LastBeat时间健康检查在线流程图健康检查机制是在服务注册的流程中进行的,接下来回忆一下服务注册的流程:NacosClient端通过调用接口发送post请求会往NacosServer端进行服原创 2024-07-06 20:18:33 · 875 阅读 · 1 评论 -
Nacos2.X 源码分析:为订阅方推送、服务健康检查、集群数据同步、grpc客户端服务端初始化
而Nacos2.X 从http请求改为了grpc请求的方式了,在健康检查这方面就是基于长连接来实现的。客户端发送心跳是在构建grpc连接时会有一个线程每隔5s发送一次,NacosClient端发送心跳的代码在。我们能大致猜测:当一个服务的实例进行了更新,那么是不是应该推送给所有订阅了该服务的客户端?当我订阅了某个服务,是不是应该将该服务信息推送给我?在服务实例检查检查流程中,如果出现了要注销的服务实例就会发布。在服务发现时,进行订阅服务的最后会发布一个。服务注册与服务订阅流程中发布的事件最终会被。原创 2024-07-08 17:53:45 · 984 阅读 · 0 评论 -
Sentinel规则持久化Push模式两种实现方式
前置知识 pull模式pull拉模式的缺点,以保存本地文件举例:所以还有一种push推送模式。我们一般会引入第三方中间件来实现,以Nacos为例。我们修改了nacos中的配置,它就会将更新后的数据推送给微服务。push模式有两种实现方式:在微服务端添加读数据源,为dataId添加监听器,当规则配置文件更改之后我就获取到更改后的规则内存并更新内存中的数据;再添加一个写数据源,每当dashboard中更新了规则,我除了更新内存中的数据之外,我通过方法还往Nacos端进行写入在dashboard源码中进行更改,在原创 2024-07-14 15:53:56 · 854 阅读 · 0 评论 -
Spring依赖注入——逐行源码分析
Spring依赖注入原创 2024-06-23 20:21:44 · 789 阅读 · 0 评论 -
Seata源码分析:分支事务源码
我们的业务sql执行,其实是从DataSourceProxy中拿到ConnectionProxy代理的数据库连接对象,再去拿PreparedStatementProxy对象,再去进行相应的增量逻辑、执行业务sql。Seata它的实现其实是对我们的数据源DataSource进行的代理,在这个过程中进行的一阶段相关的操作。将全局事务与分支事务进行绑定, 往branch_table分支事务表中进行新增insert操作的流程。对象中的数据,再将再把目标连接对象的自动提交设置为true。原创 2024-07-18 17:58:29 · 712 阅读 · 0 评论 -
Seata实战使用、分布式事务与Seata、SeataServer环境搭建
大多数场景下,我们的应用都只需要操作单一的数据库,这种情况下的事务称之为本地事务(Local Transaction)。本地事务的ACID特性是数据库直接提供支持。本地事务应用架构如下所示:在JDBC编程中,我们通过java.sql.Connection对象来开启、关闭或者提交事务。Connection conn = ... //获取数据库连接//开启事务try{//...执行增删改查sql//提交事务//事务回滚}finally{//关闭链接。原创 2024-07-15 15:35:12 · 679 阅读 · 0 评论 -
Spring Bean生命周期源码详解
之后child需要根据BeanDefinition来生成Bean对象之前,需要进行BeanDefinition的合并,得到完整的child的BeanDefinition,也就是RootBeanDefinition。我们知道BeanPostProcessor接口的作用是在bean初始化前和初始化后执行一些方法,Spring提供了该接口的子接口来进行实例化前后执行的一些方法。可以在这个步骤中,对Bean最终进行处理,Spring中的AOP就是基于初始化后实现的,初始化后返回的对象才是最终的Bean对象。原创 2023-04-23 18:59:07 · 1372 阅读 · 0 评论 -
Spring循环依赖问题——从源码画流程图
一级缓存它想要打破循环的话就只能把半成品Bean存放在一级缓存中,这样创建B对象时就获取到一级缓存中的半成品A对象了,这样也就打破了对象互相引用的死循环。如果A是动态代理对象,通过三级缓存循环依赖之后,就会出现B.a = A的代理对象。如果不使用三级缓存,同时A对象要进行AOP的话,此时就会出现依赖注入给B对象中的属性的A的普通对象,A经过创建过程之后存入单例池的却是代理对象。在解决循环依赖时,我就通过了普通对象创建了一个代理对象,解决你在初始化过程中有改变了普通对象,那我之前创建的代理对象岂不是没用了。原创 2024-06-24 21:13:54 · 1385 阅读 · 1 评论 -
Seata的TCC模式与XA模式实战使用
Try:对业务资源的检查并预留;Confirm:对业务处理进行提交,即 commit 操作,只要 Try 成功,那么该步骤一定成功;Cancel:对业务处理进行取消,即回滚操作,该步骤回对 Try 预留的资源进行释放。XA是资源层面的分布式事务,强一致性,在两阶段提交的整个过程中,一直会持有资源的锁。TCC是业务层面的分布式事务,最终一致性,不会一直持有资源的锁。TCC 是一种侵入式的分布式事务解决方案。原创 2024-07-16 12:51:43 · 702 阅读 · 0 评论 -
Mybatis从源码分析——启动到解析配置文件再到执行SQL语句过程
try {//将XML配置文件构建为Configuration配置类// 通过加载配置文件流构建一个SqlSessionFactory DefaultSqlSessionFactory// 数据源 执行器 DefaultSqlSessiontry {// 执行查询 底层执行jdbc}finally {从配置文件,通常是XML配置文件,获得SqlSessionFactory从SqlSessionFactory中获得SqlSession。原创 2024-06-29 21:59:41 · 787 阅读 · 0 评论 -
Spring源码中的扩展点在SpringCloud组件中的实现
Spring的各个扩展点具体在SpringCloudAlibaba组件中的具体实现原创 2024-07-24 11:34:57 · 877 阅读 · 0 评论 -
Ratf协议图解、Nacos CP集群源码分析
CAP原则分区容错性:在集群架构下,如果出现了网络中断,某些节点之间不能交互了,此时整个集群服务就不可用了,这是肯定不行的。分区容错性就是出现这种情况但是集群还能提供服务。一致性和可用性就是当出现网络分区之后,集群中某个时间点数据不一致,此时我是应该先暂时停掉某些节点来保证集群各个节点一致性嘞(或先不对外提供服务,网络分区恢复数据同步完成后再提供服务),还是优先保证集群的可用性(能容忍短时间内的数据不一致性)在NacosClient端,在配置文件中有一个配置项来指定当前服务实例是否为临时实例,默认是临时实例原创 2024-07-06 20:28:45 · 1073 阅读 · 0 评论 -
Sentinel限流算法:滑动时间窗算法、漏桶算法、令牌桶算法。拦截器定义资源实现原理
例如,可以使用一个环形数组来存储时间窗口内的数据点,数组的大小等于时间窗口的大小(以时间单位为单位)。每当有新的数据点进入时,旧的对应时间点的数据将被覆盖,从而实现滑动时间窗的效果。而且,当桶满了之后,多余的水将会溢出。随着时间的推移,新的数据点进入窗口,而旧的数据点则被移出窗口,从而形成了一个滑动的时间窗口。我们引入了下面的依赖,也就是我们实际使用sentinel的场景下,我们会发现我们controller层编写的http请求接口都不需要我们自己额外的定义资源开启保护。原创 2024-07-12 15:26:27 · 1132 阅读 · 0 评论 -
Spring容器启动流程——refresh()单个方法分析
父类中定义的方法模板,子类去实现的重写的,AnnotationConfigApplicationContext没有重写该方法,但是SpringMVC的那个类重写了。这里会判断能否刷新,并且返回一个BeanFactory, 刷新不代表完全情况,主要是先执行Bean的销毁,然后重新生成一个BeanFactory,再在接下来的步骤中重新去扫描等等。把程序员自己定义的ApplicationListener的Bean对象,设置到ApplicationContext中去,并执行在此之前所发布的事件。原创 2024-06-24 22:46:40 · 719 阅读 · 0 评论 -
Spring Bean生命周期源码之包扫描、创建BeanDefinition、合并BeanDefinition源码
之后child需要根据BeanDefinition来生成Bean对象之前,需要进行BeanDefinition的合并,得到完整的child的BeanDefinition,也就是RootBeanDefinition。先看包扫描的逻辑,ClassPathBeanDefinitionScanner类主要做的事情就是包扫描完后再将得到的BeanDefinition注册进Spring容器中。如果child它自己定义了scope属性那么就用自己的,如果没有定义那么就用的parent的。原创 2023-04-20 20:04:14 · 584 阅读 · 0 评论 -
SpringAOP执行流程——从源码画流程图
在该方法中就会从MethodInterceptor集合中取出来,并调用各自的invoke()方法,在调用过程中会把this自己传递过去,而在MethodInterceptor的invoke()方法中又会调用proceed()方法,就这样完成了循环遍历。设置接口,如果UserService类实现了UserInterface接口,但是没有调用该方法进行设置,那么下方源码中的if判断还是为没有实现接口,ProxyFactory不会自动判断类有没有实现接口,Spring它是自己做了相应的处理逻辑。原创 2024-06-26 21:08:09 · 841 阅读 · 0 评论