Seata Client应用程序在启动的过程中如何做到以下几件事呢?
1、应用程序如何将注册TM 和 RM 到 Seata-Server中?
2、如何拦截GlobalTransactional注解并开启分布式事务?
带着以上疑问走读Seata Client核心代码,具体核心如下:
一、GlobalTransactionScanner 初始化
GlobalTransactionScanner 核心功能主要实现:
1、注册TM 和 RM
2、AOP 拦截 GlobalTransactional方法
通过Spring框架中的AbstractAutoProxyCreator.wrapIfNecessary 初始化拦截类:
AdapterSpringSeataInterceptor、ProxyInvocationHandler
二、GlobalTransactionalInterceptorHandler 拦截相关方法
三、TransactionalTemplate具体开启+提交+回滚分布式事务
四、其他的思考:AOP拦截方式AbstractAutoProxyCreator
AOP在Spring中实现有多种方式,其中常用的是采用 Aspect中 Around、Before、After、PointCut方式。
如果通过Aspect的Around进行拦截
@annotation GlobalTransactional 会带来什么弊端?
初步思考了一下,大概主要有以下几点考虑:
1、Seata 中需要排除一些Packages以及指定Packages,通过 Aspect的 @around、@before、@after配置会相对比较复杂
2、如果在 @around 拦截方法中进行排除和指定packages的判断,会消耗一定的性能。