Hystrix

服务雪崩的应对策略

针对造成服务雪崩的不同原因, 可以使用不同的应对策略:

  1. 流量控制
  2. 改进缓存模式
  3. 服务自动扩容
  4. 服务调用者降级服务

流量控制 的具体措施包括:

  • 网关限流
  • 用户交互限流
  • 关闭重试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Service1HystrixCommand extends HystrixCommand<Response> {`
`private Service1 service;`
`private Request request;`

`public Service1HystrixCommand(Service1 service, Request request){`
`supper(`
`Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ServiceGroup"))`
`.andCommandKey(HystrixCommandKey.Factory.asKey("servcie1query"))`
`.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("service1ThreadPool"))`
`.andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()`
`.withCoreSize(20))//服务线程池数量`
`.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()`
`.withCircuitBreakerErrorThresholdPercentage(60)//熔断器关闭到打开阈值`
`.withCircuitBreakerSleepWindowInMilliseconds(3000)//熔断器打开到关闭的时间窗长度`
`))`
`this.service = service;`
`this.request = request;`
`);`
`}`

`@Override`
`protected Response run(){`
`return service1.call(request);`
`}`

`@Override`
`protected Response getFallback(){`
`return Response.dummy();`
`}`
`}

image-20190417140709463

  1. 构建Hystrix的Command对象, 调用执行方法.
  2. Hystrix检查当前服务的熔断器开关是否开启, 若开启, 则执行降级服务getFallback方法.
  3. 若熔断器开关关闭, 则Hystrix检查当前服务的线程池是否能接收新的请求, 若超过线程池已满, 则执行降级服务getFallback方法.
  4. 若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法.
  5. 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
  6. 若服务执行超时, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
  7. 若服务执行成功, 返回正常结果.
  8. 若服务降级方法getFallback执行成功, 则返回降级结果.
  9. 若服务降级方法getFallback执行失败, 则抛出异常.