具体收索老师给定的教学文档:::高级01-微服务保护
雪崩问题?微服务之间相互调用链中的一个服务故障,引起整个链路都无法访问的情况。
如何避免因服务故障引起的雪崩问题?超时处理、线程隔离、熔断降级、限流
如何实现解决雪崩的技术?
安装alibaba的Sentinel微服务流量控制组件:优势、完备的实时监控、spi接口、肖峰、集群、熔断
安装步骤:
1、sentinel-dashboard-1.8.1.jar 将jar包放到任意非中文目录,
2、执行命令: cmd java -jar sentinel-dashboard-1.8.1.jar
修改端口:java -Dserver.port=8090 -jar sentinel-dashboard-1.8.1.jar
3、虚拟机执行命令: 把jar包拉进去 然输入命令: docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard:1.8.0
4、访问http://localhost:8080页面,就可以看到sentinel的控制台了:
5、在idea里订单微服务里引入依赖 和配置控制台
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
server:
port: 8088
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
6、打开浏览器,访问http://localhost:8088/order/101,这样才能触发sentinel的监控。然后再访问sentinel的控制台,查看效果:
流量控制::
三流控模式:
1、直接限流 :对当前资源限流
2、关联: 高优先级资源触发阈值,对低优先级资源限流
3、链路: 阈值统计时,只统计从指定资源进入当前资源的请求,是对请求来源的限流
三流控效果: 请求达到流控阈值时应该采取的措施:
1、快速失败: QPS超过阈值时,拒绝新的请求
2、warm up(预热): QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。
3、排队等待: 依次间隔执行请求(请求预期时间>超时时间、直接拒接),队列满后才会请求失败
一热点:
热点参数限流 : 热点参数限流对默认的SpringMVC资源无效
流控模式-链路
需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。 //-- 这就是流控模式-链路
步骤:
1、在OrderService中添加一个queryGoods方法,不用实现业务
2、在OrderController中,改造/order/query端点,调用OrderService中的queryGoods方法
3、在OrderController中添加一个/order/save的端点,调用OrderService的queryGoods方法
4、给queryGoods设置限流规则,从/order/query进入queryGoods的方法限制QPS必须小于2
对查询业务限流,优先级高的放入下面
隔离和降级::
Sentinel支持的雪崩解决方案??1、线程隔离(仓壁模式),2、熔断降级
线程隔离的两种手段是? 信号量隔离、、线程池隔离
熔断降级断路器策略有三种:
慢调用: 超过指定时长的调用为慢调用,直接熔断
异常比例: 统计单位时长内异常调用的比例,直接熔断
异常数: 统计单位时长内异常调用的次数,超过阈值则熔断
熔断降级:
熔断三种状态: 关闭、、开启、、半开
服务降级概念:准备 一主一备调用方法,主方法出错,调用备用方法,备用方法中,返回友好提示, 返回一个默认值,返回其他推荐数据
Feign整合Sentinel
// Feign整合Sentinel的步骤: 服务降级方法:这个很重要,要记住!!!!!!!
1、在application.yml中配置:feign.sentienl.enable=true
2、给FeignClient编写失败后的降级逻辑
方式一:FallbackClass,无法对远程调用的异常做处理
方式二:FallbackFactory,可以对远程调用的异常做处理,我们选择这种
3、将FallbackFactory配置到FeignClient
具体实现步骤一:在feing-api项目中定义类,实现FallbackFactory:
@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
@Override
public UserClient create(Throwable throwable) {
// 创建UserClient接口实现类,实现其中的方法,编写失败降级的处理逻辑
return new UserClient() {
@Override
public User findById(Long id) {
// 记录异常信息
log.error("查询用户失败", throwable);
// 根据业务需求返回默认的数据,这里是空用户
return new User();
}
};
}
}
步骤二:在feing-api项目中的DefaultFeignConfiguration类中将UserClientFallbackFactory注册为一个Bean:
@Bean
public UserClientFallbackFactory userClientFallback(){
return new UserClientFallbackFactory();
}
步骤三:在feing-api项目中的UserClient接口中使用UserClientFallbackFactory:
@FeignClient(value = "userservice", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
授权规则::
授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。
白名单:来源(origin)在白名单内的调用者允许访问
黑名单:来源(origin)在黑名单内的调用者不允许访问
例如,我们限定只允许从网关来的请求访问order-service,那么流控应用中就填写网关的名称
nacos规则是存放到nacos中的,Sentinel默认存到内存中的
规则持久化::
Sentinel的三种配置管理模式是什么?
原始模式:保存在内存 ,重启服务会**丢失**<br />
pull模式:保存在本地文件或数据库,定时去读取<br />
push模式:保存在nacos,监听变更实时更新
实现push模式:
push模式实现最为复杂,依赖于nacos,并且需要修改Sentinel控制台源码。
虚拟机异常关机:xfs_repair -v -L /dev/dm-0 xfs_repair -v -L /dev/sda3 (3后面加个空格再回车)