Sentinel概述

一、Sentinel

Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。
它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。

二、使用步骤

1.下载地址

下载地址:https://github.com/alibaba/Sentinel/releases
运行:java -jar sentinel-dashboard-1.7.0.jar
访问:http://localhost:8080
用户名密码:sentinel sentinel

2.导入依赖

<!--服务容错 每一个服务 都引入 sentinel 客户端-->																								
<dependency>																																							
    <groupId>com.alibaba.cloud</groupId>																																							
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>																																							
</dependency>																																							

3.添加配置

#spring:																																							
#  cloud:																																							
    sentinel:																																							
      transport:																																							
        port: 8081 #跟控制台交流的端口,随意指定一个未使用的端口即可																																							
        dashboard: localhost:8080 # 指定控制台服务的地址																																							

4.启动jar

在这里插入图片描述

5.运行接口后就才能被监控,设置流控规则

在这里插入图片描述

6.测试重复刷新后

在这里插入图片描述
该处使用的url网络请求的数据。

三容错异常

在这里插入图片描述

异常说明
FlowException限流异常
ParamFlowException热点参数限流的异常
DegradeException降级异常
AuthorityException授权规则异常
SystemBlockException系统规则异常

四、自定义sentinel异常(BlockExceptionAspect)

@Slf4j																																																				
@Component																																																				
public class BlockExceptionAspect implements UrlBlockHandler {																																																				
																																																				
    @Override																																																				
    public void blocked(HttpServletRequest httpServletRequest,																																																				
                        HttpServletResponse httpServletResponse, BlockException e) throws IOException {																																																				
																																																				
																																																				
        System.out.println("进入。。。 MyUrlBlockHandler");																																																				
        // 打印日志																																																				R
        log.error(e.getMessage(),e);																																																				
        // 统一返回结果																																																				
        R appResult = null;																																																				
        if (e instanceof FlowException) {																																																				
            appResult = new R(ResponseEnum.FLOW_BLOCK,null);																																																				
        } else if (e instanceof DegradeException) {																																																				
            appResult = new R(ResponseEnum.DEG_BLOCK,null);																																																				
        } else if (e instanceof ParamFlowException) {																																																				
            appResult = new R(ResponseEnum.DEG_BLOCK,null);																																																				
        } else if (e instanceof SystemBlockException) {																																																				
            appResult = new R(ResponseEnum.DEG_BLOCK,null);																																																				
        } else if (e instanceof AuthorityException) {																																																				
            appResult = new R(ResponseEnum.DEG_BLOCK,null);																																																				
        }																																																				
        httpServletResponse.setCharacterEncoding("utf-8");																																																				
        httpServletResponse.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);																																																				
																																																				
        httpServletResponse.getWriter().print(JSON.toJSONString(appResult));																																																				
																																																				
    }																																																				
}																																																				
  • QPS每秒查询率(Query Per Second)
    原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间。
    公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS) 。

  • PV(page view)即页面浏览量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。网页浏览数是评价网站流量最常用的指标之一,简称为PV。

  • 机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器 。
    每天300w PV 的在单台机器上,这台机器需要多少QPS?
    ( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)。
    一般需要达到139QPS,因为是峰值。(200万pv才有100峰值qps

  • TPS
    Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数。
    TPS包括一条消息入和一条消息出,加上一次用户数据库访问。(业务TPS = CAPS × 每个呼叫平均TPS)
    一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
    一般的,评价系统性能均以每秒钟完成的技术交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值。

  • RT(Response-time)
    响应时间是指:系统对请求作出响应的时间(一次请求耗时)。
    响应时间:执行一个请求从开始到最后收到响应数据所花费的总体时间,即从客户端发起请求到收到服务器响应结果的时间。响应时间RT(Response-time),是一个系统最重要的指标之一,它的数值大小直接反应了系统的快慢。

  • Load(系统负载)
    Linux的Load(系统负载),是一个让新手不太容易了解的概念。load的就是一定时间内计算机有多少个active_tasks,也就是说是计算机的任务执行队列的长度,cpu计算的队列。
    top/uptime等工具默认会显示1分钟、5分钟、15分钟的平均Load。
    具体来说,平均Load是指,在特定的一段时间内统计的正在CPU中运行的(R状态)、正在等待CPU运行的、处于不可中断睡眠的(D状态)的任务数量的平均值。
    CPU使用率和Load的关系吧。如果主要是CPU密集型的程序在运行(If CPU utilization is near 100 percent (user + nice + system), the workload sampled is CPU-bound.),
    那么CPU利用率高,Load一般也会比较高。而I/O密集型的程序在运行,
    可能看到CPU的%user, %system都不高,%iowait可能会有点高,这时的Load通常比较高。
    同理,程序读写慢速I/O设备(如磁盘、NFS)比较多时,Load可能会比较高,而CPU利用率不一定高。这种情况,还经常发生在系统内存不足并开始使用swap的时候,Load一般会比较高,而CPU使用率并不高。

  • PV
    页面访问次数:Page View

  • UV
    访客数(去重复):Unique Visitor

  • 带宽
    带宽(bps)=总流量数(bit)/产生流量的时长(秒)=(PV页面平均大小8)/统计时间(秒)
    说明:公式中的 8 指的是将 Byte 转换为 bit,即 8b/B,因为带宽的单位是 bps(比特率),即bit per second,每秒二进制位数,而容量单位一般使用 Byte。
    假设某站点的日均 PV 是 10w,页面平均大小 0.4 M,那么其平均带宽需求是:
    平均带宽 = (10w * 0.4M * 8) / (60 * 60 * 24)= 3.7 Mbps
    以上计算的仅仅是平均带宽,我们在进行容量预估时需要的是峰值带宽,即必须要保证站点在峰值流量时能够正常运转。假设,峰值流量是平均流量的5倍,这个5倍称为峰值因 子。按照这个计算,实际需要的带宽大约在3.7 Mbps * 5=18.5 Mbps 。
    带宽需求 = 平均带宽 * 峰值因子

  • 并发连接数
    并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力。

五、sentinel找不到UrlBlockHandler接口解决方法

sentinel 1.8版本时候并没有这个接口,官方改成了BlockExceptionHandler这个接口与实现。

解决方案:
继承BlockExceptionHandler接口

package com.sentinel;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;

import com.Enum.RequestMsgEnum;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.global.BaseController;
 
/**
 * 自定义sentinel异常返回信息
 */
@Component
public class MyUrlBlockHandler extends BaseController implements BlockExceptionHandler{

	@Override
	public void handle(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws Exception {
		String msg = null;
        if (ex instanceof FlowException) {
            msg = "限流了";
        } else if (ex instanceof DegradeException) {
            msg = "降级了";
        } else if (ex instanceof ParamFlowException) {
            msg = "热点参数限流";
        } else if (ex instanceof SystemBlockException) {
            msg = "系统规则(负载/...不满足要求)";
        } else if (ex instanceof AuthorityException) {
            msg = "授权规则不通过";
        }
        // http状态码
        response.setStatus(500);
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.setContentType("application/json;charset=utf-8");
        // spring mvc自带的json操作工具,叫jackson
        new ObjectMapper()
            .writeValue(
                response.getWriter(),
                this.responseResult(RequestMsgEnum.Failtrue, msg)
            );
	}
}

BaseController 此类是我自己写的定义类,自定义格式返回给前端,需要根据自己的需要修改

总结

功能SentinelHystrixresilience4j
隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间
实时统计实现滑动窗口(LeapArray)滑动窗口(基于 RxJava)
动态规则配置支持多种数据源支持多种数据源有限支持
扩展性多个扩展点插件的形式接口的形式
基于注解的支持支持支持支持
限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
流量整形支持预热模式、匀速器模式、预热排队模式(流量规则处可配置)不支持简单的 Rate Limiter 模式
系统自适应保护支持不支持不支持
控制台提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
作为一个AI语言模型,我不确定你的问题具体是什么,但我可以为您提供一些关于gateway和sentinel概述和整合方法。 Gateway是一个开源的API网关,可以将多个微服务的API集成到一个入口点,并提供一些安全性、监控和流量控制方面的功能。Sentinel是一个开源的流量控制和熔断框架,可以通过限制流量或停止流量来保护应用程序。 整合Gateway和Sentinel可以提供更强大的流量控制和安全性,使您的API更加可靠和可扩展。以下是一些整合方法: 1. 使用Gateway的Sentinel插件:Gateway提供了一个Sentinel插件,可以直接将Sentinel集成到Gateway中。只需将插件添加到Gateway的配置文件中,并配置Sentinel规则即可。这样,Gateway将在请求到达时使用Sentinel来限制流量和处理熔断。 2. 使用Spring Cloud Gateway和Spring Cloud Alibaba Sentinel:如果您正在使用Spring Cloud框架,可以使用Spring Cloud Gateway和Spring Cloud Alibaba Sentinel来实现Gateway和Sentinel的整合。这两个框架都是基于Spring Cloud的,可以很容易地集成到您的微服务架构中。 3. 独立部署Sentinel:如果您不想将Sentinel直接集成到Gateway中,可以选择在独立的服务器上部署Sentinel。然后,您可以通过在Gateway配置文件中指定Sentinel服务器的地址来将Gateway与Sentinel连接起来。 总之,整合Gateway和Sentinel可以提高API的可靠性和安全性。您可以根据自己的需求选择适合自己的整合方法。希望这些信息对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jsxllht

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值