• spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略


    spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略

    某电子商务网站在一个黑色星期五发生过载.过多的并发请求,导致用户支付的请求延迟很久没有响应,在等待很长时间后最终失败。支付失败又导致用户重新刷新页面并再次尝试支付,进一步增加了服务器的负载,最终整个系统都崩溃了。

    断路器模式
    一个远程调用对应着一个线程/进程。如果响应太慢,这个线程/进程就得不到释放。资源就会被耗尽,最终导致服务不可用。
    断路器可以理解为对容易导致错误的操作的代理。这种代理能够统计一段时间内调用失败的次数,并决定是正常请求依赖的服务还是直接返回。
    断路器可以实现快速失败,当它在一段时间内检测到许多类似的错误(例如超时),就会在之后的一段时间内,强迫对该服务的调用快速失败,即不再请求所依赖的服务。这样,应用程序就不须浪费CPU时间去等待长时间的超时。
    断路器也可以自动诊断依赖的服务是否已经恢复正常。

    正常情况下断路器关闭,可正常请求依赖的服务。
    当一段时间内,请求失败率达到一定阈值,断路器就会打开。此时,不会再去请求依赖的服务。
    断路器打开一段时间后,会自动进入‘半开’状态。此时,断路器可允许一个请求访问依赖的服务。如果请求能够调用成功,则关闭断路器;否则继续保持打开状态。
    

      

    Hystrix线程隔离策略与传播上下文

    Hystrix的隔离策略两种: 分别是线程隔离和信号量隔离。

    THREAD(线程隔离):使用该方式,HystrixCommand将会在单独的线程上执行,并发请求受线程池中线程数量的限制。
    SEMAPHORE(信号量隔离):使用该方式,HystrixCommand将会在调用线程上执行,开销相对较小,并发请求受到信号量个数的限制。
    Hystrix中默认并且推荐使用线程隔离(THREAD),因为这种方式有一个除网络超时以外的额外保护。
    一般来说,只有当调用负载异常高时(例如每个实例每秒调用数百次)才需要信号量隔离,因为这种场景下使用THREAD开销会比较高。信号量隔离一般仅适用于非网络调用的隔离。
    可以使用execution.isolation.strategy属性指定隔离策略。
    正常情况下,默认为线程隔离, 保持默认即可。
    如果发生找不到上下文运行时异常,可考虑将隔离策略设置为SEMAPHORE。

    Feign使用Hystrix
    前面讲的是使用注解@HystrixCommand的fallbackMethod属性实现回退的。然而,Feign是以接口形式工作的,它没有方法体。

    q请看例文

    @RestController
    public class MovieController {
    
    	@Autowired
    	private RestTemplate restTemplate;	
    	
    	
    	@GetMapping("/movie/{id}")
    	@HystrixCommand(fallbackMethod = "notfindback", commandProperties=@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE") )
    	public User findById(@PathVariable Long id)
    	{
    		//http://localhost:7900/simple/
    		return restTemplate.getForObject("http://spring-boot-user/simple/" + id, User.class);
    	}
    	
    	public User notfindback(Long id)
    	{
    		User user = new User();
    		user.setId(0L);
    		return user;
    		
    	}
    	
    }
    

      

    这一段代码:

    @GetMapping("/movie/{id}")
    	@HystrixCommand(fallbackMethod = "notfindback", commandProperties=@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE") )
    	public User findById(@PathVariable Long id)
    	{
    		//http://localhost:7900/simple/
    		return restTemplate.getForObject("http://spring-boot-user/simple/" + id, User.class);
    	}
    

      

    如果不加@HystrixCommand的commandProperties=@HystrixProperty注解配置,那么:restTemplate.getForObject()请求是一个线程;@HystrixCommand()是一个隔离线程。

    加上@HystrixCommand的commandProperties=@HystrixProperty注解配置后,将2个线程合并到一个线程里。

  • 相关阅读:
    ABA问题怎么解:AtomicStampedReference和AtomicMarkableReference
    原子类型累加器
    Spring Boot使用嵌入式容器,那怎么配置自定义Filter呢
    痞子衡嵌入式:语音处理工具pzh-speech诞生记
    痞子衡嵌入式:串口调试工具pzh-com诞生记(6)- 打包发布(PyInstaller3.3.1)
    痞子衡嵌入式:串口调试工具pzh-com诞生记(5)- 软件优化
    痞子衡嵌入式:串口调试工具pzh-com诞生记(4)- 联合调试(vspd, sscom, PyCharm2018.2)
    痞子衡嵌入式:串口调试工具pzh-com诞生记(3)- 串口功能实现(pySerial)
    痞子衡嵌入式:串口调试工具pzh-com诞生记(2)- 界面构建(wxFormBuilder3.8.0)
    痞子衡嵌入式:极易上手的可视化wxPython GUI构建工具(wxFormBuilder)
  • 原文地址:https://www.cnblogs.com/achengmu/p/9834451.html
Copyright © 2020-2023  润新知