【博学谷学习记录】超强总结,用心分享 。Sentinel相关知识。

一、Sentinel

    1.引入。雪崩问题

      雪崩问题就是微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。

      解决雪崩问题

        1.超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待(服务故障解决方法)

        2.船壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离(资源损耗大)

        3.熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求

        4.流量控制:限制业务访问的QPS。避免服务因流量的突增而故障(避免因瞬间高并发流量而导致服务故障的解决方法)

    2.认识Sentinel

        Sentinel是阿里巴巴开源的一款微服务流量控制组件

        Sentinel具有一下特征:

          1.丰富的应用场景:Sentinel承接了阿里巴巴近十年的双十一促流量的核心场景,如秒杀,消息削峰填谷、集群流浪控制、实时熔断下游不可用应用等。、

          2.完备的实时监控:Sentinel同时提供实时的监控功能,可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。

          3.广泛的开源生态:Sentinel提供开箱即用的与其他开源框架的整合模块。

          4.完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展接口。可以用过实现扩展接口来快速地定制逻辑。

          启动方式

          java -jar sentinel-dashboard-1.8.1.jar

    3.微服务整合Sentinel

          我们在order-service中整合sentinel,并且连接sentinel的控制台

          1.引入sentinel依赖

<!--        引入sentinel依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

           2.配置控制台地址

sentinel:
  transport:
    dashboard: localhost:8080 #sentinel控制台地址

          3.登录sentinel控制台

          4,访问微服务的任意端点,触发sentinel监控

             如:http://localhost:8088/order/101

      4.流控模式

        在添加限流规则时,点击高级选项,可以选择三种流控模式

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

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

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

      5.流控模式-关联

         使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是有限支付和更新订单的业务,因此当修改业务触发阈值时,需要对查询订单业务限流  

        满足下面条件可以使用关联模式:

          1.两个有竞争关系的资源

          2.一个优先级高,一个优先级低

            流控谁就限流谁,关联的资源不被限流。

      6.流控模式-链路

        使用场景:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流

      7.流控效果

        1.快速失败:QPS超过阈值时,拒绝新的请求

        2.warm up:QPS超过阈值时,拒绝新的请求,QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机

        3.排队等待:请求会进入队列,按照阈值允许的时间间隔一次执行请求,如果请求预期等待时长大于超时时间,直接拒绝。

      8.热点参数限流

      热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值

      注意:热点参数限流对默认的SpringMVC资源无效,因此要添加SentinelResource()才可以。

      9.Feign整合Sentinel

      为什么要使用Feign整合Sentinel?

        因为Feign对服务是远程调用的作用,而远程调用会出现的雪崩问题可以用Sentinel解决,解决方法包括线程隔离和熔断降级,因此可以使用Feign整合Sentinel,将两者的作用结合在一起。对远程调用的异常进行降级熔断处理,需要使用FabllbackFactory。

      步骤:

        1.先在order-service中配置开启Feign的Sentinel功能       

feign:
  sentinel:
    enabled: true #开启feign对sentinel的支持

        2.在feign-api中定义类,实现FallbackFactory

@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable throwable) {
        //创建UserClient接口实现类,实现其中的方法,编写失败降级的处理逻辑
        return new UserClient() {
            @Override
            public User findById(Long id) {
                //记录异常信息
                log.error("查询用户异常",throwable);
                //根据业务需求返回默认的数据,这里是控用户
                return new User();
            }
        };
    }
}

        3.在配置类中,将UserClientFallback注册为一个Bean,这样才能被调用

@Bean
public UserClientFallbackFactory userClientFallbackFactory(){
    return new UserClientFallbackFactory();
}

        4.在UserClient接口中使用UserClientFallbackFactory,这样才算是生效

@FeignClient(value = "userservice",fallbackFactory = UserClientFallbackFactory.class)

      10、线程隔离

          两种手段:

            1.(Sentinel默认的手段)信号量隔离: 用户请求会直接到FeignClient中,然后直接调用对应的服务,但是会有一个信号量,通过计数器来限制一个访问的次数。

            2.线程池隔离: 用户发起请求,需要服务A,B提供服务,服务A,B会自动创建对应的线程池,用户请求自动选择线程池的线程到Feign客户端,然后访问对应的服务,这样两个服务就会被隔离。

          特点:

            信号量隔离的特点是?

              基于计数器模式,简单、开销小

            线程池隔离的特点?

              支持异步调用,每一次请求都会创建线程池,支持主动超时,因为是独立的线程。适合用于低扇出的服务(就是服务支持少的服务)

              基于线程池模式,有额外开销,但隔离控制更强

      11.熔断降级

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

          它有三个状态:分别是closed--》open--》half-open

        原理是:如果该服务是成功状态,就会关闭断路器,如果达到失败阈值,就会开启熔断,快速失败就是拦截访问该服务的请求。当熔断时间结束,就会到half-open状态,尝试放行一次请求,如果成功就会关闭断路器,失败就会打开断路器。

       12.熔断策略

        断路器熔断有三种:

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

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

       13.授权规则

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

          设置授权规则

            1.Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的

              

package cn.itcast.order.sentinel;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

@Component
public class HeaderOriginParser implements RequestOriginParser {

    @Override
    public String parseOrigin(HttpServletRequest request ) {
        //1.获取请求头
        String origin = request.getHeader("origin");
        //2,非空判断
        if(StringUtils.isEmpty(origin)){
            origin="blank";
        }
        return origin;
    }
}

 

            2.需要在gateway服务中,利用网关的过滤器添加名为gateway的origin的头:

default-filters:
  - AddRequestHeader=Truth,Itcast is freaking awesome!
  - AddRequestHeader=origin,gateway

        14、自定义异常

          自定义异常结果

            默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口

            总结:

            获取请求来源的接口是什么?

              RequestOriginParse

            处理BlockException的接口是什么?

              BlockExceptionHandler

        15、Sentinel的三种配置管理模式

          1。原始模式:保存在内存

          2.pull模式:保存在本地文件或数据库,定时去读取(时效性差)

          3.push模式:保存在nacos,监听变更实时更新(推荐)

posted @ 2022-10-23 19:33  LINwenguan  阅读(136)  评论(0)    收藏  举报