具体收索老师给定的教学文档:::高级01-微服务保护

雪崩问题?微服务之间相互调用链中的一个服务故障,引起整个链路都无法访问的情况。

如何避免因服务故障引起的雪崩问题?超时处理、线程隔离、熔断降级、限流

如何实现解决雪崩的技术?

安装alibaba的Sentinel微服务流量控制组件:优势、完备的实时监控、spi接口、肖峰、集群、熔断

安装步骤:

  1. 1sentinel-dashboard-1.8.1.jar jar包放到任意非中文目录,
  2. 2、执行命令: cmd java -jar sentinel-dashboard-1.8.1.jar
  3. 修改端口:java -Dserver.port=8090 -jar sentinel-dashboard-1.8.1.jar
  4. 3、虚拟机执行命令: jar包拉进去 然输入命令: docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard:1.8.0
  5. 4、访问http://localhost:8080页面,就可以看到sentinel的控制台了:
  6. 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后面加个空格再回车)