- 博客(81)
- 收藏
- 关注
原创 Seata源码——TCC模式总结
TCC 是分布式事务中的二阶段提交协议,它的全称为 Try-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel)
2023-12-24 18:46:13 1159 1
原创 Seata源码——TCC模式解析03
在分布式系统中,随时随地都需要面对网络超时,网络重发和服务器宕机等问题。所以分布式事务框架作为搭载在分布式系统之上的一个框架型应用也绕不开这些问题。具体而言,有以下常见问题:1.幂等处理2.空回滚3.资源悬挂参考 :https://developer.aliyun.com/article/1053736#
2023-12-24 18:45:57 516
原创 Seata源码——TCC模式解析02
在SpringBoot启动的时候通过自动注入机制将GlobalTransactionScanner注入进ioc而GlobalTransactionScanner继承AbstractAutoProxyCreatorAbstract 在postProcessAfterInitialization阶段由子类创建代理TccActionInterceptor。
2023-12-24 18:45:42 1021
原创 Seata源码——TCC模式使用01
TCC 是分布式事务中的二阶段提交协议,它的全称为 Try-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel),他们的具体含义如下:Try:对业务资源的检查并预留。Confirm:对业务处理进行提交,即 commit 操作,只要 Try 成功,那么该步骤一定成功。Cancel:对业务处理进行取消,即回滚操作,该步骤回对 Try 预留的资源进行释放。TCC 是一种侵入式的分布式事务解决方案,以上三个操作都需要业务系统自行实现,对业务系统有着非常大的
2023-12-24 18:45:27 585
原创 Seata中AT模式的实现原理04-GlobalLock的作用
Seata(AT 模式)的默认全局隔离级别是 读未提交如果应用在特定场景下,必需要求全局的 读已提交 ,目前 Seata 的方式是通过 SELECT FOR UPDATE 语句的代理。SELECT FOR UPDATE 语句的执行会申请 全局锁 ,如果 全局锁 被其他事务持有,则释放本地锁(回滚 SELECT FOR UPDATE 语句的本地执行)并重试。这个过程中,查询是被 block 住的,直到 全局锁 拿到,即读取的相关数据是 已提交 的,才返回。
2023-12-21 14:47:23 965
原创 Seata中AT模式的实现原理03-二阶段提交
1.当一阶段提交没有任何异常情况下进行二阶段提交 TM会发送提交全局事务请求给TC2.TC接收到全局事务提交请求之后会循环所有的分支事务 往RM发送分支事务提交的请求3.RM接收到分支事务提交请求之后会委派给AsyncWorker去处理 从阻塞队列里面拿数据4.AsyncWorker处理的时候其实就是将undo_log的数据删除5.当RM处理完之后返回TC 然后会将全局锁删除 就是 lock_table表数据6.将分支事务状态变为二阶段已提交。
2023-12-21 14:47:11 1069
原创 Seata中AT模式的实现原理02-RM分支事务提交
1.项目启动的时候会为DataSource做增强 当全局事务开启之后执行业务代码的时候会进到DataSource的代理中然后由执行器去做语句的执行2.开启本地事务3.在执行业务语句之前会构建前置镜像 其实就相当于一个 select id from test where 修改条件/删除条件 = xxx for uodate 用于在后续的事务提交中提供数据的一致性保证。以便在事务提交时使用这个镜像来比较和确认事务是否能够成功提交。4. 然后会执行业务代码。
2023-12-21 14:46:59 915
原创 Seata中AT模式的实现原理01-TM开启全局事务
1.项目启动的时候会由SpringBoot自动装配机制把GlobalTransactionScanner装配进spring容器中去做增强并会注入一个全局事务的拦截器2.当有标准了GlobalTransactional的方法被执行的时候会通过拦截器进行拦截进行全局事务的开启3.开启全局事务的之前会先根据不同的事务隔离级别去做不同的处理4.然后TM会通过Netty发送一个开启全局事务的请求到TC。
2023-12-21 14:46:44 906
原创 Seata客户端启动流程
1.客户端启动的时候会通过SpringBoot的自动装配机制加载配置类2.设置RestTemplate的拦截器用来拦截所有mvc请求 和Feign的拦截器拦截Feign请求设置全局事务ID3.初始化TM(事务管理者) RM(资源管理者) 建立Netty客户端的通道并启动4.注册TM 和RM到SeataServer。
2023-12-15 15:16:02 187
原创 Seata服务端启动流程
1.解析registry.conf、file.conf等配置文件2.创建一个监控,做metric指标采集3.创建SeataNettyServer服务端(TC事务协调器) 并设置一个Handler用来处理AT、TCC、SAGA等不同事务类型的逻辑处理4.设置事务持久化方式5.设置全局锁的管理器6.启动Seata服务端 建立和客户端的通道 默认端口为8091。
2023-12-15 11:21:00 361
原创 Nacos源码解读12——Nacos中长连接的实现
就比如在飞机上想上厕所 却发现厕所有人需要等待 但是你又不想在那等 就只能回去等 ,但是过一段时间在去 还有人 在接着回去 这么周而复始的去回。
2023-12-10 20:19:45 1274
原创 Nacos源码解读10——配置中心的客户端怎么处理服务端推送的配置信息变更
客户端在启动的时候会构建一个ConfigService的处理类,然后再ConfigService的构造,方法中会创建一个ClientWorker 用来处理对服务端的网络通信及后续变更处理,
2023-12-10 17:32:12 289
原创 Nacos源码解读11——客户端怎么读取最新的配置信息
1.springboot启动的时候会通过自动注入 将NacosPropertySourceLocator注入到bean容器中 然后会调用到locate方法中进行配置的读取2.配置读取会先判断是否配置了自动刷新 如果没有配置则直接从缓存中读取3.如果配置了自动刷新 会先从本地快照中读取 如果读取到了就返回并加入到本地缓存中。
2023-12-10 17:31:33 282
原创 Nacos源码解读09——配置中心配置信息创建修改怎么处理的
1.当从服务端进行配置的新增和修改会先将数据给持久化到内嵌的数据源或者外部的比如mysql中2.然后发送配置变更的事件会将配置通过GRPC协议同步给连接自己的cleint端 和连接集群中其他节点的客户端。
2023-12-10 09:14:12 294
原创 Nacos源码解读08——集群节点间的健康检查
1.当在集群模式的情况下 每个集群节点启动的时候会启动一个定时的线程池去执行心跳任务 第一次延迟五秒执行每一轮频率为2秒 他会去把除了自己节点外的全部其他集群节点查出来然后挨个去发信号,如果成功则设置这个节点是可信任的,如果这个节点失败 则设置成不可信任的 然后会去重试 如果超过了三次重试都是失败 则会把这个节点设置成down2.当集群中有节点下线或者新节点上线都会通过心跳健康检查探测对节点状态进行改变。
2023-12-09 10:37:32 178
原创 Nacos源码解读07——集群数据同步
Distro 协议是 Nacos 对于临时实例数据开发的⼀致性协议。其数据存储在缓存中,并且会在启动时进行全量数据同步,并定期进行数据校验在 Distro 协议的设计思想下,每个 Distro 节点都可以接收到读写请求。所有的 Distro 协议的请当该节点接收到属于该节点负责的实例的写请求时,直接写入。当该节点接收到不属于该节点负责的实例的写请求时,将在集群内部路由,转发给对应的节点,从而完成读写。当该节点接收到任何读请求时,都直接在本机查询并返回(因为所有实例都被同步到了每台机。
2023-12-08 14:08:33 506
原创 Nacos源码解读06——服务健康检查
1.服务端主动探活每3s检测所有超过20s没发生过通讯的客户端,向客户端发起ClientDetectionRequest探测请求,如果客户端在1s内成功响应,则检测通过,否则执行unregister方法移除Connection。2.客户端也会每5s主动探测超过5s空闲的长连接是否存活。当长连接断开,客户端会主动向服务端发起重连。
2023-12-04 21:18:27 554
转载 Nacos源码解读05——Client本地缓存和故障转移
ServiceInfoHolder是服务信息的拥有者 ,比如服务注册,客户端从注册中心拉取服务新的服务信息时都会调用该类的。processServiceInfo方法在前面的文章中出现过多次 他主要是来进行本地化的处理,包括更新缓存服务、发布事件、更新本地文件等操作。
2023-12-03 16:53:27 757
原创 Nacos源码解读04——服务发现
项目启动的时候会通过自动注入的机制将NacosDiscoveryClientConfiguration注入当注入NacosDiscoveryClientConfiguration的时候会将DiscoveryClient一起注入BeanDiscoveryClient实现了SpringCloud的DiscoveryClient接口,重点是getInstances和getServices方法,而且都是由NacosServiceDiscovery实现。
2023-12-03 11:22:49 489
原创 Nacos源码解读02——服务事件处理
processTasks会遍历所有任务然后执行processor 的process方法因为在PushDelayTaskExecuteEngine构造方法中创建DefaultTaskProcessor是PushDelayTaskExecuteEngine这个类所以会执行PushDelayTaskExecuteEngine的process方法。当有任务需要执行的时候会执行ProcessRunnable 的run方法执行processTasks方法。在连接server时绑定相关事件。往任务线程池中添加任务。
2023-12-02 20:48:43 163
原创 Nacos源码本地搭建流程及目录结构解读
Dnacos.home=D:\java\alibaba\nacos-2.1.0\8850\ (存储源码路径)当控制台没有报错 访问 http://localhost:8848/nacos 控制台界面登录进来之后显示。然后再vm中配置参数-Dnacos.standalone=true表示单机启动。将nacos-mysql 的sql文件导入数据库中用来记录nacos的一些信息。在根路径下根据该截图中的路径创建cluster.conf文件。然后分别启动三个服务自此启动成功。复制多个端口 设置VM信息。
2023-11-28 14:01:58 317
转载 Nacos架构
注册中心是服务实例信息的存储仓库,也是服务提供者和服务消费者进行交互的桥梁。它主要提供了服务注册和服务发现这两大核心功能服务提供者把自己注册到注册中心上、服务消费者就可以从注册中心找到该服务提供者的实例信息 从而调用服务提供者的接口获取信息使用微服务就意味着要将单体应用中的业务拆分成一个个的子服务,每个服务的粒度相对较小,因此,系统中将会出现大量的服务。由于每一个服务都需要必要的配置信息才能运行,所以也将会产生大量的配置文件,所以有一套对配置文件进行集中式、动态式的管理的设施就必不可少了。
2023-11-27 13:45:18 198
原创 深入理解ThreadLocal
ThreadLocal是JDK包提供的,ThreadLocal 提供了一种变量与线程绑定的机制,它提供线程本地变量,比如在线程A中设置了一个变量ThreadLocalA 其中存储的值为ABC 在线程B中想拿到ThreadLocalA 中存储的ABC是拿不到的返回结果是空。如下图所示:每个线程的值只能自己线程访问到 其他线程拿不到,这样就实现了隔离。
2023-10-27 13:43:15 64
原创 “深入探讨Java JUC中的ReentrantLock锁:实现多线程同步与并发控制“
ReentrantLock 是 Java 中的一种锁实现,它提供了与传统的 synchronized 关键字相似的功能,但具有更多的灵活性和控制能力。
2023-10-24 20:42:39 305
原创 掌握Java中的volatile关键字
CPU缓存一致性问题是指在多处理器或多核系统中,每个处理器核心具有自己的高速缓存(Cache),而共享相同主内存(Main Memory)的数据可能存在多个缓存中的不一致性。这可能导致在并发多线程或多进程环境中,数据的不一致性和错误结果。Processor02修改缓存x=20的值改为40 同步到本地缓存行 但是没同步到主内存中 所以Processor0读到的还是X=20是之前的值所以造成了缓存的不一致性cpu与内存 输出/输入设备传递信息的公共通道 当cpu访问内存进行数据交互时 必须经过总线来传输。
2023-10-21 18:53:53 187 1
原创 原子类在多线程编程中的重要性
原子类是Java中的一组类,用于实现多线程环境下的原子操作。原子操作是一种不可分割的操作,它要么完全执行,要么完全不执行,不会被其他线程中断。原子类通过使用底层的硬件原语或锁机制来确保多线程访问时的数据安全性。
2023-10-17 10:39:51 100
原创 深入了解CAS(Compare and Swap):Java并发编程的核心
ABA问题是一种在并发编程中常见的问题,它涉及到CAS(Compare and Swap)操作。ABA问题的核心是在一个线程尝试修改共享变量时,共享变量的值从A变为B,然后再变回A。这种情况可能导致CAS操作成功,尽管在中间发生了其他操作,从而引发意外的行为。具体来说,ABA问题的情况如下:线程T1读取共享变量的值A,并保存在本地。在此期间,线程T2修改共享变量的值,将其从A改为B,然后再改回A。线程T1尝试使用CAS操作将共享变量的值从A改为新值C。
2023-10-16 14:17:01 470
原创 深入理解 Java 中的 synchronized 关键字
JMM(Java Memory Model,Java 内存模型)是一种规范,用于定义多线程程序中的内存访问规则和语义,确保多线程程序的正确性和可移植性。JMM 定义了线程如何与主内存和工作内存交互,以及如何确保多线程程序中的内存可见性和一致性。偏向锁(Biased Locking)是Java中用于提高单线程访问同步块的性能的一种锁机制。它的核心思想是,当一个线程第一次访问一个同步块时,虚拟机会将锁对象标记为偏向锁,并记录获取锁的线程ID。
2023-10-15 16:12:02 120
原创 理解并发编程:提高性能与效率的关键
并发编程是一种编程范式,旨在有效地处理多个任务同时执行的情况。在计算机科学中,"并发"指的是在相同时间段内执行多个任务或操作,而不是一次执行一个任务。并发编程的主要目标是充分利用计算机系统的多核处理器和资源,以提高程序的性能和效率。
2023-10-12 16:33:53 254
原创 深入了解线程:并发编程的核心要点和应用
用户级线程(User-Level Threads)是在用户空间(用户程序的地址空间)中由线程库(Thread Library)提供支持的线程。这种线程的创建、调度和管理都在用户空间进行,而不需要内核(操作系统)的干预。用户级线程是与操作系统无关的,操作系统并不知道它们的存在。在Java中,用户级线程通常是通过使用线程库或第三方框架来实现的,而不是使用标准的Thread类。一个常见的用户级线程库是协程库,如Quasar或Project Loom。这些库提供了在用户空间中实现用户级线程的功能。
2023-10-12 16:31:48 129
原创 深入了解进程:计算机中的任务管理与隔离
进程控制(Process Control)是指操作系统通过管理和协调进程的创建、调度、同步、通信和终止等活动,以确保系统资源的有效利用和进程之间的有序协作。进程控制涉及到操作系统如何创建、暂停、终止、调度和同步多个进程,以及如何在进程之间进行通信。进程通信 是指两个进程之间产生数据交互进程调度(Process Scheduling)是操作系统的核心功能之一,它指的是操作系统决定哪个进程获得CPU时间并在CPU上执行的过程。
2023-10-12 09:26:22 354
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人