微服务组件 alibaba-sentinel 介绍?

  • 雪崩问题
    • 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用
  • 解决雪崩问题方式

    • 超时处理
      • 设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待
    • 仓壁模式
      • 限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离
    • 熔断降级
      • 断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求
    • 流量控制

      • 限制业务访问的QPS,避免服务因流量的突增而故障。是一种预防措施

        sentinel介绍

    • Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:https://sentinelguard.io/zh-cn/index.html

      • 丰富的应用场景
        • 秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
      • 完备的实时监控
        • 可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况
      • 广泛的开源生态
        • 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合
      • 完善的SPI扩展点
        • 提供简单易用、完善的 SPI 扩展接口

          sentinel中限流功能介绍? 支持的限流规则?

  • 簇点链路

    • 项目内的调用链路,链路中被监控的每个接口就是一个资源
  • 限流规则

    • 流控:流量控制
    • 降级:降级熔断
    • 热点:热点参数限流,是限流的一种
    • 授权:请求的权限控制
    • 限流规则点击高级选项可以选择三种流控模式
      • 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
      • 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
      • 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
    • 流控效果
      • 快速失败:QPS超过阈值时,拒绝新的请求
      • warm up: 也叫预热模式,是应对服务冷启动的一种方案,QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机
      • 排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝

        sentinel中线程隔离介绍?

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

    • 线程池隔离
      • 给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果
        • 优点
          • 支持主动超时
          • 支持异步调用
        • 缺点
          • 线程的额外开销比较大
        • 场景
          • 低扇出
    • 信号量隔离(Sentinel默认采用)
      • 不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求
        • 优点
          • 轻量级,无额外开销
        • 缺点
          • 不支持主动超时
          • 不支持异步调用
        • 场景
          • 高配调用 高扇出

            sentinel中断路器功能介绍?

  • 断路器熔断策略有三种

    • 慢调用:超过指定时长的调用为慢调用,统计单位时长内慢调用的比例,超过阈值则熔断
    • 异常比例:统计单位时长内异常调用的比例,超过阈值则熔断
    • 异常数:统计单位时长内异常调用的次数,超过阈值则熔断

      Feign + Sentinel实现服务降级配置?

  • 修改配置,开启sentinel功能

    • 修改OrderService的application.yml文件,开启Feign的Sentinel功能
      1. feign:
      2. sentinel:
      3. enabled: true # 开启feign对sentinel的支持
  • 编写失败降级逻辑

    • 在feing-api项目中定义类,实现FallbackFactory

      ![image.png](https://cdn.nlark.com/yuque/0/2022/png/26574307/1656179390147-f90c4f2b-c702-4500-8e73-798553634c8b.png#clientId=u7a2b6614-9013-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=417&id=ud07af25a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=417&originWidth=545&originalType=binary&ratio=1&rotation=0&showTitle=false&size=42179&status=done&style=none&taskId=ud61a8b8b-e8af-4c66-b7a6-058e6951938&title=&width=545)
      

      ```java import cn.itcast.feign.clients.UserClient; import cn.itcast.feign.pojo.User; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j;

@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(); } }; }


   - 在feing-api项目中的DefaultFeignConfiguration类中将UserClientFallbackFactory注册为一个Bean
```java
@Bean
public UserClientFallbackFactory userClientFallbackFactory(){
    return new UserClientFallbackFactory();
}
  • 在feing-api项目中的UserClient接口中使用UserClientFallbackFactory ```java import cn.itcast.feign.clients.fallback.UserClientFallbackFactory; import cn.itcast.feign.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(value = “userservice”, fallbackFactory = UserClientFallbackFactory.class) public interface UserClient {

@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);

} ```

Feign整合Sentinel的步骤

  • 在application.yml中配置:feign.sentienl.enable=true
  • 给FeignClient编写FallbackFactory并注册为Bean
  • 将FallbackFactory配置到FeignClient