1、线程隔离
线程隔离的意思是服务A调用服务B、服务C、服务D的时候,如果服务D出了问题,那么服务A之前调用服务D的线程就全都阻塞了,随着不断有新的服务A进来,服务A的web容器中的线程就会不断增加,然后不断阻塞,随后把CPU撑暴。
所以我们需要线程隔离技术把服务A和服务D的执行线程隔离开来,hystrix提供了两种线程隔离技术,分别是线程池隔离和信号量隔离。
线程池隔离是指服务A调用服务D的时候,Hystrix另外搞一个新的线程池,从中取线程来执行服务D的调用,这个线程池跟服务A的web容器线程池是独立的,这样服务D的调用就不会服务A的web容器线程池。
信号量隔离是指服务A调用服务D的时候,Hystrix限制服务A调用服务D的web容器线程数,比如只允许10个线程可以调用服务D,这样就算服务D挂了,服务A的web容器线程数也只有10个不能用,不影响其它线程。
线程池隔离适用于有网络延迟的RPC调用,信号量隔离适用于无网络延迟的本地调用。
2、服务熔断
所谓服务熔断是一个整体的概念,它是说如果服务A调用服务B,服务B挂了,那么就把服务B熔断掉,以免影响服务A的运行。把服务B熔断掉,其实就是开启断路器,也就是服务降级。
服务熔断的方式有两种,分别是直接使用Hystrix的注解@HystrixCommand,和使用spring cloud 的feign组件。
方式一:
通过@HystrixCommand来实现的,通过在方法上配置各类参数来实现熔断,参数包括:
——Execution.isolation.mode :使用线程池隔离模式还是信号量隔离模式;
——Coresize:服务调用的线程数
——CommandKey:命令类的KEY
——groupKey:使用同一个线程池的组名
——requestVolumeThreshold:10秒内有超过多少个请求,就开启断路器
——timeInMilliseconds:超过多少毫秒算请求调用失败
——errorThresholdPercentage:超过百分之多少请求挂了,就开启断路器
方式二:
由于Feign已经集成了hystrix,只需要在Feign接口上添加@FeignClient,然后在后面的参数中配置降级类就可以:
——@FeignClient(fallback=XXXX.class),表示通过feign调用微服务失败了以后,走XXXX类里面的降级的方法。
——@FeignClient(fallbackFactory=XXXXFactory.class),表示通过feign调用微服务失败了以后,走XXXXFactory类里面通过create生成的降级类的方法。
fallback和fallbackFactory的区别在于,fallbackFactory通过create(Throwable o)生成降级类,降级类里可以通过Throwable.getMsg()方法获取服务降级的原因。
3、服务降级
服务降级的意思,就是服务在熔断之后,进入降级的方法,返回其它的结果,比如,返回一些友好的访问失败信息等。
服务降级的的时机包括如下几种:
——断路器已经开启状态;
——调用请求超时;
——调用请求执行失败,返回Exception;
——设定的Hystrix线程池或者信号量线程数已满,且等待队列也满了
服务降级之后,会走参数fallbackMethod里面的配置的方法。
如果fallbackMethod的方法也需要调用其它的微服务,那这个方法也需要加注解@HystrixCommand,避免这个降级服务也就访问挂了。
4、服务限流
服务限流的意思,就是只允许固定数量的请求量调用某个微服务,以防止过高请求调用一个微服务,把微服务搞崩。
通过线程池+队列的方式,通过信号量的方式。比如商品评论比较慢,最大能同时处理10个线程,队列待处理5个,那么如果同时20个线程到达的话,其中就有5个线程被限流了,其中10个先被执行,另外5个在队列中
1、如果是线程隔离,可以通过线程数+队列大小限制。参数如下:
hystrix.threadpool.default.coreSize
hystrix.threadpool.default.maxQueueSize
hystrix.threadpool.default.queueSizeRejectionThreshold
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
2、如果是信号量隔离,可以设置最大并发请求数。参数如下:
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests
5、断路器
断路器,英文名也circuitBreaker,就是加在服务调用之前的一套拦截器,它包括三种状态,分别是开启、关闭、半开,三种状态之间的切换时机如下:
默认关闭——>开启:requestVolumeThreshold以及errorThresholdPercentage同时超出设置的阀值,就开启断路器;
开启——>半开:断路器开启之后,可以通过sleepWindowInMiliseconds设置一个休眠期,默认是5秒。这5秒之内,断路器是开启状态,一旦5秒时间一到,就会暂时进入半开状态,这时候,断路器会尝试发送一个命令,看看当前请求是否还是超过上面的两个阀值。
半开——>开启:如果上面半开状态下,断路器发送命令之后,发现服务还是访问失败,那么继续进入开启状态,等待下次5秒后再进入半开状态。
半开——>关闭:如果上面半开状态下,断路器发送命令之后,发现服务访问OK了,也不超过那两个阀值了,那说明服务状态良好,就把断路器关了。
6、请求缓存
服务的请求缓存,是hystrix提供一种web服务本地缓存机制,在开启Hystrix的请求缓存之后,如果同一个微服务调用请求且参数相同时,并直接通过本地缓存返回结果,不用再调用微服务。
@CacheResult加在需要本地缓存的方法上面;
@CacheRemove加在需要清除本地缓存的方法上面,通过key配置需要清除的缓存key
注意,hystrix请求缓存本质上是一个filter,所以需要再写一个Filter类初始化Hystrix的请求缓存Filter。
7、执行顺序

网友评论