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.
Sentinel入门(持续更新...)_第1张图片

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服务监控是懒加载的,只有当服务的接口被调用之后,才会被监控中心捕捉到,调用之后,在面板可以看到如下数据
    Sentinel入门(持续更新...)_第2张图片

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

Sentinel入门(持续更新...)_第3张图片
Sentinel入门(持续更新...)_第4张图片

  1. 测试,在浏览器获取使用postman快速点击接口http://localhost:8041/limit,当1s内超过三次,进去预先设置的回调方法,返回的参数为
    Sentinel入门(持续更新...)_第5张图片
    Sentinel入门(持续更新...)_第6张图片

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个线程,正常测试. 每个线程结果正常返回, 添加线程限制限流配置
    Sentinel入门(持续更新...)_第7张图片

  2. 设置线程阀值为4个,创建五个线程去调用接口,从返回结果可以看出,前面四个线程返回结果正常,有一个线程返回的是被限制的结果
    Sentinel入门(持续更新...)_第8张图片

2.2.3 阈值类型 QPS、流控模式 关联

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

Sentinel入门(持续更新...)_第10张图片

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

你可能感兴趣的:(java)