欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-24 19:30:20
...

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. 服务异常报警

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

  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. 监控仪器表详解

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

  1. 使用jmeter获取postmen进行测试
相关标签: springCloud笔记