阿里sentinel说明及使用

一曲冷凌霜 提交于 2019-12-02 15:40:12

使用说明

如果只是为了让使 用Sentinel 的限流功能,只需要引入相关的jar包依赖。

添加依赖

添加相关模块的Adapter

Sentinel为每个构建项目的各个组件都打包成了相应的Adapter。项目需要按需引入。现阶段的Dubbo-Adapter模块最高只支持到dubbo 2.6.6

<dependency>     <groupId>com.alibaba.csp</groupId>     <artifactId>sentinel-dubbo-adapter</artifactId>     <version>1.6.3</version> </dependency>

各个模块的adapter

限流信息上传dashboard

添加参数

添加此依赖,客户端的实时限流信息能汇总到后台管理界面。

<dependency>     <groupId>com.alibaba.csp</groupId>     <artifactId>sentinel-transport-simple-http</artifactId>     <version>1.6.3</version> </dependency>
修改启动参数
# 指定 dashboard的访问地址和自己在dashbaord中要显示的名字。  -Dcsp.sentinel.dashboard.server=localhost:8888 -Dproject.name=sentinel-dashboard

经过以上几个步骤,就可以在dashboard中看到相关的项目。里面的流控规则就根据自己实际需要来进行设置。

规则说明

流量控制规则

field 说明 默认值
resource 资源名,限流规则的作用对象如具体的url
count 限流阀值,超过这个值就会触发
grade 阈值类型,QPS或者线程数 QPS
limitApp 流控针对的调用来源 default,代表不区分调用来源
strategy 判断是根据资源本身还是根据其它关联资源(refResource)还是根据链路入口 根据资源本身
controlBehavior 流控效果(直接拒绝/排队等待/慢启动) 直接拒绝

同一个资源可以同时有多个限流规则。

private void initFlowQpsRule() {     List<FlowRule> rules = new ArrayList<>();     FlowRule rule = new FlowRule(resourceName);     // set limit qps to 20     rule.setCount(20);     rule.setGrade(RuleConstant.FLOW_GRADE_QPS);     rule.setLimitApp("default");     rules.add(rule);     // 加载流控规则     FlowRuleManager.loadRules(rules); }

熔断降级规则

熔断降级规则包含下面几个重要的属性:
field | 说明 | 默认值
--- | --- | ---
resource | 资源名,限流规则最用对象 |
count | 阀值 |
grade | 降级模式。根据RT(熔断)降级还是异常比例降级 | RT
timeWindow | 降级后的时间作用窗口 (s) |
同一个资源可以配置多个降级规则。

 private void initDegradeRule() {     List<DegradeRule> rules = new ArrayList<>();     DegradeRule rule = new DegradeRule();     rule.setResource(KEY);     // set threshold RT, 10 ms     rule.setCount(10);     rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);     rule.setTimeWindow(10);     rules.add(rule);     // 加载降级规则     DegradeRuleManager.loadRules(rules); }

系统保护规则

field 说明 默认值
highestSystemLoad 最大的load -1 (不生效)
avgRt 所有入口流量的平均响应时间 -1 (不生效)
maxThread 入口流量的最大并发数 -1 (不生效)
qps 所有入口资源的qps -1 (不生效)
private void initSystemRule() {     List<SystemRule> rules = new ArrayList<>();     SystemRule rule = new SystemRule();     rule.setHighestSystemLoad(10);     rules.add(rule);     // 加载系统规则     SystemRuleManager.loadRules(rules); }

Hystrix 对比

为什么要引入隔离的。当系统中的慢调用一直运行的时候,会对资源造成一种独占的情况,从而影响其它进程对该资源的访问造成系统相应变慢的现象。
为解决这种情况,引入隔离的方式来运行,使资源间的访问都是相互独立的。

两者隔离方式的区别

线程隔离

Hystrix默认的隔离方式。针对不同的资源创建不同的线程池,不同服务调用都在不同的线程池中,在线程池排队、超时等阻塞情况下可以快速失败、并提供fallback机制。

  • 优点

    线程池隔离的好处是隔离程度比较高,可以针对某个资源的线程池去进行处理二部影响其它资源
  • 缺点

    代价是线程的上下文切换的代价比较大,特别是对低延时的调用影响比较大

    会让机器资源碎片化。比如项目运行于tomcat容器中,本身tomcat自身的线程数就非常多,如果再加上Hystrix创建的线程池,这样上下文切换会有非常大的损耗。

    线程池模式比较彻底的隔离性使得Hystrix可以针对不同资源线程池进行排队、超时情况分别做处理。
信号量隔离

限制对某个资源调用的并发数。

  • 优点

    这样的隔离是轻量级,仅限制对某个资源调用的并发数,而不是显式地去创建线程池,所以对系统地负载比较小。
  • 缺点

    无法对慢调用的自动进行降级,只能等待客户端自己超时,因此可能会出现级联阻塞的情况。

Sentinel可以通过并发线程数模式的流量控制来提供信号量的隔离功能。并结合基于响应时间的熔断降级模式,可以在不稳定的平均相应时间比较高的时候自动降级,防止过多的慢调用占满并发数,影响整个系统

熔断降级对比

两者的熔断降级功能本质上都是基于熔断器模式SentinelHystrix都支持基于失败比率的熔断降级,在调用达到一定量级并且失败率达到设定阈值时自动进行熔断,此时所有对改资源的调用都会被block,直到过了指定的失败窗口才启发性的恢复。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!