SpringCloud Alibaba Sentinel实现熔断与限流 |
您所在的位置:网站首页 › 服务降级算法 › SpringCloud Alibaba Sentinel实现熔断与限流 |
SpringCloud Alibaba Sentinel实现熔断与限流
中文网:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D Sentinel 是什么?随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Docker 安装 Sentinel #拉取sentinel镜像 docker pull bladex/sentinel-dashboard #运行sentinel(docker里的sentinel是8858端口) docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard #把nacos和mysql也启动起来访问: http://120.92.164.250:8858/#/login 账号和密码都是sentinel 演示 新建模块 cloudalibaba-sentinel-service8401 pom com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.csp sentinel-datasource-nacos com.alibaba.cloud spring-cloud-starter-alibaba-sentinel org.springframework.cloud spring-cloud-starter-openfeign org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test yml server: port: 8401 spring: application: name: cloudalibaba-sentinal-service cloud: nacos: discovery: #Nacos服务注册中心地址(改成自己的服务器ip地址,本地用localhost) server-addr: 120.92.164.250:8848 sentinel: transport: #配置Sentin dashboard地址(改成自己的服务器ip地址,本地用localhost) dashboard: 120.92.164.250:8858 # 默认8719端口,假如被占用了会自动从8719端口+1进行扫描,直到找到未被占用的 端口 port: 8719 management: endpoints: web: exposure: include: '*' 启动类 @EnableDiscoveryClient @SpringBootApplication public class MainApp8401 { public static void main(String[] args) { SpringApplication.run(MainApp8401.class, args); } } 测试,启动8401,然后刷新sentinel后台页面(因为sentinel采用懒加载策略,所以需要调用服务后才在后台显示)在浏览器分别输入,然后刷新sentinel后台页面:http://localhost:8401/testA http://localhost:8401/testB Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时 Sentinel 也提供相关 API,供您来定制自己的规则策略。 Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。 流量控制规则 (FlowRule)同一个资源可以同时有多个限流规则,检查规则时会依次检查。
QPS与线程数的区别 : QPS(每秒请求的数量):当调用该api的QPS达到阀值的时候,进行限流: 线程数:当调用该API的线程数达到阀值的时候,进行限流 QPS是直接挡在外面,而线程数是有多少个线程在处理,放进来后,有线程是空闲状态就对请求进行处理,都没空闲,就限流 QPS流量控制直接 : 快速失败 关联:当关联的资源达到阀值时,就限流自己,当与A关联的资源B达到阀值后,就限流A自己 链路:Sentinel 允许只根据某个入口的统计信息对资源限流。 当 QPS 超过某个阈值的时候,则采取措施进行流量控制。流量控制的效果包括以下几种:直接拒绝、Warm Up、匀速排队。对应 FlowRule 中的 controlBehavior 字段。 注意:若使用除了直接拒绝之外的流量控制效果,则调用关系限流策略(strategy)会被忽略。直接拒绝 直接拒绝(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。Warm Up Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。匀速排队 匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法 降级规则系统保护规则是从应用级别的入口流量进行控制,从单台机器的load 、cpu使用率、平均RT、入口QPS和并发线程数几个纬度监控应用指标,让系统尽可能的跑在最大吞吐量的同时保证系统整体的稳定性 系统保护规则则是应用整体纬度的,而不是资源纬度的,并且仅对入口流量生效。入口流量指的是进入应用的流量,比如Web 服务或Dubbo 服务端接收的请求,都属于入口流量。 系统则支持以下的模式 Load 自适应 : 系统的load1作为启发指标,精细自适应系统保护。当系统load1超过启发值,且系统当前的并发数超过估算的系统容量时才会触发系统保护 CPU usage :当系统CPU使用率超过阀值即触发系统保护 平均RT:当单台机器上所有入口流量的平均RT达到阀值时触发,单位是毫秒 并发线程数 : 当单台机器上所有入口流量的并发线程数达到阀值时触发系统保护 入口 QPS : 当单台机器上所有入口流量的QPS 达到阀值即触发系统保护针对系统: 何为热点:热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频率最高的Top Key 数据,并且对其访问进行限制: 比如: 商品ID作为参数,针对一段时间内最常购买的商品ID进行限制 商品ID作为参数,针对一段时间内频繁访问的用户ID进行限制
设置限流 1秒 添加自定义类 public class CustomerBlockHandler { public static CommonResult handlerException(BlockException exception) { return new CommonResult(444,"按照客户自定义限流测试,Glogal handlerException ---- 1"); } public static CommonResult handlerException2(BlockException exception) { return new CommonResult(444,"按照客户自定义限流测试,Glogal handlerException ---- 2"); } }新增接口 //CustomerBlockHandler @GetMapping("/rateLimit/customerBlockHandler") @SentinelResource(value = "customerBlockHandler", blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handlerException2") public CommonResult customerBlockHandler() { return new CommonResult(200,"按照客户自定义限流测试",new Payment(2020L,"serial003")); }![]() yml 添加对 datasource datasource: ds1: nacos: server-addr: 10.211.55.26:8848 #nacos dataId: ${spring.application.name} groupId: DEFAULT_GROUP data-type: json rule-type: flow feign: sentinel: enabled: true #激活Sentinel 对Feign的支持
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |