springcloud应用之hystrix

springcloud应用之hystrix

阅读提示

hystrix项目
请先阅读feign

hystrix是什么

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比
如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分
布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调
用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异
常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至
雪崩。

为什么需要hystrix

微服务之间的相互调用,调用链可能很长,万一中间有一个微服务挂掉了,大量请求就会累计在挂掉的微服务,导致其他微服务没有可用资源,基于这种服务雪崩,需要有人站出来,解决这种中途有人挂掉的情况,例如可以用降级方法处理,中途微服务的方法卡住了,出异常了,就跑降级方法返回一个服务繁忙稍后重试,这就是hystrix干的事,它保证了服务的高可用

如何使用hystrix

对于上面服务雪崩情况hystrix提供了四种解决办法服务降级,超时,限流,熔断

启动类加@EnableHystrix,pom加

 		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

降级

	/**
     * 测试降级
     * @return
     */
    @RequestMapping("testDemote")
    @HystrixCommand(fallbackMethod = "testDemoteFallbackMethod")
    public String testDemote(float rate){
        return orderService.queryErrorOrder(rate);
    }
    //降级方法也得加参数,因为要考虑方法重载
    private String testDemoteFallbackMethod(float rate){
        return "testDemote:服务错误,请稍后重试";
    }
	@RequestMapping(value = "errorOrder",method= RequestMethod.GET)
    String queryErrorOrder(@RequestParam("rate") float rate);

超时

	/**
     * 测试超时
     * @param time
     * @return
     */
    @RequestMapping("testOvertime")
    @HystrixCommand(fallbackMethod = "testOvertimeFallbackMethod")
    public String testOvertime(long time) throws InterruptedException {
        //这个休眠为了简单就放这,本应放到被调用者的
        Thread.sleep(time);
        return "testOvertime";
    }
    private String testOvertimeFallbackMethod(long time){
        return "testOvertime:服务超时,请稍后重试";
    }

访问testOvertime接口设置time=2000,会自动跑降级方法,因为hystrix有默认超时时间1s,这个时间这样配置

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1000

熔断

其实熔断,就好像我们生活中的跳闸一样, 比如说你的电路出故障了,为了防止出现
大型事故 这里直接切断了你的电源以免意外继续发生, 把这个概念放在我们程序上也是如此, 当一个微服务调用多
次出现问题时(默认是10秒内20次当然 这个也能配置),hystrix就会采取熔断机制,不再继续调用你的方法(会
在默认5秒钟内和电器短路一样,5秒钟后会试探性的先关闭熔断机制,但是如果这时候再失败一次{之前是20次}
那么又会重新进行熔断) 而是直接调用降级方法,这样就一定程度上避免了服务雪崩的问题.

简单来说熔断会保证如果短时间出现大量错误,直接走降级,5s恢复不再直接走降级,而是走你的方法逻辑,如果此时再失败,又会触发5s时间直接走降级,如此往复。

测试的话可以这样测testDemote这个接口大概设置错误率rate=0.5,不停f5有机会10s出错20次,然后会发现5s内的f5都是直接降级信息

限流

	/**
     * 测试限流
     * @return
     */
    @RequestMapping("testLimit")
    @HystrixCommand(fallbackMethod="testLimitFallbackMethod",
            threadPoolKey = "testLimit",
            threadPoolProperties ={@HystrixProperty(name = "coreSize",value = "2"),
                    @HystrixProperty(name = "maxQueueSize",value = "1")})
    public String testLimit() throws InterruptedException {
        //这里设置3000,别忘了yml把超时时间改成大于3000,不然一直超时降级
        Thread.sleep(3000);
        return "testLimit";
    }

    private String testLimitFallbackMethod(){
        return "testLimit:服务限流,请稍后重试";
    }

我方法休眠3s,coreSize=2这两个信息组合起来的意思是
如果在3s内有超过两个请求,超出的部分会直接降级,这个测试得多开几个浏览器窗口

hystrix整合feign

如果觉得上面这种方式太复杂,可以试试下面的方法

yml

feign:
  hystrix:
    enabled: true

FeignAndHystrix
这里千万注意要把OrderService的@FeignClient(name = “order”)注释掉,并且把controller用到orderService的地方全注释,因为一组微服务只能被@FeignClient一次

@FeignClient(name = "order",fallback = FeignAndHystrixImpl.class)
public interface FeignAndHystrix {
	
    @RequestMapping(value = "errorOrder",method= RequestMethod.GET)
    String queryErrorOrder(@RequestParam("rate") float rate);
}
@Component
public class FeignAndHystrixImpl implements FeignAndHystrix{
    @Override
    public String queryErrorOrder(float rate) {
        return "服务繁忙";
    }
}

调用方式

	@Autowired
    private FeignAndHystrix feignAndHystrix;
    
	@RequestMapping("testFeignAndHystrix")
    public String testFeignAndHystrix(){
       return feignAndHystrix.queryErrorOrder(0.3f);
    }

获取order微服务的异常

@FeignClient(name = "order",fallbackFactory = FeignAndHystrixFallBackFactory.class)
public interface FeignAndHystrix {
 	@RequestMapping(value = "errorOrder",method= RequestMethod.GET)
    String queryErrorOrder(@RequestParam("rate") float rate);
}
@Component
public class FeignAndHystrixFallBackFactory implements FallbackFactory<FeignAndHystrix> {
    @Override
    public FeignAndHystrix create(Throwable throwable) {
        return new FeignAndHystrix() {
            @Override
            public String queryErrorOrder(float rate) {
                return "服务繁忙:"+throwable;
            }
        };
    }
}
发布了164 篇原创文章 · 获赞 81 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/LiuRenyou/article/details/104771305