springcloud系列15——hystrix简介及简单代码示例

Hystrix简介

在微服务中,有服务A、B,C,D4个微服务。其中,C依赖D,A和B依赖C。
那么当D出现问题时,会导致C不可用,进而导致A和B也不可用。这就是产生了雪崩效应。

hystrix语义为“豪猪”,它身上有很多刺,具有自我保护的能力。hystrix的出现即为解决雪崩效应。

关于Hystrix的原理可用参考:https://www.jianshu.com/p/e07661b9bae8

spring cloud hystrix相关内容参考:http://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_circuit_breaker_hystrix_clients

简单代码示例

新增模块microservice-springcloud-movie-hystrix。该模块是从microservice-springcloud-movie拷贝过去的。

在pom.xml增加hystrix依赖:

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

在App启动类增加@EnableCircuitBreaker注解:

@SpringBootApplication
@EnableCircuitBreaker
public class MovieHystrixApp
{
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main( String[] args )
    {
        SpringApplication.run(MovieHystrixApp.class,args);
    }
}

Controller:

@RestController
public class MovieController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/user/{userId}")
    @HystrixCommand(fallbackMethod = "getUserFallback")
    public User getUser(@PathVariable Long userId) {
        return restTemplate.getForObject("http://microservice-springcloud-user/sample/" + userId,User.class);
    }

    public User getUserFallback(Long userId) {
        User user = new User();
        user.setId(0L);
        return user;
    }
}

fallbackMethod指定服务调用失败时的处理方法为getUserFallback。

注意:fallbackMethod指定的方法必须与原方法有相同的方法签名。

测试

1.启动EurekaServer App;
2.启动microservice-springcloud-user;
3.启动microservice-springcloud-movie-hystrix。

浏览器请求http://127.0.0.1:8761/
第一次执行会发现调用了fallbackMethod指定的方法,返回的user的id为0.

后面刷新,返回的都是正常的调用user模块的。

我们将user服务关闭,再刷新页面。此时页面有一定的等待,并返回的是fallbackMethod指定的数据,user的id为0.

后面刷新页面20次,然后继续刷新,发现虽然返回的user的id还是0,但是没有等待。过几秒后,刷新页面又有等待,过一会儿又没有了。

原因在spring cloud的文档中已经说到:

A service failure in the lower level of services can cause cascading(级联) failure all the way up to the user. When calls to a particular service is greater than circuitBreaker(断路器).requestVolumeThreshold (default: 20 requests) and failue percentage is greater than circuitBreaker.errorThresholdPercentage (default: >50%) in a rolling window defined(定义) by metrics(度量标准).rollingStats.timeInMilliseconds (default: 10 seconds), the circuit(电路) opens and the call is not made. In cases of error and an open circuit a fallback(撤退) can be provided by the developer.

翻译过来的意思就是:

在较低级别的服务中的服务故障可能导致级联故障一直到用户。当对特定服务的调用大于circuitBreaker.requestVolumeThreshold(默认值:20请求)和故障率大于circuitBreaker.errorThresholdPercentage阈值百分比(默认值:50%)在metrics.rollingStats.timeInMilliseconds指定的时间内(默认10秒)。断路器打开并且不进行服务的调用。在错误和电路打开的情况下,开发人员可以提供回退。

所以,在10秒后,20次请求,有50%的故障率,Hystrix会执行开发人员提供的fallback方法。

但是Hystrix有它的监控方法,所以隔一定的时间(默认5秒),Hystrix会检查服务是否可用,如果不可用,则继续打开断路器开关,并按指定的回退方法处理;如果服务恢复正常,则执行服务调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# Spring Cloud Examples Spring Cloud 使用的各种示例,以最简单、最实用为标准 [Spring Cloud 中文索引](https://github.com/ityouknow/awesome-spring-cloud)  |   [Spring Boot学习示例代码](https://github.com/ityouknow/spring-boot-examples)  |   [参与贡献](https://github.com/ityouknow/spring-cloud-examples/issues) [English](README_EN.md)  |   **[github地址](https://github.com/ityouknow/spring-cloud-examples)**  |   **[码云地址](https://gitee.com/ityouknow/spring-cloud-examples)** Spring Cloud 使用的各种示例,以最简单、最实用为标准 **[Spring Boot 2.0 最全使用教程](https://github.com/ityouknow/spring-boot-leaning)** - [spring-cloud-eureka](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-eureka):eureka server单机、双机、集群示例 - [eureka-producer-consumer](https://github.com/ityouknow/spring-cloud-examples/tree/master/eureka-producer-consumer):利用eureka实现服务提供与调用示例 - [spring-cloud-hystrix](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-hystrix):Hystrix熔断的使用示例 - [hystrix-dashboard-turbine](https://github.com/ityouknow/spring-cloud-examples/tree/master/hystrix-dashboard-turbine):熔断监控Hystrix Dashboard和Turbine的示例 - [spring-cloud-config-git](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-config-git):配置中心git版本示例 - [spring-cloud-config-svn-refresh](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-config-svn-refresh):配置中心svn版本示例,客户端refresh版本示例 - [spring-cloud-config-eureka](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-config-eureka):配置中心服务化和高可用代码示例 - [spring-cloud-config-eureka-bus](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-config-eureka-bus):配置中心和消息总线示例(配置中心终结版) - [gateway-service-zuul](https://github.com/ityouknow/spring-cloud-examples/tree/master/gateway-service-zuul):Spring Cloud Zuul使用初级篇 网关 均衡负载 - [spring-cloud-zuul](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-zuul):Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断 重试 - [spring-cloud-sleuth-zipkin](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-sleuth-zipkin): 利用Sleuth、Zipkin对Spring Cloud应用进行服务追踪分析 - [spring-boot-admin-eureka](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-boot-admin-eureka): 使用Spring Boot Admin 对Spring Cloud集群进行监控示例 - [spring-cloud-consul](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-consul): Spring Cloud 使用 Consul 作为服务中心示例 - [spring-cloud-gateway](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-gateway): Spring Cloud 使用 gateway 的相关示例 学习系列: - [springcloud(一):大话Spring Cloud](http://www.ityouknow.com/springcloud/2017/05/01/simple-springcloud.html) - [springcloud(二):注册中心Eureka](http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html) - [springcloud(三):服务提供与调用](http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html) - [springcloud(四):熔断器Hystrix](http://www.ityouknow.com/springcloud/2017/05/16/springcloud-hystrix.html) - [springcloud(五):熔断监控Hystrix Dashboard和Turbine](http://www.ityouknow.com/springcloud/2017/05/18/hystrix-dashboard-turbine.html) - [springcloud(六):配置中心git示例](http://www.ityouknow.com/springcloud/2017/05/22/springcloud-config-git.html) - [springcloud(七):配置中心svn示例和refresh](http://www.ityouknow.com/springcloud/2017/05/23/springcloud-config-svn-refresh.html) - [springcloud(八):配置中心服务化和高可用](http://www.ityouknow.com/springcloud/2017/05/25/springcloud-config-eureka.html) - [springcloud(九):配置中心和消息总线(配置中心终结版)](http://www.ityouknow.com/springcloud/2017/05/26/springcloud-config-eureka-bus.html) - [springcloud(十):服务网关zuul](http://www.ityouknow.com/springcloud/2017/06/01/gateway-service-zuul.html) - [springcloud(十一):服务网关Zuul高级篇](http://www.ityouknow.com/springcloud/2018/01/20/spring-cloud-zuul.html) - [springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪](http://www.ityouknow.com/springcloud/2018/02/02/spring-cloud-sleuth-zipkin.html) - [springcloud(十三):Spring Cloud Consul 使用详解](http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html) - [Spring Cloud (十四):Spring Cloud 开源软件都有哪些?](http://www.ityouknow.com/springcloud/2018/08/06/spring-cloud-open-source.html) - [springcloud(十五):服务网关 Spring Cloud GateWay 初级篇](http://www.ityouknow.com/springcloud/2018/12/12/spring-cloud-gateway-start.html) - [springcloud(十六):服务网关 Spring Cloud GateWay 服务化和过滤器](http://www.ityouknow.com/springcloud/2019/01/19/spring-cloud-gateway-service.html) - [springcloud(十七):服务网关 Spring Cloud GateWay 熔断、限流、重试](http://www.ityouknow.com/springcloud/2019/01/26/spring-cloud-gateway-limit.html) 综合篇: - **[Spring Cloud在国内中小型公司能用起来吗?](http://www.ityouknow.com/springcloud/2017/09/11/can-use-springcloud.html)** - **[中小型互联网公司微服务实践-经验和教训](http://www.ityouknow.com/springcloud/2017/10/19/micro-service-practice.html)** - **[从架构演进的角度聊聊Spring Cloud都做了些什么?](http://www.ityouknow.com/springcloud/2017/11/02/framework-and-springcloud.html)**

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值