依赖

com.alibaba.cloud:spring-cloud-starter-alibaba-seata:2021.1

源码

  • 自动配置
  1. 注册FEIGN对象包装器
  2. 注册BEAN后处理器,包装FeignClient
  3. 注册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源码解析相关推荐

  1. seata http rpc获取全局事务xid源码解析

    事务传播拦截器 从请求header中获取远程调用xid io.seata.integration.http.TransactionPropagationInterceptor public class ...

  2. Seata - @GlobalTransactional源码解析

    脑图 核心 Seata三大角色 TC :事务协调者,netty server(服务器) TM :事务管理器,netty client(客户端) RM: 资源管理器,netty client(客户端) ...

  3. [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎

    [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 文章目录 [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 0x00 摘要 0x01 前文回顾 1.1 ...

  4. yolov3之pytorch源码解析_springmvc源码架构解析之view

    说在前面 前期回顾 sharding-jdbc源码解析 更新完毕 spring源码解析 更新完毕 spring-mvc源码解析 更新完毕 spring-tx源码解析 更新完毕 spring-boot源 ...

  5. dataset__getitem___PyTorch源码解析与实践(1):数据加载Dataset,Sampler与DataLoader

    献给学习PyTorch在路上或者计划较深入理解PyTorch的同行者们 写在前面 笔者一直使用tf,大势所趋决定转PyTorch,这个系列就作为我学习PyTorch的笔记与心得. 网络上PyTorch ...

  6. 死磕 java同步系列之ReentrantReadWriteLock源码解析

    问题 (1)读写锁是什么? (2)读写锁具有哪些特性? (3)ReentrantReadWriteLock是怎么实现读写锁的? (4)如何使用ReentrantReadWriteLock实现高效安全的 ...

  7. Android之LocalBroadcastManager源码解析

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 广播想必大家都不陌生,日常开发中同一个APP中的多个进程之间需要进行传输信息 ...

  8. 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 ...

  9. 【原创】jQuery1.8.2源码解析之jQuery.event

    本片随笔主要是分析了下jQuery的事件模型,即如何统一事件对象,以及处理过程. 这里简要说明一下几点: jQuery通过统一的方法(第62行),eventHandle函数进行事件的分发,利用jQue ...

最新文章

  1. C#实现MVC模式简要方法(2)
  2. 新闻发布项目——实体类(categoryTB)
  3. 迪普交换机清空配置_交换机环路详解
  4. Qt工作笔记-QT_BEGIN_NAMESPACE与QT_END_NAMESPACE的理解
  5. 安卓移动应用开发实例_移动应用开发协会纳新 ||掌握信息,赢得未来
  6. 解决Hadoop总是处于安全模式的问题
  7. UIKit 框架之UIControl
  8. linux中文件输出输入,linux中文件输入输出的管理
  9. python序列操作_操作序列(python)
  10. Visual Studio部署HoloLens 找不到WindowsMobile SDK
  11. 多张tif图片合成一张tif图片
  12. apache的动态网站部署,discuz论坛系统和ecshop电商系统
  13. 一文详解传统金融与数字资产衍生品的区别
  14. 影视后期算不算计算机类专业,影视后期是什么意思(后期剪辑属于什么专业)...
  15. 狐友老欧头疼了一天,VFP转换成JSON格式总不对,竟是乱码惹的祸
  16. 第二次去苹果店维修MacBook
  17. Jackknife,Bootstrap, Bagging, Boosting, AdaBoost, RandomForest 和 Gradient Boosting的区别
  18. 常用Android第三方库推荐
  19. dva Reducers与Effects的使用介绍
  20. 豆粕止步5连跌关注USDA报告,甲醇认沽大倍,甲醇05-09季节性反套2022.3.31

热门文章

  1. 上交大计算机复试机师难不难,一个去年考交大复试被刷的人给大家一点建议(更新)...
  2. Word框选一整段文字如何防止框到换行符?word怎么在选择的时候不选择上换行符,word选中段尾不选回车符
  3. python文件之间如何互相通信_python学习1-网络编程之udp_创建socket实现两电脑之间的通信...
  4. CodeGuide 300+文档、100+代码库,一个指导程序员写代码的,Github 仓库开源啦
  5. 21个开源项目强烈建议收藏
  6. 阿里实习测评:扇形涂色问题
  7. 谁能成为物联网时代的“操作系统”?
  8. scp远程服务器拷贝到远程服务器
  9. [转载] 相机越贵画质越好?聊聊CMOS设计
  10. 【C语言】printf函数参数压栈问题