zoukankan      html  css  js  c++  java
  • springcloud alibaba-服务容错

    1.雪崩效应

    微小的变化就会引起输出的巨变,例如不合理的设计容量设计,或者高并发下某一个方法响应时间慢,或者某台机器资源耗尽都会发生雪崩效应。

    2.设计目的

    为了保护自己防止雪崩效应的扩散

    3.常见对容错思路有隔离,超时,限流,熔断,降级

    (1)隔离:按照一定的原则将系统氛围若干个模块,各个模块之间相互独立,没有依赖关系,当某一个模块发生问题,能将问题封锁在该模块中,不波及其他模块,常见当隔离方式有:线程池隔离和信号量隔离

    (2)超时:是指上游服务访问下游服务,设置一个响应时间,如果下游服务在规定的时间内未返回数据,那么就断开连接并释放线程

    (3)限流:是指限制系统的输入量和输出量,以达到保护程序的目的,一旦达到相应的流量,就会采取相应的措施

    (4)熔断:当下游服务因访问压力过大而相应过慢或者失败,上游服务为了保护系统整体当可用性,可以暂时切断对下游服务对调用,这种牺牲局部,保护整体对行为成为熔断

    服务熔断对三种状态:

    熔断关闭状态:服务没有故障时,熔断器所处对状态,对调用方对调用不做任何限制

    熔断开启状态:后续对该服务接口对调用不再经过网络,直接执行本地的fallback方法

    半熔断状态:尝试恢复服务的调用,允许有限的流量调用该服务,并监控调用的成功率,如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态,如果成功率依旧很低,则静如熔断开启状态

    (5)降级:降级其实就是为服务提供的一种托底方案,一旦服务无法调用,就使用托底方案

    4.sentinel

    是阿里开发的服务容错的综合性解决方案,它以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来保护服务的稳定性

    (1)特征

    丰富的应用场景

    完备的实时监控

    广泛的开源状态

    完善的spi扩展点

    (2)组成部分

    核心库(java客户端):不依赖任何框架,能够运行于所有java运行时环境

    控制台(Dashboard):基于springboot开发,打包后可直接运行,不需要tomcat容器

    5.docker安装Dashboard

    (1)docker pull bladex/sentinel-dashboard

    (2)docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard

    补充docker下载nacos

    (1)docker pull nacos/nacos-server

    (2)docker run -d -p 8848:8848 nacos/nacos-server

    5.基本概念

    (1)资源

    就是sentinel需要保护的东西

    (2)规则

    就是定义如何保护资源(流量控制规则,熔断降级规则,系统保护规则)

    (3)重要功能

    流量控制:sentinel作为一个调配器,可以根据需要把随机的请求调整成合适的形状

    熔断降级:当请求时间过长,或者异常比例升高,则对这个资源进行限制,让请求快速失败,避免影响其他程序引起系统崩溃

    系统负载保护:让系统的入口流量和系统的负载达到一个平衡点,保护系统在能力范围之类处理最多的请求

    6@SentinelResource

    指定义一个资源出现异常时的处理逻辑

    blockHandler:定义当资源内部发生了BlockException应该进入的方法(捕获的是sentinel定义的异常)

    要求:

    (1)当前方法的返回值和参数要跟原方法一致

    (2)但是允许在参数列表最后加入一个参数BlockException,用来接收原方法中的异常

    fallback:定义当资源内部发生了Throwable应该进入的方法

    7.sentinel规则持久化

    (1)代码网上有

    (2)添加配置

    在resources下新建目录META-INF,然后添加文件com.alibaba.csp.sentinel.init.InitFunc

    在文件添加配置类的全路径com.freeht.config.FilePersistence

    8.feign整合sentinel整合

    (1)添加sentinel依赖

    (2)开启fegin对sentinel的支持

    feign:
        sentinel:
            enable:true
    

    (3)创建容错类

    /**
     * 这是一个容错类,需要实现fegin所在的接口,并去实现接口中的所有方法
     * 一旦fegin远程调用出现问题了,就会进入当前类中的同名方法,执行容错逻辑
     */
    @Service
    public class ProductFallback implements ProductService {
        /**
         * 这是容错逻辑
         * @param pid
         * @return
         */
        @Override
        public Product findByPid(Integer pid) {
            //容错逻辑
            Product product = new Product();
            product.setPid(-100);
            product.setPname("远程调用商品微服务出现异常了,进入容错逻辑");
            return product;
        }
    }
    

    (4)为容器的接口指定容错类

    /**
     * fallback用于指定当前fegin接口的容错类
     */
    @FeignClient(value = "service-product", fallback = ProductFallback.class)
    public interface ProductService {
        @RequestMapping("/product/{pid}")
        Product findByPid(@PathVariable("pid") Integer pid);
    }
    

    9.显示fegin异常

    (1)定义一个容错类

    /**
     * 这是一个容错类,他要求我们是要实现一个FallbackFactory<要为哪个接口实现容错类>
     */
    @Slf4j
    public class ProductServiceFallbackFactory implements FallbackFactory<ProductService> {
        /**
         * throwable这就是fegin在调用中产生的异常
         * @param throwable
         * @return
         */
        @Override
        public ProductService create(Throwable throwable) {
    
            return new ProductService(){
                @Override
                public Product findByPid(Integer pid) {
                    log.error("{}", throwable);
                    Product product = new Product();
                    product.setPid(pid);
                    product.setPname("服务调用异常,已经进入容错方法");
                    return product;
                }
            };
        }
    }
    

    (2)指定fallback调用的方法

    /**
     * fallback用于指定当前fegin接口的容错类
     */
    @FeignClient(value = "service-product", //fallback = ProductFallback.class,
            fallbackFactory = ProductServiceFallbackFactory.class)
    public interface ProductService {
    
        @RequestMapping("/product/{pid}")
        Product findByPid(@PathVariable("pid") Integer pid);
    }
    

      

  • 相关阅读:
    IIS浏览显示目录
    图解NuGet的安装和使用
    未能找到类型或命名空间名称“DbContext”
    IIS报错:未将对象引用设置到对象的实例
    最新11位手机号正则表达式
    Sql Server连表查询字段为null
    sql server 表连接
    2019用卡提额攻略
    win10,7 80端口被占用的检测和解决方法
    SAP之RFC_READ_TABLE
  • 原文地址:https://www.cnblogs.com/freeht/p/12928289.html
Copyright © 2011-2022 走看看