待更新
所有系统,特别是分布式系统,都会遇到故障。
当服务崩溃时,很容易检测到该服务已不存在,因此应用程序可以绕过它。
然而,当服务运行缓慢时,检测到服务性能不佳并绕过它是非常困难的。
客户端弹性模式:在远程服务发生错误或表现不佳时保护远程资源(另一个微服务调用或数据库查询)的客户端免于崩溃。这些模式的目标是让客户端“快速失败”,而不消耗诸如数据库连接和线程池之类的宝贵资源,并且可以防止远程服务的问题向客户端的消费者进行“上游”传播。
4种客户端弹性模式:
(1)客户端负载均衡模式:服务客户端存在服务发现期间检索到微服务断点
(2)断路器模式:确保服务客户端不会重复调用失败的服务
(3)后备模式:调用失败时,后备模式询问是否有可执行的替代方案
(4)舱壁模式:隔离服务客户端上不同的服务调用,以确保表现不佳的服务不会耗尽客户端的所有资源(线程池充当舱壁)
注解:
@EnableCircuitBreaker 告诉spring cloud 将要为服务使用hystrix,加在启动引导类上
注意:如果忘记将该注解添加到引导类中,那么hystrix断路器不会处于活动状态。在服务启动时,不会收到任何警告或错误消息
断路器
@HystrixCommand 将java类方法标记为由Hystrix断路器进行管理,当spring框架看到该注解,它将动态生成一个代理,该代理将包装该方法,并通过专门用于处理远程调用的线程池来管理对该方法的所有调用。
@HystrixCommand(commandProperties={@HystrixProperty(name=“execution.isolation.thread.timeoutInMilliseconds”,value=12000)})
commandProperties参数允许开发人员提供附加的属性来定制Hystrix
后备
@HystrixCommand(fallbackMethod=“buildFallbackLicenseList”)
fallbackMethod 属性定义了类中的一个方法,如果来自Hystrix的调用失败,那么就会调用该方法
注意此后备方法必须由HystrixCommand保护的原始方法位于同一个类中,并且必须具有与原始方法相同的方法签名。传递给原始方法的所有参数都将传递给后备方法。
传递旧数据给客户,比让客户看到错误或者整个应用崩溃更为可取。
后备是一种在资源超时或者失败时,提供行动方案的机制
如果在后备服务中调用另一个分布式服务,就可能需要使用@HystrixCommand注解来包装后备方法。
舱壁模式,将远程调用隔离在他们自己的线程池中,以便可以控制单个表现不佳的服务,而不会使容器崩溃
@HystrixCommand(fallbackMethod=“buildFallbackLicenseList”,
threadPoolKey=“licenseByOrgThreadPool”,
threadPoolProperties={
@HystrixProperty(name=“coreSize”,value=“30”),
@HystrixProperty(name=“maxQueueSize”,value=“10”)})
threadPoolKey属性定义线程池的唯一名称
coreSize属性用于定义线程池的最大线程数
maxQueueSize用于定义一个位于线程池前的队列,它可以对传入的请求进行排列。该队列将控制在线程池中线程繁忙时允许堵塞的请求数,一旦请求数超过队列的大小,对线程池的任何其他请求都将失败,知道队列中有空间。