【Springcloud专栏七】Hystrix服务熔断与服务降级

目录

服务熔断

服务降级

熔断器

Hystrix熔断器的使用【在服务调用方配置】

    1、引入依赖

    2、启动类上加注解【服务调用方 】@EnableCircuitBreaker

    3、配置降级策略

    4、实现效果


服务熔断

        当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。

服务降级

        服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求而直接返回一个提前准备好的fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。【空闲出线程或资源】

共同点:保证了整个系统的稳定性和可用性

不同点:熔断一般是下行程序故障,服务降级是为了解决整体项目的负荷

熔断器

        三个状态:打开、半打开、关闭

        默认情况,在最近的20次请求中出现50%超时的情况,会断开服务。如果仍有请求则会直接返回失败信息fallback,该服务默认情况下会在关闭状态持续5S,之后会放行一定的请求进入半打开状态,如果放行的请求出现超时情况,重新进入关闭状态。

Hystrix熔断器的使用【在服务调用方配置】

    1、引入依赖

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

    2、启动类上加注解【服务调用方 】@EnableCircuitBreaker

@EnableCircuitBreaker  // 服务熔断
@EnableDiscoveryClient // 内部既能兼容eurake又能兼容zookeeper
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
//@SpringCloudApplication
public class ConsumerApplication {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class);
    }
}

    3、配置降级策略

        3.1、方法级别标注服务降级

@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @HystrixCommand(fallbackMethod = "queryByIdFallback")
    public String queryById(@PathVariable("id")BigDecimal id){
        String url = "http://user-service/user/" + id;
        String user = restTemplate.getForObject(url, String.class);
        return user;
    }

    public String queryByIdFallback(BigDecimal id){
        return "服务器忙";
    }
}

        3.2、类级别默认降级策略

a.@DefaultProperties(defaultFallback = "queryByIdFallback")

b.queryByIdFallback方法此时不能写参数,返回值也不用一致

@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "queryByIdFallback")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
    })
    public String queryById(@PathVariable("id")BigDecimal id){
        String url = "http://user-service/user/" + id;
        String user = restTemplate.getForObject(url, String.class);
        return user;
    }

    public String queryByIdFallback(){
        return "服务器忙";
    }
}

    4、实现效果

 

触发熔断的最小请求次数10

触发熔断的失败请求次数最小占比60

休眠时长10S

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值