微服务面试题二

1.什么是雪崩

微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。

如何解决雪崩?

  1. 超时处理:请求超时就返回错误信息,不会无休止等待
  2. 仓壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。
  3. 断路器模式 :由断路器 统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。
  4. 流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。

2.Sentinel

2.1 什么是蔟点链路

当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路 。簇点链路中被监控 的每一个接口 就是一个资源

默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint,也就是controller中的方法),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。如果其他也想被监控,需要使用sentinel提供的@SentinelResource注解来完成。

2.2 如何使用sentinel

  1. 引依赖
xml 复制代码
<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 编写配置文案
yaml 复制代码
server:
  port: 8088
spring:
  cloud: 
    sentinel:
      transport:
        dashboard: localhost:8080
  1. 向Controller发送请求,才会被sentinel监控

2.3 什么是服务熔断?什么是服务降级?区别是什么

  1. 服务熔断是指,当服务A调用的某个服务B不可用时,上游服务A为了保证自己不受影响,从而不再调用服务B,直接返回⼀个结果,减轻服务A和服务B的压力,直到服务B恢复。
  2. 服务降级是指 ,当发现系统压力过载时,可以通过关闭某个服务,或限流某个服务来减轻系统压力,这就是服务降级。
    相同点:
    都是为了防⽌系统崩溃
    都让⽤户体验到某些功能暂时不可⽤
    不同点
    熔断是下游服务故障触发的,降级是为了降低系统负载

2.3.1 什么是线程隔离?

线程隔离:调用者在调用服务提供者时,给每个调用的请求分配独立线程池,出现故障时,最多消耗这个线程池内资源,避免把调用者的所有资源耗尽。

3 流量控制-流控模式

主要是设置QPS(每秒并发量)和线程数等参与保护应用

3.1 流控模式-直接

直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式

3.2 流控模式-关联模式

关联 :统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流

语法说明 :当/write资源访问量触发阈值时,就会对/read资源限流,避免影响/write资源。
使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。

3.3 流控模式-链路

链路 :统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

使用场景
:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流
代码实现:对需要实现的方法添加@SentinelResource,让他被监控

4 流量控制-流控效果

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

  • 快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
  • warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。
  • 排队等待:让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。

5 热点参数限流

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。

6 线程隔离

线程池隔离 :给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果
信号量隔离(sentinel默认):不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求。

7 熔断降级

熔断降级是解决雪崩问题的重要手段。其思路是由断路器 统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。

断路器控制熔断和放行是通过状态机来完成的:

状态机包括三个状态:

  • closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
  • open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态5秒后会进入half-open状态
  • half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
    • 请求成功:则切换到closed状态
    • 请求失败:则切换到open状态

断路器熔断策略有三种:慢调用、异常比例、异常数

7.1 慢调用

慢调用 :业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。
异常比例、异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断。

8 授权规则

授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。

相关推荐
工业甲酰苯胺27 分钟前
分布式系统架构:服务容错
数据库·架构
Java程序之猿2 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
Karoku0664 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
Yvemil74 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
小蜗牛慢慢爬行5 小时前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
思忖小下6 小时前
梳理你的思路(从OOP到架构设计)_简介设计模式
设计模式·架构·eit
Yvemil78 小时前
《开启微服务之旅:Spring Boot Web开发》(二)
前端·spring boot·微服务
维李设论8 小时前
Node.js的Web服务在Nacos中的实践
前端·spring cloud·微服务·eureka·nacos·node.js·express
探索云原生9 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu