什么是雪崩:
微服务见相互调用,服务提供者出现故障或阻塞,导致资源耗尽。服务被提供者也会产生相应的故障或阻塞,最终影响绝大部分服务:调用链中所有服务级联调失败,整个集群故障
解决方案:
1.请求限流:限制访问微服务的请求的并发量,避免因服务激增而导致故障
2.线程隔离:通过限定每个业务能使用的线程数量而将故障业务隔离,避免故障扩散
3.服务熔断:断路器统计请求异常的比例或者慢调用比例,超过阈值会熔断该业务,拦截该请求接口。一旦发生熔断,所有请求快速失败,全都走fallback逻辑(返回默认提示)
接下来使用阿里的sentinel:sentinel是一款服务流量控制组件
引入过程:https://github.com/alibaba/Sentinel/releases 安装最新版sentinel
引入依赖:
<!--sentinel--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
yaml:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8090 # 标记仪表盘的位置信息
http-method-specify: true # 把请求方式+请求路径作为簇点资源名称
什么是簇点链路:单机调用的链路。一次请求进入服务后经过的每一个被sentinel监控的资源链。默认sentinel只会监控endpoint
什么是endpoint:是一个restful风格的api,用于提供与应用程序运行时相关的信息和操作:可以通过endpoint查看健康状况、配置信息、日志信息等;也可以通过他来进行重新加载应用程序,关闭应用程序。简单来讲他是controller里的接口
如何进行请求限流:选择簇点链路添加流控 阈值类型为QPS
如何进行线程隔离:同上,但是阈值类型为并发线程数
如何添加fallback:
1.创建fallbackFactory,对指定client类继承,重写的是查询失败的逻辑
@Slf4j public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> { @Override public ItemClient create(Throwable cause) { return new ItemClient() { @Override public List<ItemDTO> queryItemsByIds(Collection<Long> ids) { log.info("查询商品服务失败,{}",cause.getMessage()); return CollUtils.emptyList(); } @Override public void deductStock(List<OrderDetailDTO> items) { log.info("扣减商品库存失败,{}",cause.getMessage()); throw new RuntimeException(cause.getMessage()); } }; } }
2.在config中进行bean注册
3.在client接口处使用fallbackFactory
4.在消费者模块中添加配置feign-sentinel-enable: true
如何进行服务熔断:
标签:服务,请求,故障,保护,线程,sentinel,public From: https://www.cnblogs.com/kun1790051360/p/18165471