-
【生产复盘】看起来完美的Seata分布式事务,为什么还是丢了数据?
背景随着业务体量的增长,我们近期完成了交易核心链路的微服务拆分。为了在保证性能的同时维持数据一致性,我们经过调研,最终锁定了 Seata (AT模式) 作为分布式事务解决方案。 目前的业务场景是:用户下单(OrderService)-> 扣减积分(PointsService)。看似简单的链路,上线后却收到了客诉:订单创建成功了,但积分没扣。 首先我们来分析一下接入Seata后的理想通讯... -
看起来“无侵入”的Seata AT模式,真的能直接上生产吗?
背景随着公司业务体量的增长,我们将核心交易系统从单体架构拆分为微服务架构。在拆分过程中,跨服务的数据库事务一致性成为了必须跨越的鸿沟。 经过对 XA、TCC、Saga 等主流方案的调研,鉴于团队目前的开发人力资源以及对旧系统的兼容需求,我们锁定了号称“零代码侵入”的 Seata AT 模式。 官方文档看起来非常美好:只需要一个注解 @GlobalTransactional,就能像使用本地事务... -
声明式接口调用:Feign源码剖析(4)Feign与Eureka、Ribbon整合原理
其实我们上文已经剖析到了Feign整合Ribbon后是依赖Ribbon的
ZoneAwareLoadBalancer从ServerList中选出一个Server后,再替换服务名为IP+Port,然后调用Feign底层的HTTP客户端发起最后的真实的请求。 -
声明式接口调用:Feign源码剖析(3)Feign是如何处理请求的
上文已经完整的分析了FeignClient被创建的过程,每个服务消费者被注入的ServiceAClient,其实都是他的动态代理实例,对ServiceAClient的任何方法调用,都会被委托给动态代理实例来完成,也就是
SynchronousMethodHandler#invoke方法。本文就分析一下该方法的执行原理 -
声明式接口调用:Feign源码剖析(2)基于JDK动态代理构建FeignClient的过程
上文我们已经分析到
FeignClientFactoryBean#getTarget()方法,这里完成了FeignClient动态代理的创建。但并未分析具体的创建过程,本文将深入Feign Core将FeignClient到底是如何被创建出来的给摸清楚。 -
负载均衡:Ribbon总结
终于,到了和Ribbon系列说再见的时候,笔者任务Ribbon的源码逻辑虽然比Eureka简单一些,但与Spring集成上稍微有点儿绕,主要是自动配置的执行顺序那块儿,如果采用静态代码阅读的方式的话,很难发现问题。不过,这也让笔者对Spring的自动配置机制有了更深的了解。