04 服务容错:Spring Cloud Hystrix

导读:本篇文章讲解 04 服务容错:Spring Cloud Hystrix,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1、为何要使用Hystrix

在开发微服务架构的项目时,微服务之间必然存在相互调用的关系,以一个电商项目为例,用户完成一个购物流程,至少会涉及到3个微服务:商品微服务、订单微服务、支付微服务,它们的调用关系如下图所示:

04 服务容错:Spring Cloud Hystrix

用户通过商品微服务ms-goods选择商品,通过订单微服务ms-order完成下单,通过支付微服务ms-pay完成订单的支付,在这个流程里面,订单微服务ms-order在抢购、秒杀等业务场景下经常会出现并发的情况,从而导致ms-order微服务崩溃、无法再对外提供接口服务,如果不做服务容错处理,那么此时支付微服务ms-pay也将因为无法调用ms-order提供的接口而停止工作。

如果崩溃的微服务是ms-goods,那么整个微服务调用的链路都会崩溃掉,产生雪崩效应。Hystrix的出现,就是为了解决微服务出错后如何持续提供服务的问题。

2、Spring Cloud项目中集成Hystrix

(1)在IntelJ IDEA中新建一个Spring Boot项目

(2)在依赖选择步骤,选择Spring Cloud Hystrix组件

04 服务容错:Spring Cloud Hystrix

(3)在启动类开启Hystrix服务能力

package com.gzliulan.demohystrix;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrixDashboard
public class DemoHystrixApplication {
 public static void main(String[] args) {
 SpringApplication.run(DemoHystrixApplication.class, args);
 }
}

(4)在控制器中使用Hystrix实现接口的服务容错

package com.gzliulan.demohystrix.controller;

import com.gzliulan.demohystrix.feign.MyFeign;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/api/test")
@DefaultProperties(defaultFallback = "dftFallBack")
public class TestController {
    @Autowired
    private MyFeign myFeign;

    @GetMapping("/find_book")
    public Object findBooks() {
        String response = myFeign.getRemoteBook();
        return response;
    }

    //@HystrixCommand(fallbackMethod = "fallBack") // 设置回调方法
    //@HystrixCommand(commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")}) // 设置超时时间
//    @HystrixCommand(
//            commandProperties = {
//                    // 启用断路器
//                    @HystrixProperty(name="circuitBreaker.enabled",value="true"),
//                    // 当在配置时间窗口内达到此数量的失败后,进行短路。默认20个
//                    @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="10"),
//                    // 断路多久以后开始尝试是否恢复,默认5s
//                    @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="10000"),
//                    // 出错百分比阈值,当达到此阈值后,开始短路。默认50%
//                    @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="60")
//            }
//    )
    @HystrixCommand
    @GetMapping("/get_book")
    public Object getRemoteBook(String flag) {
        if (null!=flag) { // 演示接口熔断
            return "success";
        }

        RestTemplate restTemplate = new RestTemplate();
        String response = restTemplate.getForObject("http://localhost:8081/api/book/list", String.class);
        //throw new RuntimeException("发生了异常,就会触发服务降价");
        return response;
    }

    // Hystrix降级回调方法
    private String fallBack() {
        return "网络繁忙,请稍后再试......";
    }

    // Hystrix降级回调方法
    private String dftFallBack() {
        return "默认的回调方法:网络繁忙,请稍后再试......";
    }

}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/10467.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!