Sentinel简介
背景:在系统负载过高时,采用限流、降级和熔断,三种措施来保护系统,由此一些流量控制中间件诞生。例如Sentinel。
1)Sentinel是什么?(阿里推出一个流量控制平台,防卫兵)
2)类似Sentinel的产品你知道有什么?(hystrix-一代微服务产品)
3)Sentinel是如何对请求进行限流的?(基于sentinel依赖提供的拦截器)
4)你了解哪些限流算法?(滑动窗口算法、计数器、令牌桶、漏斗算法…)
5)Sentinel 默认的限流算法是什么?(滑动窗口算法)
6)何为降级熔断?(让外部应用停止对服务的访问,生活中跳闸,路障设置-此路不通)
7)为什么要进行熔断呢?(平均响应速度越来越慢或经常出现异常,这样可能会导致调用链堆积,最终系统崩溃)
8)Sentinel中限流,降级的异常父类是谁?(BlockException)
9)Sentinel 出现降级熔断时,系统底层抛出的异常是谁?(DegradeException)
10)Sentinel中异常处理接口是谁?(BlockExceptionHandler)
11)Sentinel中异常处理接口下默认的实现类为? (DefaultBlockExceptionHandler)
12)假如Sentinel中默认的异常处理规则不满足我们的需求怎么办?(自己定义)
13)我们如何自己定义Sentinel中异常处理呢?(直接或间接实现BlockExceptionHandler )
14)Sentinel熔断降级策略有哪些?(慢调用比例、异常比例、异常数)
Sentinel概述
Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
Sentinel核心分为两个部分:
核心库(Java 客户端):能够运行于所有 Java 运行时环境,同时对Dubbo /Spring Cloud 等框架也有较好的支持。
控制台(Dashboard):基于 Spring Boot 开发,打包后可以直接运行。
安装Sentinel服务
java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
或者在 idea 启动
注:把前缀 java 删除,-jar后边加 sentinel 的全路径
-Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar D:\tools\CGB\AAA\CGBIV\TOOLS\sentinel\sentinel-dashboard-1.8.1.jar
http://localhost:8180
用户/密码一样:sentinel
登录成功
一、限流
1.添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.打开服务提供方配置文件bootstrap.yml,添加sentinel配置,代码如下:
#服务的端口
server:
port: 8081
#服务名
spring:
application:
name: sca-provider #进行服务注册必须配置服务名
cloud:
sentinel:
transport:
dashboard: localhost:8180 # 指定sentinel控制台地址。
web-context-unify: false
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yml
namespace: 980ba7ac-4f94-417c-ad49-b1714d85d04d
#group: DEFAULT_GROUP_51
shared-configs[0]:
data-id: app-public.yml
refresh: true
3.创建一个用于演示限流操作的Controller对象,例如:
package com.jt.provider.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/provider")
public class ProviderSentinelController {
@GetMapping("/sentinel01")
public String doSentinel01(){
return "sentinel 01 test ...";
}
}
4.启动sca-provider服务,然后对指定服务进行访问,如图所示:
5.刷新sentinel 控制台,实时监控信息,如图所示:
6. 在簇点链路中,设置一下指定接口的流控(流量控制),即选择 流控选项,设置阈值类型(QPS-每秒请求次数),单击阈值为1(表示每秒允许的请求次数为1)代表每秒请求不能超出1次,要不然就做限流处理,处理方式直接调用失败。
7.反复刷新访问消费端端服务,检测是否有限流信息输出,如图所示:
Sentinel-流控规则
阈值类型(QPS,线程数)
- QPS(Queries Per Second):当调用相关url对应的资源时,QPS达到单机阈值时,就会限流。
- 线程数:当调用相关url对应的资源时,线程数达到单机阈值时,就会限流。
流控模式(直接,关联,链路)
Sentinel的流控模式代表的流控的方式,默认【直接】,还有关联,链路。