SpringCloud Alibaba微服务实战五 - 限流熔断.docx

上传人:A*** 文档编号:141375865 上传时间:2020-08-07 格式:DOCX 页数:12 大小:557.80KB
返回 下载 相关 举报
SpringCloud Alibaba微服务实战五 - 限流熔断.docx_第1页
第1页 / 共12页
SpringCloud Alibaba微服务实战五 - 限流熔断.docx_第2页
第2页 / 共12页
SpringCloud Alibaba微服务实战五 - 限流熔断.docx_第3页
第3页 / 共12页
SpringCloud Alibaba微服务实战五 - 限流熔断.docx_第4页
第4页 / 共12页
SpringCloud Alibaba微服务实战五 - 限流熔断.docx_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《SpringCloud Alibaba微服务实战五 - 限流熔断.docx》由会员分享,可在线阅读,更多相关《SpringCloud Alibaba微服务实战五 - 限流熔断.docx(12页珍藏版)》请在金锄头文库上搜索。

1、SpringCloud Alibaba微服务实战五 - 限流熔断导读:本篇作为SpringCloud Alibaba微服务实战系列的第五篇,主要内容是使用Sentinel给微服务加上限流熔断功能,防止异常情况拖垮应用服务。系列文章,欢迎持续关注。简介Sentinel是面向分布式服务框架的轻量级流量控制框架,主要以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来维护系统的稳定性。在SpringCloud体系中,sentinel主要是为了替换原Hystrix的功能,与Hystrix相比,sentinel的隔离级别更加精细,提供的Dashboard可以在线更改限流熔断规则,而且使用也越加

2、方便。要了解更多详细信息请移步至Sentinel官网。基础准备要使用Sentinel提供的限流熔断能力,需要先做如下准备: 安装Sentinel这部分内容我已经在第一期SpringCloud Alibaba微服务实战一 - 基础环境准备中提过,大家可以翻阅查看。 引入Sentinel在需要配置限流熔断服务的POM文件中引入Sentinel组件 org.springframework.cloud spring-cloud-starter-alibaba-sentinel 自定义资源SentinelResource我们只需要在相关方法上加上SentinelResource注解,让其可以成为sent

3、inel识别的资源即可。如:GetMapping(/account/getByCode/accountCode)SentinelResource(value = getByCode)public ResultData getByCode(PathVariable(value = accountCode) String accountCode) log.info(get account detail,accountCode is :,accountCode); AccountDTO accountDTO = accountService.selectByCode(accountCode); re

4、turn ResultData.success(accountDTO); 在配置文件中添加sentinel的服务端地址server: port: 8010spring: application: name: account-service cloud: nacos: discovery: server-addr: 192.168.0.107:8848/ sentinel: transport: # sentinel服务端地址 dashboard: 192.168.0.107:8858 # 取消延迟加载 eager: true经过以上几步我们准备好了使用Sentinel的基础环境,接下来我们看看

5、限流熔断的具体配置。限流概念说明生产者accout-service是一个核心服务,我们通过压测得出服务的最大负载能力为60。如果某个时间account-service的请求数飙升达到了600,那服务肯定就直接gg了。所以为了保护我们的accout-service,我们会给它配置一个限流规则,如果每秒钟有超过60的请求那不好意思我直接丢掉不处理了,然后丢给消费者一个异常,想拖垮我,哼,没门!。总而言之,限流是通过限制调用方对自己的调用,起到保护自己系统的效果。限流配置理想是丰满的,现实是骨感的。由于本人对Jmeter之类的压测工具不是很精通所以为了方便测试,我们就将accout-service的

6、QPS单机阈值设置成5,如果每秒QPS超过5,直接丢弃。这里的资源名就是我们使用SentinelResource注解自定义的资源。打开浏览器,快速刷新浏览器,当每秒请求书超过5时会看到如下错误:在后端服务日志中你会看到如下的错误日志:2019-12-10 14:22:31,948 ERROR dispatcherServlet:175 - Servlet.service() for servlet dispatcherServlet in context with path threw exception Request processing failed; nested exception

7、is java.lang.reflect.UndeclaredThrowableException with root causecom.alibaba.csp.sentinel.slots.block.flow.FlowException: null不要慌,这说明我们的目的达到了,限流成功!自定义异常我们可以通过SentinelResource中添加blockHandler参数,给其添加自定义异常方法。如:GetMapping(/account/getByCode/accountCode)SentinelResource(value = getByCode,blockHandler = ha

8、ndleException)public ResultData getByCode(PathVariable(value = accountCode) String accountCode) log.info(get account detail,accountCode is :,accountCode); AccountDTO accountDTO = accountService.selectByCode(accountCode); return ResultData.success(accountDTO);/* * 自定义异常策略 * 返回值和参数要跟目标函数一样,参数可以追加Block

9、Exception */public ResultData handleException(String accountCode,BlockException exception) log.info(flow exception,exception.getClass().getCanonicalName(); return ResultData.fail(900,达到阈值了,不要再访问了!);注意,自定义的异常方法的参数和返回值要跟目标方法一样,参数可以追加BlockException效果如下:比之前的那个错误页优雅多了有木有!持久化配置由于Sentinel的配置默认是放在内存中的,每当应用重

10、启或者sentinel重启都会丢失数据,我们这里使用Nacos作为配置中心持久化限流配置。 修改pom文件,引入sentinel-datasource-nacos组件 com.alibaba.csp sentinel-datasource-nacos 修改application.yml,配置sentinel的数据源spring: cloud: sentinel: datasource: ds: nacos: server-addr: 10.0.10.48:8848 data-id: $spring.application.name-sentinel group-id: DEFAULT_GROU

11、P rule-type: flow 在nacos中建立限流配置account-service-sentinel(配置格式设置成json) resource: getByCode, limitApp: default, grade: 1, count: 3, strategy: 0, controlBehavior: 0, clusterMode: false 可以看到上面配置规则是一个数组类型,数组中的每个对象是针对每一个保护资源的配置对象,每个对象中的属性解释如下:resource:资源名,即限流规则的作用对象limitApp:流控针对的调用来源,若为 default 则不区分调用来源gra

12、de:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制count:限流阈值strategy:调用关系限流策略controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)clusterMode:是否为集群模式 进入sentinel查看dashboard,发现sentinel自动获取nacos的配置 频繁刷新浏览器调用接口,验证接口是否正常限流熔断概念说明消费者order-service需要先调用product-service获取具体的product,然后再处理其他的业务逻辑。但是这个product-service接口不是很稳定,

13、经常抛出异常;或者是响应缓慢,导致order-service的响应变慢;如果置之不理,order-service可能会被product-service拖垮。这时候为了保护order-service,我们需要对product-service接口进行熔断。一言以蔽之:熔断是通过限制自己对外部系统的调用, 起到节约响应时间、维护链路稳定的作用。熔断配置Sentinel中的熔断降级有三个降级策略: RT(平均响应时间):当资源的平均响应时间超过阈值之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口之内,对这个方法的调用都会自动抛出 Degr

14、adeException 异常。在下一个时间窗口到来时, 会接着再放入5个请求, 再重复上面的判断. 异常比例当资源的每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态,即在接下的时间窗口之内,对这个方法的调用都会自动地抛出DegradeException异常。异常比率的阈值范围是 0.0, 1.0,代表 0% - 100%。 异常数当资源近 1 分钟的异常数目超过阈值之后会进行熔断。首先我们对原接口进行改造,让其直接抛出Runtimeexception:GetMapping(/product/getByCode/productCode)SentinelResource(value = /product/getByCode,fallb

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号