zoukankan      html  css  js  c++  java
  • spring cloud -->hystrix(二)

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

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

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

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

      

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

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

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

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

    q请看例文

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    @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;
             
        }
         
    }

      

    这一段代码:

    1
    2
    3
    4
    5
    6
    7
    @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个线程合并到一个线程里。

    转载:https://www.cnblogs.com/achengmu/p/9834451.html

  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/little-tech/p/13687630.html
Copyright © 2011-2022 走看看