如何解决因在某一时刻大量线程同时访问接口(高并发)而导致的接口堵死的情况?
什么情况会导致服务降级?
程序运行异常/超时/服务熔断触发降级/线程池、信号量打满也会导致服务降级
什么情况会导致服务熔断?
达到最大服务访问量后,直接拒绝访问,开始调用服务降级的方法并返回友好提示,并在检测到该节点的微服务调用响应正常后,恢复调用链路(与降级的区别)。
什么情况会导致服务限流?
to be answer...
如何进行服务降级?
PS:一般做服务降级是放在调用方
Hystrix/…
[x] 服务方:(一般不在服务方式用服务降级)
Hystrix:
超时/运行异常的做法:- 设置自身调用超时时间的峰值,峰值内可以正常工作,超过时间需要兜底,做服务降级fallback(备选响应)。
- 为方法加上@HystrixCommand注解,fallbackMethod设定fallback函数,commandProperties结合@HystrixProperty可以设定运行时间峰值。
- 主启动类加上@EnableCircuitBreaker来使能@HystrixCommand注解。
[x] 调用方:
Hystrix:- yml文件增加hystix使能配置:feign.hystrix.enabled: true
- 主启动类增加@EnableHystrix注解
- 方法增加@HystrixCommand注解,fallbackMethod设定fallback函数,commandProperties结合@HystrixProperty可以设定运行时间峰值。
- 增加相应的fallback函数
- 每一个函数都要加一个fallback,太冗余了,因此整一个全局fallback,在类上加一个@DefaultProperties(defaultFallback = “”),方法上仅采用@HystrixCommand注解即可。
对于特定的fallback,在服务接口处的@FeignClient增加fallback = 相应的接口实现类,该类种包含了特定的fallback处理方式
如何进行服务熔断?
与服务降级基本一致,在(3)处有配置不同:
//服务熔断@HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback", commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled", value = "true"), //``是否开启断路器@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //``请求次数@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //``时间窗口期@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), //``失败率达到多少后跳闸})public String paymentCircuitBreaker(@PathVariable("id") Integer id) {}
