hystrix熔断与降级

举报
小鲍侃java 发表于 2021/11/18 22:21:36 2021/11/18
【摘要】 ​ 总结来说就是如果下游服务挂了,而上游有多个服务去调用他,那么上游的服务就全部挂掉了,这样会造成雪崩效应,从而使服务大面积的失效。 这就需要在连接下游服务超时或者异常时会降级走我们定义的方法。或者...

请添加图片描述

总结来说就是如果下游服务挂了,而上游有多个服务去调用他,那么上游的服务就全部挂掉了,这样会造成雪崩效应,从而使服务大面积的失效。
在这里插入图片描述

这就需要在连接下游服务超时或者异常时会降级走我们定义的方法。或者在一段时间内失败的比例大于配置,那么熔断器会打开,即使正确调用还是会走降级方法。等过一段时间后会尝试重新调用,如果调用失败,继续熔断,如果成功则可以正常调用。

1.实现

1.修改Application类

修改application中开启Hystrix。

@EnableFeignClients #开启feign
@EnableCircuitBreaker #开启Hystrix

  
 
  • 1
  • 2

2.修改application.yml

修改成以下内容。

feign:
  hystrix:
    enabled: true #默认hystrix是不开启的 需要开启
ribbon:
  ConnectTimeout: 5000 # 请求连接的超时时间 默认的时间为 1 秒
  ReadTimeout: 5000 # 请求处理的超时时间
hystrix:
  command:
    default:  #default全局有效,service id指定应用有效
      execution:
        timeout:
          #如果enabled设置为false,则请求超时交给ribbon控制,true,则超时作为熔断根据
          enabled: true
        isolation:
          strategy: SEMAPHORE
          thread:
            timeoutInMilliseconds: 5000 #断路器超时时间,默认1000ms
      circuitBreaker:
        enabled: true
        requestVolumeThreshold: 10 #默认20 ,熔断的阈值,如何user服务报错满足10次,熔断器就会打开,就算order之后请求正确的数据也不行。
        sleepWindowInMilliseconds: 8000 #默认5S , 等5S之后熔断器会处于半开状态,然后下一次请求的正确和错误讲决定熔断器是否真的关闭和是否继续打开
        errorThresholdPercentage: 0.5

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

3.新建UserClientFallBack熔断类

import org.springframework.stereotype.Component;

@Component
public class UserClientFallBack implements DcClient {

	@Override
	public String consumer() {
		String error= "对不起又是我的错";
		System.out.println(error);
		return error;
	}

	@Override
	public String consumer2() {
		// TODO Auto-generated method stub
		return null;
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

依赖于上文 只要在DcClient 加入fallback =UserClientFallBack.class 然后在调用失败之后,会直接返回定义的错误,而不会抛出异常。

4.调用

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "eureka-client",fallback =UserClientFallBack.class )
public interface DcClient {

	@GetMapping("/aaa/dc?dk=3002")
	String consumer();

	@GetMapping("/aaa/dc?dk=3002")
	String consumer2();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

相对于ribbon使用不同的请求类型需要不同的方法 feign,通过接口的参数就可以指定。 如

    #post请求 入参为user对象
    @PostMapping("/x/x")
    Result getDept(@RequestBody User user);
     

    #get请求 入参为 string 
    @GetMapping("/x/x/{userName}")
    Result getDept(@PathVariable String userName);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

正常调用后。
在这里插入图片描述
失败的调用获取是连接超时。
在这里插入图片描述

文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。

原文链接:baocl.blog.csdn.net/article/details/120794666

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。