一.什么是服务雪崩效应
服务雪崩效应产生与服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果在高并发情况下,所有的请求全部访问同一个接口,
这时候可能会导致其他服务没有线程进行接受请求,这就是服务雪崩效应效应。
二.怎么解决雪崩效应?
解决雪崩的方案就是 服务降级+服务熔断,服务隔离,服务限流
服务降级
在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack方法)
服务熔断
熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值,让后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用
服务隔离
因为默认情况下,只有一个线程池会维护所有的服务接口,如果大量的请求访问同一个接口,达到tomcat 线程池默认极限,可能会导致其他服务无法访问。
解决服务雪崩效应:使用服务隔离机制(线程池方式和信号量),使用线程池方式实現隔离的原理: 相当于每个接口(服务)都有自己独立的线程池,因为每个线程池互不影响,这样的话就可以解决服务雪崩效应。
线程池隔离:
每个服务接口,都有自己独立的线程池,每个线程池互不影响。
信号量隔离:
使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,当请求进来时先判断计数器的数值,若超过设置的最大线程个数则拒绝该请求,若不超过则通行,这时候计数器+1,请求返 回成功后计数器-1。
服务限流
服务限流就是对接口访问进行限制,常用服务限流算法令牌桶、漏桶。计数器也可以进行粗暴限流实现。
三.SpringCloud的组件Hystrix 完美提供了解决方案
Maven依赖信息
<!-- hystrix断路器 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> |
开启Hystrix断路器。记得别禁止超时时间,只要把超时时间设置长一点就行了
feign: hystrix: enabled: true
#### hystrix禁止服务超时时间 hystrix: command: default: execution: timeout: enabled: false
|
@SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableHystrix public class MyApplication{ public static void main(String[] args) { SpringApplication.run(AppOrder.class, args); }
}
|
服务降级处理
@HystrixCommand(fallbackMethod = "orderToUserInfoFallback") @GetMapping("/orderToUserInfo") public ResponseBase orderToUserInfoHystrix() { System.out.println("orderToUserInfo:" + "当前线程池名称:" + Thread.currentThread().getName()); return memberServiceFeigin.getUserInfo(); }
@RequestMapping("/orderToUserInfoFallback") public ResponseBase orderToUserInfoFallback() { return setResultError("系统错误!!!!"); } |
使用@HystrixCommand 注解就接口对立一个线程池,就服务隔离的线程池隔离方案,不会影响到其他接口的正常使用,就是对CPU要求有点高,土豪可以无视
Fallback回调
@RequestMapping("/orderToUserInfo") public ResponseBase orderToUserInfo() { return memberServiceFeigin.getUserInfo(); }
@Component public class MemberServiceFallback extends BaseApiService implements MemberServiceFeigin { public ResponseBase getUserInfo() { // 服务降级处理 return setResultError("系统错误,请稍后重试!"); }
}
|