HttpClient
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支 持 Http 协 议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。 HttpClient 相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变得容易,提高 了开发的效率。
Okhttp
一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代
HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持多种 协议 ( HTTP/2 和 SPDY)。
HttpURLConnection
HttpURLConnection 是 Java 的标准类,它继承自 URLConnection,可用于向指定网站发送 GET 请求、 POST 请求。 HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使用。
RestTemplate
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端, RestTemplate 提供了多种便捷访 问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。
21、谈谈Sentienl中使用的限流算法, Sentinel哪里对这算法进行应用
1、计数器固定窗口算法
计数器固定窗口算法是最简单的限流算法,实现方式也比较简单。就是通过维护一个单位时间内的计数 值,每当一个请求通过时,就将计数值加1,当计数值超过预先设定的阈值时,就拒绝单位时间内的其 他请求。如果单位时间已经结束,则将计数器清零,开启下一轮的计数。
但是这种实现会有一个问题,举个例子:
假设我们设定1s内允许通过的请求阈值是100,如果有用户在时间窗口的最后几毫秒发送了99个 请求,紧接着又在下一个时间窗口开始时发送了99个请求,那么这个用户其实在一秒显然超过了 阈值但并不会被限流。其实这就是临界值问题,那么临界值问题要怎么解决呢?
图中将窗口划为5份,每个小窗口中的数字表示在这个窗口中请求数,所以通过观察上图,可知在当前 时间块(200毫秒)允许通过的请求数应该是70而不是200 (只要超过70就会被限流),因为我们最终 统计请求数时是需要把当前窗口的值进行累加,进而得到当前请求数来判断是不是需要进行限流。
图中将窗口划为5份,每个小窗口中的数字表示在这个窗口中请求数,所以通过观察上图,可知在当前 时间块(200毫秒)允许通过的请求数应该是70而不是200 (只要超过70就会被限流),因为我们最终 统计请求数时是需要把当前窗口的值进行累加,进而得到当前请求数来判断是不是需要进行限流。
细心观察的我们应该能马上发现问题, 滑动窗口限流法其实就是计数器固定窗口算法的一个变种。流量 的过渡是否平滑依赖于我们设置的窗口格数也就是统计时间间隔,格数越多,统计越精确,但是具体要 分多少格我们也说不上来呀...
细心观察的我们应该能马上发现问题, 滑动窗口限流法其实就是计数器固定窗口算法的一个变种。流量 的过渡是否平滑依赖于我们设置的窗口格数也就是统计时间间隔,格数越多,统计越精确,但是具体要 分多少格我们也说不上来呀...
漏桶算法的特点
漏桶算法的特点
漏桶算法的特点
漏桶算法的特点
漏桶算法的特点
漏桶算法的特点
漏桶算法的特点
漏桶算法的特点
漏桶算法的特点
漏桶具有固定容量,出口流量速率是固定常量(流出请求)
入口流量可以以任意速率流入到漏桶中(流入请求)
如果入口流量超出了桶的容量,则流入流量会溢出(新请求被拒绝)
不过因为漏桶算法限制了流出速率是一个固定常量值、所以漏桶算法不支持出现突发流出流量。但是在 实际情况下、流量往往是突发的。
4、令牌桶算法
令牌桶算法是漏桶算法的改进版,可以支持突发流量。不过与漏桶算法不同的是,令牌桶算法的漏桶中 存放的是令牌而不是流量。
那么令牌桶算法是怎么突发流量的呢?
最开始,令牌桶是空的,我们以恒定速率往令牌桶里加入令牌,令牌桶被装满时,多余的令牌会被丢
弃。当请求到来时,会先尝试从令牌桶获取令牌(相当于从令牌桶移除一个令牌),获取成功则请求被 放行,获取失败则阻塞活拒绝请求。
令牌桶算法的特点
令牌桶算法的特点
最多可以存发b个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃
每当一个请求过来时,就会尝试从桶里移除一个令牌,如果没有令牌的话,请求无法通过。
令牌桶算法限制的是平均流量、因此其允许突发流量(只要令牌桶中有令牌、就不会被限流)
流控效果:
快速失败(默认) :滑动时间窗口、 WarmUp:令牌桶算法、 排队等待:漏斗算法
22、谈谈Sentienl服务熔断过程
服务熔断一般有三种状态:
熔断关闭状态(Closed)
服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。
熔断开启状态(Open)
后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。
半熔断状态(Half-Open)
尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说 明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断关闭状态。
23、请说一下CAP和BASE理论
23、请说一下CAP和BASE理论
CAP和BASE是分布式必备理论基础
CAP和BASE是分布式必备理论基础
1、 CAP理论
这个定理的内容是指的是在一个分布式系统中、Consistency(一致性)、 Availability (可用性)、 Partition tolerance(分区容错性),三者不可得兼。
这个定理的内容是指的是在一个分布式系统中、Consistency(一致性)、 Availability (可用性)、 Partition tolerance(分区容错性),三者不可得兼。
一致性(C)
一致性意思就是写操作之后进行读操作无论在哪个节点都需要返回写操作的值
可用性(A)
非故障的节点在合理的时间内返回合理的响应
分区容错性(P)
当出现网络分区后,系统能够继续工作。打个比方,这里个集群有多台机器,有台机器网络出现了 问题,但是这个集群仍然可以正常工作。
在分布式系统中,网络无法100%可靠,分区其实是一个必然现象,如果我们选择了CA而放弃了P,那 么当发生分区现象时,为了保证一致性,这个时候必须拒绝请求,但是A又不允许,所以分布式系统理 论上不可能选择CA架构,只能选择CP或者AP架构。
对于CP来说,放弃可用性,追求一致性和分区容错性,我们的zookeeper其实就是追求的强一致。
对于AP来说,放弃一致性(这里说的一致性是强一致性),追求分区容错性和可用性, Nacos就是AP模 式,这是很多分布式系统设计时的选择,后面的BASE也是根据AP来扩展。
2、 BASE理论
BASE是Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致 性)三个短语的缩写。 BASE理论是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统 分布式实践的总结, 是基于CAP定理逐步演化而来的。 BASE理论的核心思想是: 即使无法做到强一致 性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
BASE是Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致 性)三个短语的缩写。 BASE理论是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统 分布式实践的总结, 是基于CAP定理逐步演化而来的。 BASE理论的核心思想是: 即使无法做到强一致 性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
基本可用
基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性—-注意,这绝不等价 于系统不可用。比如:
(1)响应时间上的损失。正常情况下, 一个在线搜索引擎需要在0.5秒之内返回给用户相应的查询 结果,但由于出现故障,查询结果的响应时间增加了1~2秒
(2)系统功能上的损失:正常情况下,在一个电子商务网站上进行购物的时候,消费者几乎能够 顺利完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保
(2)系统功能上的损失:正常情况下,在一个电子商务网站上进行购物的时候,消费者几乎能够 顺利完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保
护购物系统的稳定性,部分消费者可能会被引导到一个降级页面
软状态
软状态指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性, 即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时
最终一致性
最终一致性强调的是所有的数据副本,在经过一段时间的同步之后,最终都能够达到一个一致的状 态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据 的强一致性。
请简述2PC流程以及优缺点
TM(Transaction Manager)是一种软件组件,它负责协调和管理分布式事务的执行。在分布式系统中,多个应用程序可能需要访问和更新共享数据,但是保证数据的一致性是一个挑战。TM通过协调不同应用程序的操作,确保分布式事务的原子性、一致性、隔离性和持久性(ACID属性)。因此,TM也被称为协调器。
RM(Resource Manager)是一种软件组件,它负责管理和控制分布式系统中的资源。资源可以是数据库、消息队列、文件、网络连接等。RM通过与TM通信,实现对资源的锁定、解锁和提交等操作,以确保分布式事务的正确执行。因此,TM和RM通常一起使用,来描述分布式系统中的工作流程。
1.2 优缺点
1.2 优缺点
1.2 优缺点
1.2 优缺点
1.2 优缺点
1.2 优缺点
优点: 尽量保证了数据的强一致,实现成本较低,在各大主流数据库都有自己实现,对于MySQL是从 5.5开始支持(XA)。
缺点:
单点问题:事务管理器在整个流程中扮演的角色很关键,如果其宕机,比如在第一阶段已经完成,
在第二阶段正准备提交的时候事务管理器宕机,资源管理器就会一直阻塞,导致数据库无法使用。 同步阻塞:在准备就绪之后,资源管理器中的资源一直处于阻塞,直到提交完成,释放资源。
数据不一致:两阶段提交协议虽然为分布式数据强一致性所设计,但仍然存在数据不一致性的可
能,比如在第二阶段中,假设协调者发出了事务commit的通知,但是因为网络问题该通知仅被一 部分参与者所收到并执行了commit操作,其余的参与者则因为没有收到通知一直处于阻塞状态, 这时候就产生了数据的不一致性。
2、3PC
CanCommit:协调者向所有参与者发送CanCommit命令,询问是否可以执行事务提交操作。如果全 部响应YES则进入下一个阶段。
CanCommit:协调者向所有参与者发送CanCommit命令,询问是否可以执行事务提交操作。如果全 部响应YES则进入下一个阶段。
CanCommit:协调者向所有参与者发送CanCommit命令,询问是否可以执行事务提交操作。如果全 部响应YES则进入下一个阶段。
CanCommit:协调者向所有参与者发送CanCommit命令,询问是否可以执行事务提交操作。如果全 部响应YES则进入下一个阶段。
CanCommit:协调者向所有参与者发送CanCommit命令,询问是否可以执行事务提交操作。如果全 部响应YES则进入下一个阶段。
CanCommit:协调者向所有参与者发送CanCommit命令,询问是否可以执行事务提交操作。如果全 部响应YES则进入下一个阶段。
PreCommit: 协调者 向所有 参与者发送 PreCommit命令,询问是否可以进行事务的预提交操作,参 与者接收到PreCommit请求后,如参与者成功的执行了事务操作,则返回 Yes 响应,进入最终commit 阶段。 一旦参与者中有向协调者发送了 No 响应,或因网络造成超时,协调者没有接到参与者的响应,
协调者向所有参与者发送 abort请求,参与者接受abort命令执行事务的中断。
DoCommit: 在前两个阶段中所有参与者的响应反馈均是 YES 后,协调者向参与者发送 DoCommit命 令正式提交事务,如协调者没有接收到参与者发送的ACK响应,会向所有参与者发送 abort请求命
令,执行事务的中断
2.2 优缺点
优点:
1、引入超时机制。解决了事务管理器突然宕机导致资源一直处于阻塞的问题
2、多了一次询问阶段。防止个别参与者不正常的情况下,其他参与者都执行了事务,锁定资源。
缺点:
1、 3PC 用超时机制,同步阻塞问题,但与此同时却多了一次网络通信,性能上反而变得更差,也不太 推荐。
2、没有解决数据不一致的问题
25、 Seata支持那些事务模式?
25、 Seata支持那些事务模式?
25、 Seata支持那些事务模式?
概念: Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。 Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
这四种模式2PC (两阶段提交)
AT模式:提供无侵入自动补偿的事务模式 【这里是基于本地能支持事务的关系型数据库,然后java 代码可以通过JDBC访问数据库, 这里的无侵入:我们只需要加上对应的注解就可以开启全局事
务】
XA模式:支持已实现XA接口的数据库的XA模式【这里一般是需要数据库实现对应的XA模式的接 口, 一般像 mysql oracle 都实现了XA】
· TCC模式:TCC则可以理解为在应用层面的 2PC ,是需要我们编写业务逻辑来实现。 SAGA模式:为长事务提供有效的解决方案
26、简述Seata的AT模式两阶段过程
两阶段提交协议的演变:
一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
二阶段:
提交异步化,非常快速地完成。
○ 回滚通过一阶段的回滚日志进行反向补偿。
第一阶段
业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。核心在于对业务sql进行 解析,转换成undolog,并同时入库,这是怎么做的呢?先抛出一个概念DataSourceProxy代理数据 源,通过名字大家大概也能基本猜到是什么个操作,后面做具体分析
第二阶段
分布式事务操作成功,则TC通知RM异步删除undolog
Seata的AT模式
27、 Seata中xid怎样通过Feign进行全局传递
27、 Seata中xid怎样通过Feign进行全局传递
27、 Seata中xid怎样通过Feign进行全局传递
28、 Seata TCC 模式设计思路
28、 Seata TCC 模式设计思路
29、 TCC存在的问题
如上图所示,参与者 A 执行完二阶段之后,由于网络抖动或者宕机问题,会造成 TC 收不到参与者 A 执 行二阶段的返回结果, TC 会重复发起调用,直到二阶段执行结果成功。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
如上图所示,在执行参与者 A 的一阶段 Try 方法时,出现网路拥堵,由于 Seata 全局事务有超时限制, 执行 Try 方法超时后, TM 决议全局回滚,回滚完成后如果此时 RPC 请求才到达参与者 A,执行 Try 方 法进行资源预留,从而造成悬挂。
Seata 是怎么处理悬挂的呢?
在 TCC 事务控制表记录状态的字段 status 中增加一个状态:
suspended :4
当执行二阶段 Cancel 方法时,如果发现 TCC 事务控制表没有相关记录,说明二阶段 Cancel 方法优先 一阶段 Try 方法执行,因此插入一条 status=4 状态的记录,当一阶段 Try 方法后面执行时,判断
status=4 ,则说明有二阶段 Cancel 已执行,并返回 false 以阻止一阶段 Try 方法执行成功。
30、 Gateway核心概念
路由(route)
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组谓 词工厂、 一组Filter组
成。如果谓词为真,则说明请求的URL和配置的路由匹配。
谓词(predicates)
即java.util.function.Predicate , Spring Cloud Gateway使用Predicate实现路由的匹配条件。
过滤器(Filter)
SpringCloud Gateway中 的filter分为Gateway FilIer和Global Filter。 Filter可以对请求和响应进 行处理。
【路由就是转发规则,谓词就是是否走这个路径的条件,过滤器可以为路由添加业务逻辑,修改请 求以及响应】
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发 送到网关 Web 处理程序,此时处理程序运行特定的请求过滤器链。
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发 送到网关 Web 处理程序,此时处理程序运行特定的请求过滤器链。
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发 送到网关 Web 处理程序,此时处理程序运行特定的请求过滤器链。
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发 送到网关 Web 处理程序,此时处理程序运行特定的请求过滤器链。
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发 送到网关 Web 处理程序,此时处理程序运行特定的请求过滤器链。
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发 送到网关 Web 处理程序,此时处理程序运行特定的请求过滤器链。
过滤器之间用虚线分开的原因是过滤器可能会在发送代理请求的前后执行逻辑。所有 pre 过滤器逻辑先 执行,然后执行代理请求;代理请求完成后,执行 post 过滤器逻辑。
32、在Gateway中怎样实现服务平滑迁移?
32、在Gateway中怎样实现服务平滑迁移?
32、在Gateway中怎样实现服务平滑迁移?
使用Weight路由的断言工厂进行服务权重的配置,并将配置放到Nacos配置中心进行动态迁移
Weight路由断言工厂
规则:
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
zuul Servlet 就是一个过滤器 ,其实Zuul就是一个servlet和一堆过滤器的组成,他的内容很少, 请求 进入过滤器,然后进入ZullFilter Runner中会选择一个filter进行调用,这里面有前置路由过滤器、路由 中过滤器、后置路由过滤器 三个。
这里注意个问题: