seata openfeign 实现传播xid源码解析
依赖
com.alibaba.cloud:spring-cloud-starter-alibaba-seata:2021.1
源码
- 自动配置
- 注册FEIGN对象包装器
- 注册BEAN后处理器,包装FeignClient
- 注册BEAN后处理器,包装FeignContext
com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Client.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class SeataFeignClientAutoConfiguration {...
@Configuration(proxyBeanMethods = false)protected static class FeignBeanPostProcessorConfiguration {// 处理FeignClient 对象@BeanSeataBeanPostProcessor seataBeanPostProcessor(SeataFeignObjectWrapper seataFeignObjectWrapper) {return new SeataBeanPostProcessor(seataFeignObjectWrapper);}// 处理FeignContext 对象@BeanSeataContextBeanPostProcessor seataContextBeanPostProcessor(BeanFactory beanFactory) {return new SeataContextBeanPostProcessor(beanFactory);}// FeignClient 对象包装器@BeanSeataFeignObjectWrapper seataFeignObjectWrapper(BeanFactory beanFactory) {return new SeataFeignObjectWrapper(beanFactory);}}
...
}
- 包装FeignClient
使用SeataFeignBlockingLoadBalancerClient包装FeignBlockingLoadBalancerClient
使用SeataFeignClient包装其他Client
com.alibaba.cloud.seata.feign.SeataFeignObjectWrapper
Object wrap(Object bean) {if (bean instanceof Client && !(bean instanceof SeataFeignClient)) {if (bean instanceof FeignBlockingLoadBalancerClient) {FeignBlockingLoadBalancerClient client = (FeignBlockingLoadBalancerClient) bean;return new SeataFeignBlockingLoadBalancerClient(client.getDelegate(),beanFactory.getBean(BlockingLoadBalancerClient.class),beanFactory.getBean(LoadBalancerProperties.class),beanFactory.getBean(LoadBalancerClientFactory.class),this);}return new SeataFeignClient(this.beanFactory, (Client) bean);}return bean;
}
- 包装FeignContext
使用SeataFeignContext包装FeignContext
com.alibaba.cloud.seata.feign.SeataContextBeanPostProcessor
public Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {if (bean instanceof FeignContext && !(bean instanceof SeataFeignContext)) {return new SeataFeignContext(getSeataFeignObjectWrapper(),(FeignContext) bean);}return bean;
}
- SeataFeignClient
将XID写入header
com.alibaba.cloud.seata.feign.SeataFeignClient
private Request getModifyRequest(Request request) {String xid = RootContext.getXID();if (StringUtils.isEmpty(xid)) {return request;}Map<String, Collection<String>> headers = new HashMap<>(MAP_SIZE);headers.putAll(request.headers());List<String> seataXid = new ArrayList<>();seataXid.add(xid);headers.put(RootContext.KEY_XID, seataXid);return Request.create(request.method(), request.url(), headers, request.body(),request.charset());
}
seata openfeign 实现传播xid源码解析相关推荐
- seata http rpc获取全局事务xid源码解析
事务传播拦截器 从请求header中获取远程调用xid io.seata.integration.http.TransactionPropagationInterceptor public class ...
- Seata - @GlobalTransactional源码解析
脑图 核心 Seata三大角色 TC :事务协调者,netty server(服务器) TM :事务管理器,netty client(客户端) RM: 资源管理器,netty client(客户端) ...
- [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎
[源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 文章目录 [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 0x00 摘要 0x01 前文回顾 1.1 ...
- yolov3之pytorch源码解析_springmvc源码架构解析之view
说在前面 前期回顾 sharding-jdbc源码解析 更新完毕 spring源码解析 更新完毕 spring-mvc源码解析 更新完毕 spring-tx源码解析 更新完毕 spring-boot源 ...
- dataset__getitem___PyTorch源码解析与实践(1):数据加载Dataset,Sampler与DataLoader
献给学习PyTorch在路上或者计划较深入理解PyTorch的同行者们 写在前面 笔者一直使用tf,大势所趋决定转PyTorch,这个系列就作为我学习PyTorch的笔记与心得. 网络上PyTorch ...
- 死磕 java同步系列之ReentrantReadWriteLock源码解析
问题 (1)读写锁是什么? (2)读写锁具有哪些特性? (3)ReentrantReadWriteLock是怎么实现读写锁的? (4)如何使用ReentrantReadWriteLock实现高效安全的 ...
- Android之LocalBroadcastManager源码解析
转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 广播想必大家都不陌生,日常开发中同一个APP中的多个进程之间需要进行传输信息 ...
- The Wide and Deep Learning Model(译文+Tensorlfow源码解析) 原创 2017年11月03日 22:14:47 标签: 深度学习 / 谷歌 / tensorf
The Wide and Deep Learning Model(译文+Tensorlfow源码解析) 原创 2017年11月03日 22:14:47 标签: 深度学习 / 谷歌 / tensorfl ...
- 【原创】jQuery1.8.2源码解析之jQuery.event
本片随笔主要是分析了下jQuery的事件模型,即如何统一事件对象,以及处理过程. 这里简要说明一下几点: jQuery通过统一的方法(第62行),eventHandle函数进行事件的分发,利用jQue ...
最新文章
- C#实现MVC模式简要方法(2)
- 新闻发布项目——实体类(categoryTB)
- 迪普交换机清空配置_交换机环路详解
- Qt工作笔记-QT_BEGIN_NAMESPACE与QT_END_NAMESPACE的理解
- 安卓移动应用开发实例_移动应用开发协会纳新 ||掌握信息,赢得未来
- 解决Hadoop总是处于安全模式的问题
- UIKit 框架之UIControl
- linux中文件输出输入,linux中文件输入输出的管理
- python序列操作_操作序列(python)
- Visual Studio部署HoloLens 找不到WindowsMobile SDK
- 多张tif图片合成一张tif图片
- apache的动态网站部署,discuz论坛系统和ecshop电商系统
- 一文详解传统金融与数字资产衍生品的区别
- 影视后期算不算计算机类专业,影视后期是什么意思(后期剪辑属于什么专业)...
- 狐友老欧头疼了一天,VFP转换成JSON格式总不对,竟是乱码惹的祸
- 第二次去苹果店维修MacBook
- Jackknife,Bootstrap, Bagging, Boosting, AdaBoost, RandomForest 和 Gradient Boosting的区别
- 常用Android第三方库推荐
- dva Reducers与Effects的使用介绍
- 豆粕止步5连跌关注USDA报告,甲醇认沽大倍,甲醇05-09季节性反套2022.3.31
热门文章
- 上交大计算机复试机师难不难,一个去年考交大复试被刷的人给大家一点建议(更新)...
- Word框选一整段文字如何防止框到换行符?word怎么在选择的时候不选择上换行符,word选中段尾不选回车符
- python文件之间如何互相通信_python学习1-网络编程之udp_创建socket实现两电脑之间的通信...
- CodeGuide 300+文档、100+代码库,一个指导程序员写代码的,Github 仓库开源啦
- 21个开源项目强烈建议收藏
- 阿里实习测评:扇形涂色问题
- 谁能成为物联网时代的“操作系统”?
- scp远程服务器拷贝到远程服务器
- [转载] 相机越贵画质越好?聊聊CMOS设计
- 【C语言】printf函数参数压栈问题