spring cloud之服务熔断

四、Hystrix组件(*)

- 官网:https://github.com/Netflix/Hystrix
- 在分布式环境中,许多服务依赖项不可避免的会失败。Hystrix是一个库,它通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止它们之间的级联故障及提供后备选项来实现这一点,所有这些都可以提高系统的整体弹性。

1.服务雪崩

- 在微服务之间进行服务调用,由于某一个服务故障,导致级联的服务故障的现象,成为雪崩效应。
- 雪崩效应描述的是服务提供方不可用,导致消费方不可用,并将不可用逐渐扩大的过程。

微服务之间链路调用图示
在这里插入图片描述

在某一时刻流量突然波动很大,导致某一服务(如SeverC)扛不住请求的压力,变得不可用。那么ServerB的请求也会阻塞,慢慢耗尽serverB的线程资源,导致ServerB也变得不可用,同样也会导致ServerA不可用

在这里插入图片描述

2.服务熔断

"熔断器"本身是一种开关装置,当某个服务发生故障后,通过断路器(hystrix)的故障监控,某个异常条件被触发,直接熔断整个服务。向请求方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出异常,就保证了服务请求方的线程不会长时间占用,避免故障在分布式系统中蔓延,乃至雪崩。如果目标服务情况好转则恢复调用。服务熔断是解决服务雪崩的重要手段。

服务熔断图示:
在这里插入图片描述

3.服务降级

- 服务压力剧增时,为了保证核心服务正常运行,可以有策略的关闭微服务系统中的某些边缘服务

服务降级图示
在这里插入图片描述

4.服务熔断和服务降级总结

- 服务熔断必会触发服务降级,所以熔断也是降级的一种。区别在于熔断是对服务之间调用链的保护,而降级是对整个系统压力过载的一种保护。
- 都是从系统的可用性可靠性着想,为防止系统的整体缓慢甚至服务雪崩,所采取的保护手段。

5.服务熔断的实现

  • 1.添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  • 2.在启动类上添加注解 @EnableCircuitBreaker。开启服务熔断
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class HystrixApplication {

}
  • 3.服务熔断测试
在方法上添加注解@HystrixCommand(fallbackMethod = "demoFallback"),fallback指定服务熔断后的处理

@RestController
public class DemoController {

    @GetMapping("/demo")
    @HystrixCommand(fallbackMethod = "demoFallback")
    public String demo(@RequestParam Integer id){
        if (id <= 0) {
            throw new RuntimeException("ID无效");
        }
        return "demo ok";
    }

    /**
     * demo方法服务熔断后的处理
     */
    public String demoFallback(Integer id) {
        return "系统繁忙,请稍后再试!";
    }
}

错误请求,操作多次后,熔断器打开
在这里插入图片描述

在熔断器打开状态下,接下来(默认)5秒内,所有请求到该接口依然会熔断处理
在这里插入图片描述

熔断器打开状态下,5秒后,此时熔断器处于半开状态,允许放行一个请求进来,如果该请求执行成功,则断路器会关闭,反之重新打开断路器
在这里插入图片描述

  • Hystrix熔断器打开条件
- 1.当次数达到一定的阈值时(默认10秒内超过20个请求次数)
- 2.当失败率达到一定的比例(默认10秒内超过50%的请求失败)
  • Hystrix熔断器触发熔断机制流程图
    在这里插入图片描述
当Hystrix监控对该服务接口调用达到触发熔断器开启的条件时,会在系统中自动触发熔断器,此时任何到该接口的服务请求均不可用,默认5秒后,熔断器会处于半开状态,只允许放行一个请求到该服务接口,如果该请求执行成功,则断路器关闭,反之断路器重新打开

6.OpenFeign 集成 Hystrix

  • 1.添加依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- consul 注册中心 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
    <!-- hystrix 熔断 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    <!--openfeign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
  • 2.配置文件
server.port=8855
# 服务名
spring.application.name=OPENFEIGN-HYSTRIX
# consul注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
# 开启openfeign服务熔断处理(默认为false,不开启)
feign.hystrix.enabled=true
  • 3.在启动类上添加注解
@SpringBootApplication
@EnableDiscoveryClient // 开启服务注册客户端
@EnableCircuitBreaker // 开启断路器
@EnableFeignClients // 开启feign
public class OpenfeignHystrixApplication {

}
  • 4.OpenFegin 集成 Hystrix 测试
@RestController
@Slf4j
public class TestController {

    @Autowired
    private HystrixClient hystrixClient;

    @GetMapping("/test")
    public String test(@RequestParam Integer id) {
        String result = hystrixClient.demo(id);
        log.info("result:{}", result);
        return "test ok";
    }
}
---------------
- feign客户端接口
// fallback:当接口处理异常或不可用时,进行服务熔断处理
@FeignClient(value = "HYSTRIX", fallback = HystrixClientFallback.class)
public interface HystrixClient {

    @GetMapping("/demo")
    String demo(@RequestParam(value = "id") Integer id);
}  

- Openfeign接口服务熔断备选处理类,需实现HystrixClient接口
@Component
public class HystrixClientFallback implements HystrixClient {

    @Override
    public String demo(Integer id) {
        return "当前请求处理失败,进行服务熔断备选处理。id:" + id;
    }
}

在这里插入图片描述

7.Hystrix Dashboard(仪表盘)

- Hystrix Dashboard收集了每个HystrixCommand的一组度量,以高效的方式显示每个断路器的运行状况
- 作用:监控每一个@HystrixCommand注解的一组度量,构建一组信息,通过图形化方式展示当前方法@HystrixCommad的状态信息
  • 1.添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
  • 2.配置文件
server.port=9909
# 应用名
spring.application.name=HYSTRIX-DASHBOARD
# consul注册中心地址
# spring.cloud.consul.host=localhost
# spring.cloud.consul.port=8500
  • 3.在启动上添加注解@EnableHystrixDashboard
@SpringBootApplication
//@EnableDiscoveryClient
@EnableHystrixDashboard // 开启熔断器仪表盘
public class HystrixDashboardApplication {

}
  • Hystrix Dashboard图形化界面访问地址
http://localhost:9909/hystrix

在这里插入图片描述

添加需要监控的服务地址,点击【 Monitor Stream】
在这里插入图片描述

  • Hystrix目前状态
- Hystrix 和 Hystrix Dashboard已经进入维护模式
	- Hystrix Dashboard已经被废弃,替换产品:Netflix-Skunkworks/hystrix-dashboard

- 推荐使用阿里的 sentinel (流量卫兵)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coo_lw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值