什么是服务雪崩?

参考: <<重新定义spring cloud>>

代码:https://gitee.com/08081/hello-springcloud/tree/springcloud-fallback/

在微服务中,我们是服务于服务之间调用,当在微服务突然有大量的请求过来,一个服务瘫痪之后,后面的服务的请求积压,这就造成了服务雪崩!

 

Spring Cloud之服务雪崩(一)

 

一个服务瘫痪,另外调用这个服务的服务就会超时,导致整个服务群瘫痪.

造成雪崩的原因可以归结为以下三点:

1. 服务提供者不可用 (硬件故障,程序bug 缓存击穿,用户大量请求)

2. 重试加大流量(用户重试,代码逻辑重试)

3. 服务调用者不可用(同步等待造成的资源耗尽)

最终的结果就是一个服务不可用,导致一系列的服务不可用,这种后果无法预料

如何解决在灾难性雪崩效应?

1.降级: 超时降级资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据,实现一个fallback方法,当请求出现异常之后,调用这个方法

2.隔离(线程池隔离和信号量隔离): 限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用

3.熔断: 当失败率(如因网络故障/超时造成的失败率高)达到阈值自动触发降级.熔断器触发的快速失败会进行快速恢复

4.缓存:提供请求缓存

5.提供请求合并

解决方案之一服务降级

 先说遇到的坑吧

1. 坑1 mapping 报错.feign调用服务端的时候说实例已经实例过了

当时报错的时候错误信息没有记录.具体参考的是这篇文章 感谢作者.https://my.oschina.net/u/2000675/blog/2244769

//@FeignClient(name = "book-service",fallback = BookServiceFallback.class,path = "/")

2.坑2 在写好fallback方法之后,一直调用fallback方法,不调用原来的方法.不知为什么hystrix的默认时间一直1秒钟

尝试配置了很多次.最终结合官网解决:

feign:
  hystrix:
    enabled: true
    #局部配置 这个必须加
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: basic
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2000

3.坑3: 使用fallbackFactory报错

要是因为我返回空的list还去添加

代码

如何下载代码运行案例?

1.到码云下下载项目

2.运行ch3-eureka-ribbon 下的eureka-server

3.运行ch4-fegin下的ch4-book-service

4.运行ch6-hystrix下的book-consumer-hystrix

我创建了一个子项目book-consumer-hystrix

pom文件如下:

spring:
  application:
    name: book-hystrix
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8888/eureka/
  instance:
    prefer-ip-address: true
server:
  port: 8002
feign:
  hystrix:
    enabled: true
    #局部配置
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: basic
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000
View Code

相关文章: