Sentinel入门(持续更新...)

1. 概念

1.1 是什么

Sentinel 通俗上将它就是Hystrix的升级web版本.通过可视化的方式,解决服务在在实践中遇到的各种问题 .

1.2 下载安装

下载地址
下载最新稳定版的jar文件,并启动.

  • window 后台启动方式 javaw -jar xxx.jar ,cmd窗口启动java -jar xxx.jar ,默认启动端口为8080,如果8080端口被占用,可以自定义启动端口java -jar xxx.jar --server.port=8888
  • linux 后台启动方式 nohup java -jar xxx.jar >log.log & 指定日志文件位置和后台挂起启动.

启动成功之后访问地址:http://ip:port 默认用户名密码为sentinel.

1.3 核心功能模块

  • 服务雪崩
  • 服务降级
  • 服务熔断
  • 服务限流

1.4 项目中使用

在服务配置文件中添加如下配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.10.120:8848 # 这里使用的是nacos注册中心,实际配置以自己项目的注册中心为准
    sentinel:
        transport:
            dashboard: 192.168.101.120:8080 # 上面启动的地址

2. 实际中的应用和配置

2.1 面板专业术语说明

名称介绍值说明
资源名独一无二默认为请求路径
针对资源Sentinel可以针对调用者进行限流,填写服务名称默认为default
阀值类型QPS每秒钟的请求数量当调用改apiQPS达到阀值时,触发限流操作
阀值类型 线程数当调用改api的请求线程数达到阀值是,触发限流操作
流控模式 直接api达到限流条件,直接限流
流控模式 关联当关联的资源达到阀值是,直接限流
流控模式 链路当从某个接口过来的资源达到限流条件是,开启限流
流控效果 快速失败直接进行失败,抛出异常
流控效果 Warm Up根据CodeFactor(冷加载因子,默认值为3)的值,从阀值/codeFactor,经过预热时长,才达到这是的QPS阀值
流控效果 排队等待均匀排队,让请求均匀的速度通过,阀值类型必须设定为QPS,否则无效

2.2 配置使用说明

2.2.1 阀值类型 QPS 流控模式直接
相关参数和方法说明

Sentinel提供了这样的功能,让我们可以另外定义一个方法来代替被限制或异常服务返回数据,这就是fallbackblockHandler

  • fallback:失败调用,若本接口出现未知异常,则调用fallback指定的接口。
  • blockHandlersentinel定义的失败调用或限制调用,若本次访问被限流或服务降级,则调blockHandler指定的接口。
  1. 测试的service
/**
     *  阀值类型 QPS  流控模式直接
     */

    String hello(String limit);

  1. service实现层
    @SentinelResource(value = "limit",defaultFallback = "defaultFallback",blockHandler = "handlerException",blockHandlerClass = {BlockException.class})
    @Override
    public String hello(String limit) {
        return "阀值类型 QPS  流控模式直接";
    }
    
    //自定义简单的 服务限流或者降级回调方法  
    public String defaultFallback(){
        return "太拥挤了 ~ 请稍后重试 ";
    }
    public String handlerException(){
        return "测试超出流量限制的部分是否会进入到blockHandler的方法。";
    }

  1. controller测试
    @Autowired
    private SentinelService sentinelService;

    @GetMapping("/test1")
    public String testA(){
        return "this is testA -----------";
    }

    @GetMapping("/test2")
    public String testB(){
        return "this is testB -----------";
    }

    @GetMapping("/limit")
    public String limit (){
        return sentinelService.hello("测试QPS限流");
    }
  1. 依次调用上面的三个测试接口,因为Sentinel服务监控是懒加载的,只有当服务的接口被调用之后,才会被监控中心捕捉到,调用之后,在面板可以看到如下数据

  2. 对相关服务的接口进行流控配置 ,流控配置如下(当前接口在1s内次数超过3次,直接触发限流操作,进入失败的回调方法)


  1. 测试,在浏览器获取使用postman快速点击接口http://localhost:8041/limit,当1s内超过三次,进去预先设置的回调方法,返回的参数为

2.2.2 阈值类型 线程数、流控模式 直接
  1. service
String threadTest(String thread);
  1. service实现层
    @SentinelResource(value = "thread",defaultFallback = "defaultFallback",blockHandler = "handlerException",blockHandlerClass = {BlockException.class})
    @Override
    public String threadTest(String thread) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "阈值类型 线程数、流控模式 直接";
    }
    

  1. controller
    @GetMapping("/thread")
    public String thread(){
        return sentinelService.threadTest("线程测试");
    }
  1. 使用Apache jmeter 进行多线程测试
    创建5个线程,正常测试. 每个线程结果正常返回, 添加线程限制限流配置

  2. 设置线程阀值为4个,创建五个线程去调用接口,从返回结果可以看出,前面四个线程返回结果正常,有一个线程返回的是被限制的结果

2.2.3 阈值类型 QPS、流控模式 关联
  1. 基于上面的test1test2接口不变,将这两个接口建立关联关系.
  2. 模拟场景: 支付接口和订单接口,放支付接口进入阀值的时候,会限制订单接口的产生.缓解服务的压力.具体的流程如下
  3. 测试接口,单独快速、慢速的测试test1test2接口,返回结果都是正常
  4. 使用postmanJmeter测试两个接口,创建多个线程跑test2的同时使用postman调用test1 ,触发限流,返回异常日志.当test2结束限流之后,test1接口才会正常返回

参考简书https://www.jianshu.com/p/35ba0d96450d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值