Sentinel的简单使用


Sentinel简介:

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

总而言之,Sentinel和Hystrix一样,是为了房子雪崩效应引起系统故障而产生的。

搭建Sentinel控制台:

1.下载并运行sentinel的jar包:

可以去https://github.com/alibaba/Sentinel下载Sentinel的jar包。

然后使用java -jar xxxxx.jar命令运行Sentinel。

运行成功后访问8080端口 结果如图:

 

 

 初始账号和密码均为sentinel.

这样,sentinel就配置好了。

将微服务注册到Sentinel:

1.配置pom.xml:

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

2.写yml:
spring:
application:
name: sentinel-service-5555
cloud:
sentinel:
transport:
dashboard: localhost:8080 #sentineldashboard地址
port: 8719 #如果被占用会增加1
3.写方法:
@RestController
public class RateLimitController {
@GetMapping("/resource")
@SentinelResource(value = "resource")
public CommonResult resource(){
return new CommonResult(200,"test",new Payment(2020l,"001"));
}
public CommonResult handler(BlockException blockException){
return new CommonResult(444,blockException.getClass().getName());
}
}
使用@SentinelResource(value = "resource") 将该服务命名。
启动微服务,并访问该服务的url,能看到:

 

 

 这样能够通过控制台对服务进行配置。

配置Sentinel对该微服务的限制规则:

 流控模式:

 

 QPS为每秒请求数,如果大于阈值,会触发流控

而线程数是设置了调用该api的最大线程数,如果大于阈值,也会触发流控。

流控模式:

关联:关联的资源达到阈值,限流自己。

 

 例如:当支付接口出现问题时,限流订单接口。关联资源达到阈值,限流资源名的接口。

链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就可以限流)

流控效果:

预热:根据codeFactor(冷加载因子,默认为3)的值,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。

例:

 

初始阈值为10/3,经过5秒的预热,最终阈值为10 

排队等待:如字面意思,每个请求在超时时间内排队等待进行处理。

降级规则:

1.慢调用比例:最大RT(平均响应时间) 需要设置的阈值,超过该值则为慢应用。

比例阈值 慢调用占所有的调用的比率,范围:[0~1]

熔断时长 在这段时间内发生熔断、拒绝所有请求

最小请求数 即允许通过的最小请求数,在该数量内不发生熔断

2.异常比例: 异常比例阈值:发生异常请求数/总请求数

3.异常数:请求发生异常的数量

热点规则限流:何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。

 

@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "dealProblem")
//blockhandler配置了当该方法违背热点规则时,调用的方法。当违背热点规则时,调用dealProblem方法。
public String HotKEY(@RequestParam(value = "p1",required = false) String p1,@RequestParam(value = "p2",required = false) String p2){
return "testHotKey";
}
public String dealProblem(String p1, String p2, BlockException exception){
return "22222";
}
配置热点规则:

 

 这意味着,调用被热点规则限制的api时,如果包含参数p1并超过QPS阈值,则会调用dealProbelm方法,无法正常访问,不含p1则无QPS限制。如果参数索引改成1,则限制p2。

参数例外项:

 

 当热点参数的参数类型为设置的参数类型的设置参数值,限流阈值为设置的阈值。

 系统规则:对整个系统进行保护设置。

 自定义Sentinel处理:

当限流或异常时,我们想要跳转到自定义的页面或自定义处理方法,这就需要我们使用@SentinelResource注解

在上文的热点限流中,我们也已经使用过了@SentinelResource,现在我们再看看@SentinelResource的用法。

blockHandler:为服务设置触发sentinel限流,降级时调用的方法,

@SentinelResource(value = "testHotKey",blockHandler = "dealProblem")
public String HotKEY(@RequestParam(value = "p1",required = false) String p1,@RequestParam(value = "p2",required = false) String p2){
   return "testHotKey";
}
   public String  dealProblem(String p1, String p2, BlockException exception){
    return "22222";
   }
当该api触发sentinel设置的限流 降级规则时,将调用blokcHandler的dealProblem方法。
blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,

 

blockHandlerClass:

blockHandler默认调用方法在当前类,blockHandlerClass 设置调用方法所在的类。但是调用的函数必须为static函数。

例如:

@GetMapping("/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",blockHandlerClass= MyCustomerBlockHandler.class,blockHandler = "globalHandler")
public CommonResult customerBlockHandler(){
return new CommonResult(200,"test2",new Payment(2020l,"002"));
}
public class MyCustomerBlockHandler {

public static CommonResult globalHandler(BlockException blockException){
return new CommonResult(444,"test3");
}
}
当触发sentinel设置的规则后,将调用MyCustomerBlockHandler.class类中的globalHandler方法进行处理。

fallback:

当产生异常,而不是触发sentinel配置时,将调用设置的兜底方法。类似于hystrix中的fallbackMethod。不太清楚hystrix的朋友可以去看看我写的hystrix博客。

 

fallbackClass:

作用和blockHandlerClass类似。

 

exceptionsToIgnore

 

指定哪些异常被排除,不进入 fallback 逻辑中,原样抛出。

注:当同时被限流和降级,会调用blockHandler的方法,Sentinel熔断OpenFeign和hystrix整合OpenFeign类似,唯一的区别是,把feign对hystrix的支持改为对sentinel的支持feign sentinel:

feign:
sentinel:
enabled: true


sentinel的规则持久化
配置的规则,在微服务重启后消失,需要对其进行持久化。可以将持久化信息存入nacos中
1.引入依赖
<!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
配置yml:
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
port: 8719
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: cloudalibaba-sentinel-service
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
nacos在对应的命名空间创建配置文件,信息与配置一致,内容为:
[
    {
        "resource": "demo_test",
        "count": 1,
        "grade": 1,
        "limitApp": "default",
        "strategy": 0,
        "controlBehavior": 0
    }
]





					


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM