当前位置: 首页 > news >正文

sentinel详细使用教学

sentinel源码地址: https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

sentinel官方文档: https://sentinelguard.io/zh-cn/docs/introduction.html

Sprong Cloud alibaba Sentinel文档【小例子】 : https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

1、概念

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

流量路由,流量控制,流量整形:流量从另外一个角度,也叫请求。

2、入门例子

0、启动nacos和redis

在这里插入图片描述

1、使用openfeign项目

在这里插入图片描述

2、引入依赖

给两个项目都添加如下依赖:

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-web-servlet</artifactId>
</dependency>

3、下载sentinel服务

下载sentinel服务路径: https://github.com/alibaba/Sentinel/releases

注意版本号对应

在这里插入图片描述

我们用的是1.8.0版本,下载服务端时下载对应的版本。

在这里插入图片描述

4、启动服务

执行java -jar sentinel-dashboard.jar

在这里插入图片描述

5、登录sentinel

http://localhost:8080/#/login

用户名和密码都是sentinel。

在这里插入图片描述

6、添加sentinel配置信息

给两个项目的application.yml配置文件里添加如下配置:

spring:
 cloud:
  sentinel:
   transport:
    dashboard: localhost:8080

7、启动并访问两项目 查看结果

在这里插入图片描述

【访问sentinel网站,设置限流】

在这里插入图片描述

注意:设置的单机阈(yu四声)(一秒钟访问的数量)值改为2,这样可以尽快看见限流。

在这里插入图片描述
【限流的效果】

一下一下点击访问的时候,还可以看见正常响应:

在这里插入图片描述

【概念了解】

【1、什么是QPS】

每秒请求的数量,要求发送请求并得到响应的整体时间。

【2、什么是RT】

响应时间。

【3、慢调用】

响应时间大于一定值。

【4、慢调用比例】

慢调用 / 总调用 比例值。

【5、比例阈值】

输入0到1之间的浮点型,代表百分比,0是0%,1是100%。

3、自定义流控响应

当被限流的时候,浏览器中展示的效果如下,用户体验度不好,可以进行以下操作。

在这里插入图片描述

1、添加过滤器

在user工程里,添加此过滤器。

import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;

@Configuration
public class SentinelFilterConfig {

    @Bean
    public FilterRegistrationBean<Filter> filterFilterRegistrationBean(){
        FilterRegistrationBean<Filter> result = new FilterRegistrationBean<>(new CommonFilter());
        result.addUrlPatterns("/*");
        return result;
    }
}

2、添加配置类

在user工程里,添加此过配置类。

import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
import com.alibaba.fastjson.JSON;
import org.jsoft.demo.utils.Result;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SentinelConfig {

    public SentinelConfig() {
        WebCallbackManager.setUrlBlockHandler((request, response, e) -> {
            Result error = Result.error();
            error.setMessage("被限流了!");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write(JSON.toJSONString(error));
        });
    }
}

3、运行结果

重启user项目,重新添加流量阈值,查看运行结果。

在这里插入图片描述

4、熔断feign

官方地址: https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7

1、添加配置

在user工程里 开启feign的sentinel,写properties文件中可以,写在yaml文件也可以

feign.sentinel.enabled=true

2、修改feign接口注解

import org.jsoft.demo.feign.impl.ScoreFeignImpl;
import org.jsoft.demo.utils.Result;
import org.jsoft.demo.vo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(value = "demo-sentinel-s", fallback = ScoreFeignImpl.class) //fallback 一旦出现熔断,要走哪个类。
public interface ScoreFeign {

    @GetMapping("/score/info")
    Result info();

    @GetMapping("/score/{id}")
    Result id(@PathVariable String id);

    @PostMapping("/score/add")
    Result add(@RequestBody User user);

}

3、添加feign接口实现类

import org.jsoft.demo.feign.ScoreFeign;
import org.jsoft.demo.utils.Result;
import org.jsoft.demo.vo.Score;
import org.jsoft.demo.vo.User;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class ScoreFeignImpl implements ScoreFeign {
    @Override
    public Result info() {
        List<Score> list = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Score score = new Score();
            score.setName("name" + i);
            score.setScore(99.99);
            list.add(score);
        }
         return  Result.ok().put("data",list);
    }

    @Override
    public Result id(String id) {
        return null;
    }

    @Override
    public Result add(User user) {
        return null;
    }
}

FeignClient注解中的fallback属性配置了如果熔断,应该访问的Feign接口实现类。当发生熔断时,会访问ScoreFeignImpl中对接口的实现方法。

4、查看运行结果

关掉Score工程,模拟宕机效果。在使用user工程去访问Score工程,就可以看见熔断处理了。

当遇到宕机的时候,就访问了自己工程里的feign实现类方法。

在这里插入图片描述

5、熔断资源

熔断资源官网地址: https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7

资源(是自己写的处理器方法,要对自己写的方法进行限流)是自定义的一个名称,这个名称会在Sentinel中显示,就可以对其进行熔断、降级等管理。

实现对资源管理的常用方式有两种,分别是try和注解。

1、try方式

在user工程的UserController里,添加如下方法:

    @GetMapping("/try")
    public Result trySources(){
        String sourcesName = "testTry";
        try(Entry entry = SphU.entry(sourcesName)) { //SphU.entry方法通过传入资源名称和其他参数来获取访问令牌。如果获取到令牌,则可以访问目标资源;如果没有获取到令牌,则无法访问对应资源。
            return Result.ok();
        } catch (BlockException e) {
            return Result.error().setMessage("被限流了!");
        }
    }

注意Entry引包

import com.alibaba.csp.sentinel.Entry;

重启两个项目,运行一下看效果,就是自己写的方法,也被限流了。

2、注解方式

在user工程的UserController里,添加如下方法:

    @GetMapping("/annotation")
    @SentinelResource(value = "testAnnotation", blockHandler = "annotationSourcesError")
    public Result annotationSources() {
        return Result.ok();
    }

    public Result annotationSourcesError(BlockException e) {
        return Result.error().setMessage("被限流了!");
    }

重启两个项目,运行一下看效果,就是自己写的方法,也别限流了。

6、其他说明

【1、异常比例】

是发生异常数 / 总请求数。

【2、异常数 】

发生异常次数。

【3、快速失败】

当QPS超过阈值是,直接限流,抛出异常。是默认值,可以用于线程数的限流。

在这里插入图片描述

【4、排队等待】

每秒可以处理10个请求,当超出这个值就会等待,等待10000毫秒后,如果还没有被处理会限流。只能用于QPS的限流。

在这里插入图片描述

【5、Warm Up】

​ 可以让服务器的QPS“慢慢地”达到阈值,在10秒中之内让QPS到底10。只能用于QPS的限流。

在这里插入图片描述

【6、直接拒绝】

​ 只对单一资源,当触发阈值时直接拒绝请求。

在这里插入图片描述

【7、关联】

​ 针对两个资源有关联时,当前当前资源会为关联资源让步,保证关联资源有更大的阈值。

在这里插入图片描述

【8、链路】

​ 从资源入口开始,整个两路的阈值。

【9、热点限流】

当系统中的某些数据被经常引用,可以对这些数据进行限流,减少服务器压力。

【10、系统规则】

针对硬件层面设置的规则,比如限制CPU的使用率

【11、授权规则】

根据请求的来源设置限流,其实就是黑白名单功能

[外链图片转存中…(img-enY0IDuf-1740809236667)]

【6、直接拒绝】

​ 只对单一资源,当触发阈值时直接拒绝请求。

[外链图片转存中…(img-Q3MDsz2e-1740809236668)]

【7、关联】

​ 针对两个资源有关联时,当前当前资源会为关联资源让步,保证关联资源有更大的阈值。

[外链图片转存中…(img-dSW0LFOy-1740809236668)]

【8、链路】

​ 从资源入口开始,整个两路的阈值。

【9、热点限流】

当系统中的某些数据被经常引用,可以对这些数据进行限流,减少服务器压力。

【10、系统规则】

针对硬件层面设置的规则,比如限制CPU的使用率

【11、授权规则】

根据请求的来源设置限流,其实就是黑白名单功能

相关文章:

  • 两分种解决:xshell终端delete键无效
  • c++中的静态多态和动态多态简介
  • 性能测试【Perfdog】
  • 接口测试工具:postman详解
  • CAM350_安装
  • 【Linux高级IO】Linux多路转接:深入探索poll与epoll的奥秘
  • Ollama的底层实现原理分析
  • 《浔川AI翻译v6.1.1版本推迟上线公告》
  • C++类和对象
  • 算法day4 dfs搜索2题
  • 【机房——LCA】
  • 小米火龙CPU和其他几代温度太高的CPU是由谁代工的
  • 卢卡斯定理判断组合数奇偶(Codeforces Round 1006 (Div. 3)——F)
  • 【含文档+PPT+源码】基于SpringBoot的宠物领养系统设计与实现
  • Rust语言基础知识详解【四】
  • #11 如何使用 Kaggle packages
  • Vue学习教程-18Vue单文件组件
  • LeetCodehot 力扣热图100 括号生成
  • 水仙花数(华为OD)
  • 2025-03-01 学习记录--C/C++-PTA 7-35 有理数均值
  • 沈阳再次发布疫情通知/南昌seo快速排名
  • 做快消品的网站/北京网站优化公司
  • 旅游做网站/seo zac
  • 旅游网站的建设方案/创建网址链接
  • 大屏高端插画家个人主页/百度seo价格查询
  • 福州网站建设 联系yanktcn 05/北京网站建设公司大全