SpringCloud笔记四:互联网架构服务降级熔断Hystrix

SpringCloud笔记四:互联网架构服务降级熔断Hystrix

分布式核心知识,熔断降级

系统负载过高,突发流量或者网络等各种异常情况介绍,常用解决方案

  1. 熔断

调用某个服务,如果多次出现调用失败情况,就会触发熔断机制,不允许再调用该服务。

仍能保证该操作能够执行。比如下单,调用用户服务,如果用户服务出现异常,就会触发熔断,但是下单功能可以继续实现。

  1. 降级

降级就是:当出现网络等问题时,可以抛弃一些非核心的服务。只返回核心服务数据。例如查询某个商品时,如果网络很差,只需要返回该商品的价格,和库存就可以了。

  1. 熔断和降级

相同点:

​ 1、从可用性和可靠性触发,为了防止系统崩溃。

​ 2、最终让用户体验到的是某些功能暂时不能用。

不同点:

​ 1、服务熔断一般是由下游服务故障导致的,而服务降级一般是从整体系统负荷考虑,由调用方控制。

Netflix开源组件断路器Hystrix

Netflix开源组件

Netflix开源组件问题

  1. Hystrix

Hystrix:汉语豪猪的意思,防护,保护的意义。

Hystrix的作用:

​ 在一个分布式系统里,一个服务依赖多个服务,可能存在某个服务调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,通过Hystrix就可以解决

Hystrix参考文档

  1. Hystrix提供了熔断,隔离,Fallback,cache、监控等功能。
  2. 熔断如何处理

出现错误之后可以,fallback 错误的信息,兜底数据。

Feign结合Hystrix熔断开发

  1. 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 添加注解,启动类里面添加@EnableCircuitBreaker

如果添加的注解过多,可以用@SpringCloudApplication替代一些

  1. 熔断降级等处理

最外层api使用,好比异常处理(网络异常,参数或者内部调用问题

api方法上增加 @HystrixCommand(fallbackMethod=“saveOrderFail”)

编写fallBack方法实现,方法签名一定要和api方法签名一致。即:参数一定要一致。

Feign结合Hystrix断路器开发

  1. Feign接口里面有包含Hystrix的接口方法。但是需要进行配置。

1、在配置文件里面添加配置,开启Feign的hystrix的熔断器

#修改feign请求的超时时间
feign:
  #开启Hystrix熔断机制
  hystrix:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 2000

2、创建一个类,用于实现FeignClient,并实现里面的方法。并被Spring扫描,

该实现类可以写一些电话通知等功能,用于监控。

@Component
public class ProductClientFallback implements ProductClient {
    @Override
    public String findById(int id) {
        System.out.println("feign 调用product-service findByid异常");
        return null;
    }
}

3、FeignClient类需要指定失败后进入的类,fallback=xxx.class

@FeignClient(name = "product-service",fallback = ProductClientFallback.class)
public interface ProductClient {

    @GetMapping("api/v1/product/find")
    String findById(@RequestParam(value = "id") int id);
}

熔断降级服务异常报警通知实战

  1. 服务异常报警

异常报警机制

  1. 安装redis
  2. 导入redis依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置redis
#服务的名称
spring:
  application:
    name: order-service
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    timeout: 2000
  1. 开发报警信息

注意:报警信息一定要new一个线程或者从线程池中获取一个线程,否则会阻塞下面的代码。并设置过期时间。注意:api里面写一些fallback方法,目的是返回前端一定的没有调通接口的数据。service里面的fallback方法,可以没有任何操作,也可以在控制台打印一下。

//方法签名一定要和api中的方法一致
private Object saveOrderFail(int userId,int productId,HttpServletRequest request){

    //监控报警
    String saveOrderKey="save-order";
    String saveValue = redisTemplate.opsForValue().get(saveOrderKey);
    final String ip=request.getRemoteAddr();
    //可以换成线程池,另外如果是并发的情况下可能会发送多次,可以通过添加锁的方式解决。
    new Thread(()->{
        if(StringUtils.isEmpty(saveValue)){
            System.out.println("紧急短信,用户下单失败,请离开查找原因,ip地址="+ip);
            //发送一个http请求,调用短信服务
            redisTemplate.opsForValue().set(saveOrderKey,"save-order-fail",20, TimeUnit.SECONDS);
        }else{
            System.out.println("已经发送过短信,20秒内不重复发送");
        }

    }).start();
    Map<String,Object> msg=new HashMap<>();
    msg.put("code",-1);
    msg.put("msg","抢购人数太多,您被挤出来了,稍后请重试");
    return msg;
}
}

深入源码剖析Hystrix降级策略和调整

  1. Hystrix降级策略和调整

查看默认的策略在HystrixCommandProperties中。

1、execution.isolation.strategy 隔离策略

​ THREAD 线程池隔离

​ SEMAPHORE 信号量

​ 信号量适用于接口并发量高的情况,如每秒数千次调用情况,导致线程开销过高,通常只适用于非网络调用,执行速度快。

2、execution.isolation.thread.timeoutInMilliseconds 超时时间

​ 默认 1000毫秒。

3、execution.timeout.enabled 是否开启超时限制

4、execution.isolation.semaphore.maxConcurrentRequests 隔离策略为信号量时,如果达到最大并发数时,后续请求会被拒绝。默认是10

官方文档

  1. 调整策略

服务调用存在的时间超时问题:

一个http连接时间超时

一个是请求响应响应时间超时

还有一个请求不响应熔断超时

如果熔断超时时间过短,会造成http还未响应就已经进入熔断机制了。这样是不可行的,必须让熔断时间长一点。

#把hystrix超时时间关闭,默认开启
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: false

一般不允许进行熔断超时关闭,否则熔断也就没有意义了。

配置线程熔断时间

#设置超时时间为4s
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 4000

断路器Dashboard监控仪表盘

  1. 加入依赖
<!--断路器监控仪表盘1-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<!--断路器监控仪表盘2-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. 启动类增加注解

@EnableHystrixDashboard

  1. 配置文件增加endpoind
#暴露全部的监控信息
management:
  endpoints:
    web:
      exposure:
        include: "*"
  1. 访问接口

http://localhost:8781/hystrix

Hystrix Dashboard输入: http://localhost:8781/actuator/hystrix.stream

断路器监控仪表参数讲解和模拟熔断

  1. 监控仪器表详解

仪表盘监控

  1. 使用jmeter获取postmen进行测试
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章