降级,熔断 Hystrix

  • 测试用项目环境
  • 降级,熔断
  • 熔断
  • 降级
  • Hystrix
  • Hystrix解决了什么问题:
  • 结合Feign开发Hystrix断路器
  • maven依赖
  • 启动类注解

  • 降级
  • 熔断
  • 1.加入feign支持hystrix
  • 2.编写FallBack类
  • Hystrix配置
  • 加餐
  • 断路器Dashboard监控仪表盘
  • maven依赖
  • 启动类注解
  • 仪表盘各参数含义



降级,熔断,是微服务或分布式系统中系统负载过高,突发流量或网络问题等各种异常情况的常用解决方案。

测试用项目环境

框架

版本

Idea

2019.2

JDK

1.8

SpringBoot

2.1.6.RELEASE

SpringCloud

Greenwich.SR2

降级,熔断

  • 两者从可用性和可靠性触发,为了防止系统崩溃
  • 最终让用户体验到的是某些功能暂时不能用
  • 服务熔断一般是下游服务故障导致的,而服务降级一般是从整体系统负荷考虑,由调用方控制

熔断

类似保险丝,为了防止整个系统故障,保护子服务和下游服务。

降级

抛弃一些非核心的接口和数据,保留核心数据。

Hystrix

英文翻译豪猪
Netflix的开源项目
github:https://github.com/Netflix/Hystrix
wiki:https://github.com/Netflix/Hystrix/wiki

Hystrix解决了什么问题:

99.9930 = 99.7% uptime
0.3% of 1 billion requests = 3,000,000 failures
2+ hours downtime/month even if all dependencies have excellent uptime.

假如微服务系统中每个服务的可用性为99.99%
一次请求中会经过30个服务的调用
那么每次请求的可用性为99.7%
1亿次请求中请求失败的次数达到3百万
转换为服务器宕机超过两小时
这就是Hystrix的重要性

结合Feign开发Hystrix断路器

maven依赖

使用maven依赖管理,使用最新的springcloud Greenwich.SR2版本

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Greenwich.SR2</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
</dependencyManagement>

feign依赖里面已经有了hystrix但不是和springcloud结合的,没有**@HystrixCommand**注解
所以需要再加入结合后的hystrix依赖

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

启动类注解

@EnableCircuitBreaker

也可以使用

@SpringCloudApplication

该注解默认集成了微服务主要组件的启动注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker

降级

在可能抛出异常的方法上加上
@HystrixCommand

@HystrixCommand(fallbackMethod = "testFail")
public Object test(int user){ 
	return null;
}
    
// 方法名指定 业务方法出现异常则会进入指定的fallbackMethod
public Object testFail(int user){
	// 封装errMsg
	return null;
}

熔断

1.加入feign支持hystrix
# application.yml
feign:
  hystrix:
    enabled: true
2.编写FallBack类

fallback指向的必须是实现Feign调用的接口类的实现类

@FeignClient(name = "TEST-SERVER",fallback = TestServiceFallBack.class)
public interface TestService {
}
// 实现类
@Component // 交给spring管理
public class TestServiceFallBack implements TestService{
}

在调用服务出现异常时,feign便会执行fallback指定类的对应方法。可以进行日志记录,短信通知维护人员等。
建议写入消息队列等待消费,或者写入线程异步执行,提高性能。

Hystrix配置

Hystrix相关配置在
com.netflix.hystrix.HystrixCommandProperties
默认配置feign调用超过一秒认为访问超时
可以在**@HystrixCmomand**中配置
注解中的配置不需要加hystrix前缀,name就为HystrixCommandProperties中指定的key

@HystrixCommand(fallbackMethod = "testFail",commandProperties ={
	@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")
})
@GetMapping("/")
public Object test(int user){
	return "success";
}

yml的配置方式需要在key前加hystrix.command.default

hystrix:
  command:
    defalut:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000

加餐

断路器Dashboard监控仪表盘

maven依赖

<!--Dashboard仪表盘web界面-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
	</dependency>
<!--springboot监控器-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

启动类注解

@EnableHystrixDashboard

然后访问项目根路径下的/hystrix 比如:http://localhost:8091/hystrix

然后你会看到

java熔断和降级组件 springcloud熔断和降级的区别_学习笔记


在第一栏中输入项目根目录下路径/actuator/hystrix.stream

比如:http://localhost:8091/actuator/hystrix.stream

其他不用输入,点击Monitor Stream进入监控仪表如果SpringBoot版本比较高2.x的话进入后会看到这样的页面

java熔断和降级组件 springcloud熔断和降级的区别_学习笔记_02


因为后面的SpringBoot版本默认关闭了监控断点

配置中开启监控断点:

# 开启监控断点
management:
  endpoints:
    web:
      exposure:
        include: "*"

配置好后开启服务

然后请求服务的任意一个接口,监控器便可以正常访问

java熔断和降级组件 springcloud熔断和降级的区别_dashboard_03


打断一下!

这个DashBoard监视仪表是使用SSE后台推送技术返回的,flux流式返回!

仪表盘各参数含义

java熔断和降级组件 springcloud熔断和降级的区别_学习笔记_04