• 隔离和降级


    隔离和降级:

    虽然限流可以避免因高并发引起的服务故障,但服务还会因为其他原因而故障。而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离(船舱模式)和熔断降级手段了。

    不管时线程隔离还是熔断降级,都是对客户端(调用方)的保护。

    Feign整合sentinel:

    SpringCloud中,微服务调用都是通过Feign来实现的,因此做客户端保护必须整合Feign和Sentinel。

    1.修改需要做保护客户端xxService的application.yml文件,开启Feign的Sentinel功能。

    复制代码
    server:
      port: 8088
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
        username: root
        password: Liqi@1997^05*14
        driver-class-name: com.mysql.jdbc.Driver
      application:
        name: orderservice
      cloud:
        nacos:
          server-addr: localhost:8848 # nacos服务地址
        sentinel:
          transport:
            dashboard: localhost:8080 # sentinel控制台地址
    feign:
    httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数
    sentinel:
    enabled: true # 开启feign对sentinel的支持
     
    复制代码

    2.给FeignClient编写失败后的降级规则

    ①方法一:FallBackClass,无法对远程调用的异常做处理

    ②方法二:FallbackFactory,可以对远程调用的异常做处理

     

    步骤一:在feign-api项目中实现定义类,实现FallbackFactory

    复制代码
    @Slf4j
    public class UserClientFallbackFactory implements FallbackFactory {
        @Override
        public UserClient create(Throwable throwable) {
            return new UserClient() {
                @Override
                public User findById(Long id) {
                    log.error("查询用户异常", throwable);
                    return new User();
                }
            };
        }
    }
    复制代码

    步骤二:在feign-api项目中的DefaultFeignConfiguration将UserClientFallbackFactory注册为一个bean

    复制代码
    public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel(){
    return Logger.Level.BASIC;
    }

    @Bean
    public UserClientFallbackFactory userClientFallbackFactory(){
    return new UserClientFallbackFactory();
    }
    }
    复制代码

    步骤三:在feign-api项目中的UserClient接口中使用UserClientFallbackFactory

    复制代码
    @FeignClient(value = "userservice", fallbackFactory = UserClientFallbackFactory.class)
    public interface UserClient {
    
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
    }
    复制代码

    Sentinel支持的雪崩解决方案:

    线程隔离(舱壁模式)

    熔断降级

    Feign整合Sentinel的过程:

    在application.yml中配置 feign.sentinel.enable=true

    给FeignClient编写FallbackFactory并注册为bean

    将FallbackFactory配置到FeignClient

     

    线程隔离

    线程隔离有两种实现方式:

    ·线程池隔离

    在添加限流规则时,可以选择两种阈值模式:

     

    QPS:就是每秒的请求数

    线程数:是该资源能使用的tomcat线程数的最大值。也就是通过限制线程数量,实现舱壁模式; 

    ·信号量隔离(Sentinel默认采用)

    两者的对比:

     

      优点 缺点 场景
    线程池隔离

    支持主动超时

    支持异步调用

    线程的额外开销比较大 低扇出
    信号量隔离

    轻量级

    无额外开销

    不支持主动超时

    不支持异步调用

    高频调用

    高扇出

     

    熔断降级:

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

    断路器的三种状态:closed,open,half-Open

     

    熔断策略:

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

    ·慢调用:业务响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。例如:

     

     解读:RT超过500ms的调用是慢调用,统计最近10000ms内的请求,如果请求量超过十次,并且慢调用比例不低于0.5,则触发熔断,熔断时长为5s。然后进入half-open状态,放行一次请求做测试。

     ·异常比例、异常数

    异常比例或异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现的异常比例达到设定的比例阈值(或超过指定异常数),则触发熔断。例如:

     

     解读:统计最近1000ms内的请求,如果请求量超过10次,并且异常比例不低于0.4,则触发熔断,熔断时长为5s,然后进入half-open状态,放行一次请求做测试。

  • 相关阅读:
    使用x64dbg手动脱UPX壳(UPX4.1.0)
    C++对象模型探索--04数据语义
    【Python基础知识】(17)序列类型的相互转换
    SpringBoot自动配置(装配)流程
    Android OpenGL ES 3.0 相机基础滤镜
    Python:自动化处理PDF文档集合,提取文献标题、合并文献PDF并生成目录和页码
    [激光原理与应用-21]:《激光原理与技术》-7- 激光技术大汇总与总体概述
    SpringBoot和Vue前后端分离
    如何开发LAXCUS分布式应用软件
    一次有关 DNS 解析导致 APP 慢的问题探究
  • 原文地址:https://www.cnblogs.com/oneJavaWorkerStudy/p/16542071.html