链接:https://pan.baidu.com/s/1VeWcADDnsc1bbk8lPG2jzA
提取码:ucmv
兄弟们,在git上下载20M不容易,给个赞鼓励一下,哈哈哈
安装
G:\IDEA课件>java -jar sentinel.jar 因为我重命名了 所以sentinel.jar
http://localhost:8080
用户名和密码都是sentinel
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL6VERPFTTE9EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzcjM2UDO1UTM2ETNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
使用
官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html
初始化监控
配置服务8401
pom文件
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
application.yml
server:
port: 8401
spring:
application:
name: sentinel-service-8401
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080 #配置dashboard地址
port: 8719 #默认端口为8719,加入占用会自动从8719开始一次扫描+1,直到找到未占用的端口
#暴露端口
management:
endpoints:
web:
exposure:
include: "*"
注意启动时,要Java -jar
流控
流量控制
●资源名:唯一名称,默认请求路径
●针对来源: Sentine可以针对调用者进行限流,填写微服务名,默认default (不区分来源)
●阈值类型/单机阈值:
- QPS (每秒钟的请求数量) :当调用该api的QPS达到闽值的时候,进行限流
- 线程数:当调用该api的线程数达到阈值的时候,进行限流
●流控模式:
- 直接: api达到限流条件时,直接限流
- 关联:当关联的资源达到阈值时,就限流自己
- 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流) [api级
- 别的针对来源]
阈值类型
QPS直接快速失败(阻塞后不允许进入)
配置
如果超出一秒一次,那么就会block 阻塞
线程数(阻塞后允许进入)
当达到线程数阈值后限流
流控模式
1.直接
上面介绍过
2.关联
当关联的资源达到阈值后就限流自己,当A关联的资源B达到阈值后,就限流A自己
用postman发送请求测试:20个线程每隔0.3秒访问一次
发现test1也发生了block
3.链路
流控效果
1.快速失败
上面介绍过
2.预热 Warm up
默认冷加载因子:coldFactor为3
单机阈值为10,预热时长为5,coldFactor默认3
经过5秒逐渐升至设定的QPS阈值,前五秒是3,过了5秒后慢慢升高到10
效果:前五秒点的快会发生block,后五秒就不会发生了
应用场景:秒杀系统,开启瞬间会有很多流量,很有可能系统崩溃,预热就是为了保护系统
3.排队等待
对应漏桶算法
匀速排队,让请求以匀速的速度通过,阈值类型必须为QPS
意义:/test1以每秒1次请求,超时的话排队等待,等待的超时时间为20000毫秒
这种方式主要用于处理间隔性突发的流量,例如消息队列:
在某一秒有大量的请求到来,而接下来的几秒处于空闲状态,我们希望系统能够在接下来的空闲时间逐渐处理这些请求,而不是在第一秒直接拒绝
测试: 10个线程,1秒1个,发现都没有失败只是有点慢
降级规则(在时间窗口内通过的请求>=5)
RT平均响应时间(秒级)
平均响应时间超出阈值 且 (在时间窗口内通过的请求>=5)俩个条件同时满足后触发降级,窗口期过后关闭断路器
RT最大4900,更大需要通过 -Dcsp.sentinel.statistic.max.rt=xxxx才能生效
sentinel 1.17(百度网盘下载)安装使用阈值类型
sentinel 1.17(百度网盘下载)安装使用阈值类型
sentinel 1.17(百度网盘下载)安装使用阈值类型
jmeter开始运行后
异常比例(秒级)
QPS>=5,且异常比例超过阈值
异常数(分钟级)
异常数分钟统计超出阈值,触发降级,一般设置大于1分钟
点到第五次会从errorpage转到block
测试类
@GetMapping("/test3")
public String test3() throws InterruptedException {
TimeUnit.SECONDS.sleep(1);
return "test3";
}
@GetMapping("/test4")
public String test4() throws InterruptedException {
int a = 10/0;
return "test4";
}
热点key
测试代码: 新标签 @SentinelResource
@GetMapping("test5")
@SentinelResource(value = "test5",blockHandler = "deal_test5")
public String test5(@RequestParam(value = "p1",required = false) String p1){
return "test5";
}
public String deal_test5(String p1, BlockException blockException){
return "deal_test5";
}
注意/test是请求路径,test才是热点资源名
高级配置 key
注意:
[email protected]
处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置 的兜底处理;
2.RuntimeException
int age = 10/0, 这个是java运行时报出的运行时异常RunTimeException,@SentinelResource不管
总结
@SentinelResource主管配置出错,运行出错该走异常走异常
系统规则
系统规则支持以下的模式:
●Load自适应(仅对Linux/Unix-like机器生效) :系統的load1作为启发指标,进行自适应系统保
护。当系统load1超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系
统保护(BBR 阶段)。系统容量由系统的
maxQps南minRt
估算得出。设定参考值一般是CPU
cores * 2.5。
●CPUusage (1.5.0+版本) :当系统CPU使用率超过阈值即触发系统保护(取值范围0.0-1.0) ,
比较灵敏。
●平均RT:当单台机器上所有入口流量的平均RT达到阈值即触发系统保护,单位是毫秒。
●并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
●入口QPS:当单台机器上所有入口流星的QPS达到阈值即触发系统保护。 LA
SentinelResource配置
-
blockHandlerClass
-
blockHandler
public class CustomerBlockHandler {
public static String customerBlockhandler1(BlockException e){
return "customerBlockhandler1";
}
}
@GetMapping("/test6")
@SentinelResource(value = "test6",
blockHandlerClass = CustomerBlockHandler.class,
blockHandler = "customerBlockhandler1")
public String test6(){
return "test6";
}
按资源名限流
fallback
处理异常
@GetMapping("select/{id}")
@SentinelResource(value = "select",fallback = "fallback_select")
public Optional<Order> select(@PathVariable("id") Integer id){
return consumerService.selectById(id);
}
public Optional<Order> fallback_select(@PathVariable("id") Integer id,Throwable e){
Order order = new Order();
order.setId(101);
order.setNumber("404,fallback_select服务降级");
return Optional.of(order);
}
exceptionsToIgnore
排除
@GetMapping("select/{id}")
@SentinelResource(value = "select",blockHandler = "blockHandler_select",fallback = "fallback_select",
exceptionsToIgnore = IllegalArgumentException.class)
public Optional<Order> select(@PathVariable("id") Integer id){
if(id==4){
throw new IllegalArgumentException();
}
return consumerService.selectById(id);
}
Sentinel服务熔断和降级
我的理解:
降级:blockHandler
熔断:fallback
服务熔断
在微服务架构中,微服务之间的数据交互通过远程调用完成,微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,此时如果链路上某个微服务的调用响应时间过长或者不可用,那么对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,导致“雪崩效应”。
服务熔断是应对雪崩效应的一种微服务链路保护机制。例如在高压电路中,如果某个地方的电压过高,熔断器就会熔断,对电路进行保护。同样,在微服务架构中,熔断机制也是起着类似的作用。当调用链路的某个微服务不可用或者响应时间太长时,会进行服务熔断,不再有该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
服务熔断解决如下问题: 1. 当所依赖的对象不稳定时,能够起到快速失败的目的;2. 快速失败后,能够根据一定的算法动态试探所依赖对象是否恢复。
服务降级
服务降级是指 当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心业务正常运作或高效运作。说白了,就是尽可能的把系统资源让给优先级高的服务。
资源有限,而请求是无限的。如果在并发高峰期,不做服务降级处理,一方面肯定会影响整体服务的性能,严重的话可能会导致宕机某些重要的服务不可用。所以,一般在高峰期,为了保证核心功能服务的可用性,都要对某些服务降级处理。比如当双11活动时,把交易无关的服务统统降级,如查看蚂蚁深林,查看历史订单等等。
服务降级主要用于什么场景呢?当整个微服务架构整体的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务能正常运行,可以将一些 不重要 或 不紧急 的服务或任务进行服务的 延迟使用 或 暂停使用。
降级的方式可以根据业务来,可以延迟服务,比如延迟给用户增加积分,只是放到一个缓存中,等服务平稳之后再执行 ;或者在粒度范围内关闭服务,比如关闭相关文章的推荐。
整合openfeign
feign:
sentinel:
enabled: true
@Component
@FeignClient(value = "pay-service",fallback = ConsumerFallbackImpl.class)
public interface ConsumerService {
@GetMapping("/select/{id}")
public Optional<Order> selectById(@PathVariable("id") Integer uid);
}
@Component
public class ConsumerFallbackImpl implements ConsumerService {
@Override
public Optional<Order> selectById(Integer uid) {
Order order = new Order();
order.setId(100);
order.setNumber("404,服务降级");
return Optional.of(order);
}
}
Main
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@RibbonClients(value = {
@RibbonClient(value = "pay-service",configuration = MySelfRole.class)
})
public class Main81 {
public static void main(String[] args) {
SpringApplication.run(Main81.class,args);
}
}
规则持久化
导入依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
application配置
server: port: 8401 spring: application: name: sentinel-service-8401 cloud: nacos: discovery: server-addr: localhost:8848 sentinel: transport: dashboard: localhost:8080 #配置dashboard地址 port: 8719 #默认端口为8719,加入占用会自动从8719开始一次扫描+1,直到找到未占用的端口 datasource: ds1: nacos: server-addr: localhost:8848 dataId: sentinel-service-8401 groupId: DEFAULT_GROUP data-type: json rule-type: flow #暴露端口 management: endpoints: web: exposure: include: "*"
nacos服务注册中心配置
Data Id要和服务名称一样
[
{
"resource":"/test1",
"limitApp":"default",
"grade":1,
"count":1,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
规则描述:
- resource:资源名称;
- limitApp:来源应用:
- grade:阈值类型, 0表示线程数,1表示QPS;
- count:单机阈值;
- strategy:流控模式,表示直接,1表示关联。 2表示链路;
- controlBehavior:流控效果,0表示快速失败,1表示Warm Up, 2表示排队等待;
- clusterMode:是否集群。