限流的作用:
保护系统避免被瞬时流量冲垮;
预防恶意请求;
如何控制流量:
限流的指标:(可以容纳的流量,已经容纳的流量,可以接受的流程)阈值;
限流的过程:通过算法来实现;
限流的结果:处理策略;
限流的算法:
计数器(zk里面的RequestThrottle) :线程池大小,连接数大小;
滑动窗口:
漏桶算法:
水的流程速度是固定的,桶的大小也是固定的;
令牌桶算法:
令牌桶的设计:桶的大小,令牌标记,定时任务生成令牌,令牌获取的接口;
限流的实现:
Guava
Semphore
分布式限流
服务熔断:
hystrix:
线程的隔离和资源的隔离,可以避免联动的问题,但是会导致线程池创建的特别多,线程切换的成本比较大;
sentinel:
通过并发线程数进行控制;
针对响应时间;
限流:针对请求当前服务的限制;
降级:针对下游返回的结果的处理;
Entry entry= SphU.entry(“resource_name”)
·正常就通过
·被限制就抛异常 FlowException
·同一个资源创建不同的规则,多个规则采用遍历:
List<FlowRule> flowRules = new ArrayList();
FlowRule flowRule = new FlowRule();
flowRule.setResource("doRequest"); //针对resource_name资源设置规则
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); //QPS或者并发数
flowRule.setCount(5); // QPS= 5
flowRules.add(flowRule);
FlowRuleManager.loadRules(flowRules);
·规则由什么组成?
··resource
··grade 类型
··count 阈值
··limitApp 调用来源
··strategy 调用关系
··ontrolBehavior 控制行为(直接拒绝,冷启动,匀速排队)
linux启动sentinel
java -Dsrver.port=7777 -Dcsp.sentinel.dashboard.server=localhost:7777 -Dproject.name=sentinel-dashboard-1.8.0 -jar sentinel-dashboard-1.8.0.jar
集群限流:
sentinel中的token server会统计连接的所有的token client的访问数,实现总的流量控制;
当token server挂了后,token client可以自己从配置中心拉取规则。(拉取的是单个的还是总的?)
Token Client:
集群流控客户端,用于向所属 Token Server 通信请求 token,集群限流服务端会返回给客户端结果,决定是否限流;
Token Server:
集群流控客户端,处理来自 Token Client 的请求,根据配置的集群规则判断是否应该发放 token(是否通过)
Token Client: 向Token Server请求Token
限流服务器向Client发送Token,决定是否进行限流,
这样资源由服务器进行分配,Client拿着Token去请求服务器.