- Spring Cloud Alibaba:Sentinel实现熔
- 2022-07-22 Springcloud基础知识(13)-
- spring cloud alibaba - Sentinel哨
- spring cloud alibaba - Sentinel哨
- 二. spring cloud 集成 sentinel做限流
- 26. Spring Cloud Alibaba之服务容错组件
- Spring Cloud Alibaba之服务容错组件 - Se
- Spring Cloud Alibaba Sentinel对Fe
- 25. Spring Cloud Alibaba之服务容错组件
- Sentinel对RestTemplate的支持(十二)
Sentinel 以 流量 为切入点,在流量控制,断路和负载保护等多个领域工作,以保护服务可靠性。官网地址
一、Sentinel 基本概念
资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
Sentinel 功能和设计理念
流量控制
什么是流量控制
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:
![](https://img.haomeiwen.com/i13859779/050eafd127bf94ba.png)
流量控制设计理念
流量控制有以下几个角度:
- 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
- 运行指标,例如 QPS、线程池、系统负载等;
- 控制的效果,例如直接限流、冷启动、排队等。
Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。
熔断降级
什么是熔断降级
除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。
![](https://img.haomeiwen.com/i13859779/fabd2e29f81e10a1.png)
Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。
熔断降级设计理念
在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。
Hystrix 通过 线程池隔离 的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本(过多的线程池导致线程数目过多),还需要预先给各个资源做线程池大小的分配。
Sentinel 对这个问题采取了两种手段:
- 通过并发线程数进行限制
和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
- 通过响应时间对资源进行降级
除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。
二、实战
导包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 监控控制台 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
注解形式
注解的形式要做限流的话需要和 Sentinel 控制台 搭配才能做到,这里我们先说注解的形式使用。
@GetMapping("/sentinelTest")
@SentinelResource("sentinelTest")
public String sentinelTest(){
return "hello Sentinel";
}
对于 @SentinelResource 参数解释 看这里
下载 sentinel-dashboard.jar 并启动
java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8810 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar
建议 Dserver.port 和 Dcsp.sentinel.dashboard.server的port不要一样,否则自己也会被监控,没有必要。也可以启动不加 Dcsp.sentinel.dashboard.server,其意义是为了让在 dashbord 被发现。
sentinel-dashboard并不用考虑负载和并发问题,因为sentinel-dashboard是主动去请求你的client端的,会把配置的规则发给client,client在执行的时候自己做校验,只有在client 被执行的时候 会向 sentinel-dashboard 通信,看是否在 sentinel-dashboard 注册,或者说是看 sentinel-dashboard 是否记录了我的IP peort applicationName等信息。
刚启动的控制台实则什么也没有,需要 client 被执行后才能注册到 sentinel-dashboard 上。
![](https://img.haomeiwen.com/i13859779/29df65b9fc255854.png)
启动 client
![](https://img.haomeiwen.com/i13859779/ddaa09c2ffe771d1.png)
-Dcsp.sentinel.dashboard.server=192.168.31.34:8888
spring boot 项目中可以使用以下让其发现client端
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8888
访问接口
![](https://img.haomeiwen.com/i13859779/7975fbc9ea8d1263.png)
![](https://img.haomeiwen.com/i13859779/daed8834307fdf8e.png)
测试接口限流
![](https://img.haomeiwen.com/i13859779/a2ce96442e257267.png)
![](https://img.haomeiwen.com/i13859779/6b5c79d8f3813f04.png)
![](https://img.haomeiwen.com/i13859779/3dd479cebd7d0240.png)
![](https://img.haomeiwen.com/i13859779/bcbffee2a5c2ff72.png)
![](https://img.haomeiwen.com/i13859779/59ab69438dd4782a.png)
三、日志
sentinel的日志在请求之后,默认用户路径下生成,在windows下是在C盘,mmp(C盘本来就不大),改掉日志的存储需要在项目中加入以下,就会在当前项目下创建 /sentinel/log 日志。
# sentinel 日志
spring.cloud.sentinel.log.dir=./sentinel/log
网友评论