站酷做网站,医院如何做网站策划,wordpress轮播图特效,龙之向导全球贸易目录
前言
1W#xff1a;什么是Sentinel#xff1f;
2W#xff1a;为什么使用Sentinel#xff1f;
3W#xff1a;如何使用Sentinel#xff1f;
1. 在pom.xml中导入Sentinel依赖坐标
2. 配置控制台
3. 访问API接口的任意端点
流量控制
1. 簇点链路
2. 快速入门…目录
前言
1W什么是Sentinel
2W为什么使用Sentinel
3W如何使用Sentinel
1. 在pom.xml中导入Sentinel依赖坐标
2. 配置控制台
3. 访问API接口的任意端点
流量控制
1. 簇点链路
2. 快速入门
流控模式
1. 直接模式
2. 关联模式 3. 链路模式
4. 总结
流控效果
1. warm up
2. 排队等待
3. 总结
热点数据限流
1. 标记资源 隔离和降级
FeignClient整合Sentinel
1.修改配置开启sentinel功能
2. 编写失败降级逻辑
方式①
方法②
3.线程隔离舱壁模式
总结 前言
在整合Sentinel前我们需要了解一下微服务中的雪崩问题
雪崩问题在微服务中如果服务提供者发生了故障当前应用的部分业务因为依赖于该服务因此也会被阻塞。请求一直阻塞会导致服务器资源耗尽从而导致其他服务都不可用形成级联失败从而形成雪崩问题。
1W什么是Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件。
Sentinel官网https://sentinelguard.io/zh-cn/index.html
2W为什么使用Sentinel
丰富的应用场景Sentinel承接了阿里巴巴近10年来的双十一大促流量的核心场景例如秒杀突发流量控制在系统容量的可承受范围内、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。完备的实时监控Sentinel提供实时监控功能。可以在控制台中看到接入到应用的单台机器秒级数据甚至500台以下规模的集群的汇总运行情况。广泛的开源生态Sentinel提供开箱即用的与其他开源框架/库的整合模块例如与Spring Cloud、Dubbo、gRPC的整合。我们只需要引入相关的依赖并进行简单的配置即可快速地接入Sentinel。完善的SPI扩展点Sentinel提供简单易用、完善的SPI扩展接口。我们可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
3W如何使用Sentinel
1. 在pom.xml中导入Sentinel依赖坐标
!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactIdversion2021.1/version
/dependency
2. 配置控制台 修改application.yaml文件添加下面内容
spring:cloud:sentinel:transport:dashboard: localhost:[端口号]
3. 访问API接口的任意端点
打开浏览器访问http://localhost:端口号/API接口触发sentinel的监控。
然后访问sentinel控制台
默认路径为http://localhost:8080页面
默认登录账号sentinel
默认登录密码sentinel 流量控制
限流是避免服务因突发的流量而发生故障。
1. 簇点链路
当请求进入微服务时会首先访问DispatcherServlet然后进入Controller、Service、Mapper这样的一个调用链叫做簇点链路。
簇点链路中被监控的每一个接口都是一个资源。
默认情况下sentinel会监控SpringMVC的每一个端点Endpoint也就是controller层中的方法因此SpringMVC的每一个端点Endpoint就是调用链路中的一个资源。 流控、熔断等都是针对簇点链路中的资源来设置因此我们可以点击对应资源后面的按钮来设置规则
流控流量控制降级降级熔断热点热点参数限流限流的一种方式授权请求的权限控制
2. 快速入门
点击资源/order/prod/{pid}后面的流控按钮弹出表单。 QPS线程数用户数量/用户访问时间 请求数/秒即每秒的响应请求数也就是最大吞吐量。
在sentinel控制台添加限流规则QPS的单机阈值为五然后测试。利用jmeter测试 20个用户2秒内运行完QPS是10超过了5
选中流控入门QPS5 右击运行 结果成功的请求每次只有5个 流控模式
在添加限流规则时点击高级选项可以选择三种流控模式
直接统计当前资源的请求触发阈值时对当前资源直接限流也是默认模式关联统计与当前资源相关的另一个资源触发阈值时对当前资源限流链路统计从指定链路访问到本资源的请求时触发阈值时对指定链路限流
1. 直接模式 快速入门测试就是直接模式。 2. 关联模式
关联模式统计与当前资源相关的另一个资源触发阈值时对当前资源限流
配置规则 语法说明当/write资源访问量触发阈值时就会对/read资源限流避免影响/write资源
使用场景比如用户支付时需要修改订单状态同时用户要查询订单。查询和修改操作会争抢数据库锁产生竞争。业务需求是优先支付和更新订单的业务因此当修改订单业务触发阈值时需要对查询订单业务限流。
需求说明
添加两个新的端点/order/query和/order/update
GetMapping(/order/query)
public String queryOrder(){return 查询订单成功;
}
GetMapping(/order/update)
public String updateOrder(){return 更新订单成功;
}
配置流控规则当/order/update资源被访问的QPS超过5时对/order/query请求限流 可以看到1000个用户100秒QPS为10超过了设置的阈值5
请求的目标是/order/update这样这个端点就会触发阈值
但限流的目标是/order/query我们在浏览器访问发现确实被限流了 3. 链路模式
链路模式统计从指定链路访问到本资源的请求时触发阈值时对指定链路限流
配置示例
例如有两条请求链路
/test1 -- /common/test2 -- /common如果只希望统计从/test2进入到/common的请求可以这样配置 需求说明
1.在OrderService中添加一个queryGoods方法不用实现业务
public void queryGoods(){System.err.println(查询商品);
}
2.在OrderController中改造/order/query端点调用OrderService中的queryGoods方法
GetMapping(/order/query)
public String queryOrder(){//查询商品orderService.queryGoods();//查询订单System.out.println(查询订单);return 查询订单成功;
}
3.在OrderController中添加一个/order/save的端点调用OrderService的queryGoods方法
GetMapping(/order/save)
public String saveOrder(){//查询商品orderService.queryGoods();//查询订单System.out.println(新增订单);return 新增订单成功;}
4.给queryGoods配置限流规则从/order/query进入queryGoods的方法限制QPS必须小于2
SentinelResource(goods)
public void queryGoods(){System.err.println(查询商品);
}
链路模式中是对不同来源的两个链路做监控。但是sentinel默认会给进入Spring MVC的所有请求设置同一个root资源导致链路模式失效。
我们需要关闭这种对Spring MVC的资源聚合修改order-service服务的application.yml文件
spring:cloud:sentinel:web-context-unify: false #关闭context整合
重启服务访问/order/query和/order/save可以查看sentinel的簇点链路规则中出现了新的资源 添加流控规则
点击goods资源后面的流控按钮在弹出的表单中填写下面信息 只统计从/order/query进入/goods的资源QPS的阈值为2超出则被限流。 可以看到这里200个用户50秒内发完QPS为4超过了我们设定的阈值2
一个http请求是访问/order/save运行的结果完全不受影响 4. 总结
流控模式有哪些
直接对当前资源限流关联高优先级资源触发阈值对低优先级资源限流链路阈值统计时只统计从指定资源进入当前资源的请求是对请求来源的限流 流控效果
流控效果是指请求达到流控阈值时应该采取的措施
快速失败达到阈值后新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式warm up预热模式对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化从一个较小值逐渐增加到最大阈值排队等待让所有的请求按照先后次序排队执行两个请求的间隔不能小于指定时长 1. warm up
warm up也叫预热模式是应对服务冷启动的一种方案。请求阈值初始值是maxThreshold / coldFactor持续指定时长后逐渐提高到maxThreshold值。而coldFactor的默认值是3
需求说明
给/order/prod/{pid}这个资源设置限流最大QPS为10利用warm up效果预热时长为5秒 刚刚启动时大部分请求失败成功的只有3个说明QPS被限定在3随着时间推移成功比例越来越高 2. 排队等待
当请求超过QPS阈值时快速失败和warm up会拒绝新的请求并抛出异常。
排队等待是让所有请求进入一个队列中然后按照阈值允许的时间间隔依次执行。后面的请求必须等待前面执行完成如果请求预期的等待时间超出最大时长则会被拒绝。
需求说明
给/order/prod/{pid}这个资源设置限流最大QPS为10利用排队的流控效果超时时长设置为5s QPS为15已经超过了我们设定的10
如果是之前的 快速失败、warmup模式超出的请求应该会直接报错 全部通过 QPS非常平滑一致保持在10但超出的请求没有被拒绝而是放入队列。 3. 总结
流控效果
快速失败QPS超出阈值时拒绝新的请求warm upQPS超出阈值时拒绝新的请求QPS阈值是逐渐提升可以避免冷启动时高并发导致服务器宕机排队等待请求会进入队列按照阈值允许的时间间隔依次执行请求如果请求预期等待时长大于超时时间直接拒绝 热点数据限流
分别统计参数值相同的请求判断是否超过QPS阈值。
案例需求给/order/prod/{pid}这个资源加热点参数限流规则如下
默认的热点参数规则是每1秒请求量不超过2给1这个参数设置例外每1秒请求量不超过4给19这个参数设置例外每1秒请求量不超过10
注热点参数限流对默认的Spring MVC资源无效需要利用SentinelResouce注解标记资源
1. 标记资源
给shop-order中的OrderController中的/order/prod/{pid}资源添加注解
SentinelResouce(hot)
访问该接口可以看到我们标记的hot资源出现了这里不要点击hot后面的按钮页面有bug
点击左侧菜单中热点规则菜单 Jmeter测试
这里发起请求的QPS为5包含3个http请求
普通参数QPS阈值为2
运行结果每次成功2个请求
例外项QPS阈值为4
运行结果每次成功4个请求
例外项QPS阈值为10
运行结果每次成功所有请求 隔离和降级
线程隔离调用者在调用服务提供者时给每个调用的请求分配独立线程池出现故障时最多消耗这个线程池内资源避免把调用者的所有资源耗尽
熔断降级调用方这边加入断路器统计对服务提供者的调用如果调用的失败比例过高则熔断该业务不允许访问该服务的提供者
不管是线程隔离还是熔断降级都是对客户端的保护
FeignClient整合Sentinel
在SpringCloud中微服务调用都是通过Feign来实现的因此做客户端保护必须整合Feign和Sentinel
1.修改配置开启sentinel功能
修改shop-Order的application.yml文件开启Feign的Sentinel
feign:sentinel:enabled: true # 开启feign对sentinel的支持
2. 编写失败降级逻辑
业务失败后不能直接报错而应该返回用户一个友好提示或者默认结果这个就是失败降级逻辑
给FeignClient编写失败后的降级逻辑
方式一FallbackClass,无法对远程调用的异常做处理
方法二FallbackFactory可以对远程调用的异常做处理 方式①
步骤一配置yml文件开启支持
feign:sentinel:enabled: true
步骤二创建ProductServiceFallBack类实现降级方案编辑
Component
public class ProductServiceFallBack implements IProductService{Overridepublic Product findByPid(Integer pid){Product product new Product();product.setPid(-1);product.setPname(暂无商品);return product;}}步骤三配置属性
FeignClent(valueservice-product,fallbackFactory ProductServiceFallBack.class) 方法②
步骤一配置yml文件开启支持
feign:sentinel:enabled: true 步骤二创建ProductServiceFallBack类实现降级方案编辑
Component
public class ProductServiceFallBack implements FallBackFactoryProductService{Overridepublic ProductService create(Throwable throwable){return new ProductService(){Overridepublic Product findByPid(Integer pid){System.out.println(异常信息:throwable);Product product new Product();product.setPid(-1);product.setPname(暂无商品);return product; }};}
}
步骤三配置属性
FeignClient(valueservice-product,fallbackFactory ProductServiceFallBack.class)
3.线程隔离舱壁模式
线程池隔离给每个服务调用业务分配一个线程池利用线程池本身实现隔离效果信号量隔离Sentinel默认采用不创建线程池而是计数器模式记录业务使用的线程数量达到信号量上限时禁止新的请求
案例需求给order-service服务中的UserClient的查询用户接口设置流控规则线程数不能超过2然后利用Jmeter测试。 一次发送10个请求有较大概率并发线程数超过2而超出的请求会走之前定义的失败降级逻辑。
发现虽然结果是通过了不过部分请求得到的响应是降级返回的null信息。 总结
线程隔离的两种手段是
信号量隔离线程池隔离
信号量隔离的特点
基于计数器模式简单开销小
线程池隔离的特点
基于线程池模式有额外开销但隔离控制更强