031、什么是 Hystrix?
服务熔断的意思是当某服务出现不可用或响应超时的情况时,为了防止整个服务出现雪崩,会暂停对该服务的调用。
服务降级指的是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。
Hystrix 提供的功能就是当服务 A 调用服务 B 失败次数达到一定阈值的时候,A 不会再去调用 B,而是会去执行本地的降级方法。
032、什么是网关?
网关就是一个专门处理外部请求的组件,一般都会提供请求转发、权限认证、流量控制、负载均衡、容灾、日志、监控这些功能。常见的网关有 Zuul 和 GateWay。
为什么要使用网关?
微服务下一个系统被拆分为多个服务,但是像安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现,而网关会对这些进行统一处理。
033、分布式 id 生成方案?
-
雪花算法
核心思想是:固定 id 为一个 long 型整数,也就是 64 位,第一位默认 0,随后的 41 位存储一个时间戳的差值(当前时间 - 固定时间),随后的 10 为表示机器 id,最后 12 位表示序列号,也就是说每台机器每毫秒可以生成 4096 个不同的 id。
具体实现有:百度的 uid-generator,美团的 leaf
-
Redis 实现分布式 id
利用Redis中的 incr 命令来实现原子性的自增与返回
034、分布式事务解决方案?
在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。
2PC,也就是两阶段提交
2PC 引入了协调者来协调参与者的行为,并最终决定参与者是否要提交事务,分为两个阶段来执行。
准备阶段:协调者询问参与者事务是否执行成功,然后参与者会返回事务执行结果。
提交阶段:如果事务上的所有参与者都执行成功了,那么协调者就会通知所有参与者提交事务;否则协调者就会通知所有参与者回滚事务。
缺点:参与者在等待其他参与者响应的时候一直占用着资源,却不做任何操作,资源浪费,影响性能;假如协调者出现问题,参与者收不到通知就会一直处于当前状态,无法完成事务;由于局部网络问题导致一些参与者没有收到提交或回滚的通知会造成数据不一致性。
TCC
TCC 是 Try - Confirm - Cancle 的首拼。
- Try 阶段:这个阶段是对各个服务的资源做检测以及对资源进行锁定或者预留。
- Confirm 阶段:这个阶段是在各个服务中执行实际的操作。
- Cancel 阶段:如果任何一个服务的业务方法执行出错,那么这里就需要进行补偿,就是执行已经执行成功的业务逻辑的回滚操作。(把那些执行成功的回滚)
一般来说跟钱相关的,跟钱打交道的,支付、交易相关的场景,会用 TCC,严格保证分布式事务要么全部成功,要么全部自动回滚,严格保证资金的正确性,保证在资金上不会出现问题。
举个例子,银行转账
try阶段:冻结银行资金
confirm阶段:调用银行 A 的接口扣款,调用银行 B 的接口收款
cancle阶段:如果confirm阶段都成功了,那么就不用补偿了,也就不用cancle阶段了,但如果confirm阶段有一个出现错误了,那么全部操作都要回滚
Saga 方案
业务流程中每个参与者都提交本地事务,若某一个参与者失败,则补偿前面已经成功的参与者,即依次进行回滚
对于业务流程长、不追求强一致性、只要最终一致性的场景使用Saga方案。
可靠消息最终一致性方案
A系统向mq发送一个prepared消息,如果这个消息发送成功那么就执行本地事务,如果本地事务执行失败则回滚,并告诉mq我执行失败了,你回滚消息吧;如果本地事务执行成功,那么就告诉mq我执行成功了,消息可以被消费了,然后B系统就会消费prepared消息执行本地事务,如果B系统执行本地事务失败了,可以自动不断重试,如果实在不行的话,就回滚,并通知A系统也回滚或者发送警报由人工来处理。
RocketMQ 就支持消息事务
035、什么是 CAP 理论?
- 一致性(Consistence) : 所有节点访问同一份最新的数据副本。
- 可用性(Availability): 非故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)。
- 分区容错性(Partition tolerance) : 分布式系统出现网络分区的时候,仍然能够对外提供服务。
CAP 理论是指当网络分区发生的时候,如果要继续服务,那么一致性和可用性只能选择一个。
也就是说只有 CP 和 AP 的架构。
AP 具体实现:Eureka
CP 具体实现:Zookeeper、Consul
036、拦截器和过滤器执行顺序?
先进入过滤器,执行chain.doFilter之前的逻辑,然后在调用controller之前,会先执行拦截器的preHandle方法,如果这个方法返回true,在执行完controller逻辑之后,方法返回之前会执行postHandle,return之后会执行afterCompletion,最后会执行chain.doFilter之后的逻辑。