前面相关文章已经学习到了服务注册中心,服务调用,的Ribbon,LoadBalancer,Feign和OpenFeign,Consul,Zookeeper等相关内容。接下来学习服务降级。
一、Hystrix
首先说明一点,它差不多已经不用了,但是为什么要说呢,因为它太牛逼了,后面很多东西都是借鉴它来的,所以必须来了解一下。
1、什么是Hystrix
(1)系统分开开发后,存在了很多问题
(2)是什么
(3)能干嘛
(4)停更原因
2、Hystrix重要概念
Hystrix的服务降级熔断限流概念
(1)服务降级
- 反正就是你要给我保底的
- 什么情况会触发呢
(2)服务熔断
(3)服务限流
3、支付案例
(1)构建项目
- 建model
- 导依赖
<dependencies>
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--web-->
<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>
<dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>cn.mldn</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 写yml
server:
port: 8001
spring:
application:
name: cloud-provider-hystrix-payment
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
#defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
defaultZone: http://eureka7001.com:7001/eureka
- 主启动
- 写业务逻辑
这里是模拟来,所以就没有那么标准,现在启动测试没事问题,后面个error虽然是停顿了,但是到结束都还是没啥问题。
(2)正常到错误
-
这里要模拟多线程去使用:先安装这
-
模拟
-
启动测试
再次发送这个都发现满了很多
之前把资源分配均匀,但是现在大量的去访问error的方法,此时就会变慢,OK访问也变慢了,此时就需要接下来的Hystrix来容错和限流来处理了
(3)订单微服务调用支付服务卡顿
- 建项目
- 改pom
<dependencies>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>cn.mldn</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--web-->
<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>
<!--一般基础通用配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 写yml
server:
port: 80
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
-
主启动
-
业务类
-
启动测试
测试error就直接报错
4、根据上面项目问题处理降级容错
1)服务降级
(1)降级的配置
可以实现注解@HystrixCommand进行处理
(2)8001先从自己找问题(fallback)
- 主启动类上配置
- 业务类写
或者如下写
(3)从消费者端80去fallback
-
再次回顾
-
80实现【比如我们8001说是五秒都是正常的,但是你消费者端不想等,那你就自己处理】
一般是放在客户端 -
yml修改
-
写启动类
-
写业务类
-
此时启动测试,发现一秒五就报错。
(4)看一下现在存在的问题
每一个方法都要去写一个兜底的方法的话,会发现我们的代码膨胀,要是以后的代码量出现几万,几万时候都去配置发现会很拉胯。【所以肯定要配置通用的+一些部分自己特定配置的方式处理】
(5)DefaultProperties(解决上面问题)
- 看一下原因
- 配置方式
- 自己配置
上面这样配置报错了’
- 如下配置就OK了
(6)全局配置的降级
- 首先想一下我们既然可以调佣这微服务可以调用成功,那我们是否可以在这里全局做了降级【在如下的位置配置就可以达到解耦的作用】
- 分析一下如下【之前也见过了运行和超时异常,这里就模拟宕机异常】
- 修改cloud-consumer-feign-Hystrix-order80
-
根据cloud-consumer-feign-Hystrix-order80已经有的paymentHystrixService接口,重新建一个类(PaymentFallbackService)实现该接口,统一为接口里面的方法进行异常处理。
-
paymentFallback类实现paymentFeignClientService接口
-
YML配置
-
PaymentFeignClientService接口
-
测试
把你的8001挂掉
如果你之前的没有关掉就访问如下
-
2)服务熔断
(1)熔断概念
这个之前就说到过,这里就不细入讲解了。其实它也是降级的特别版。
- 段路器:理解为家里面的保险丝
- 熔断概念
- 看一下图
(2)案例演示
修改cloud-provider-Hystrix-payment8001
-
首先介绍一下聚哈的含义:String serialNumber = IdUtil.simpleUUID();它是生成唯一id好 【是由如下的一个组织更新的】
-
修改配置8001的PaymentService
//circuitBreaker.enabled是,是否开启断路器
@HystrixProperty(name = “circuitBreaker.enabled”,value = “true”),
//circuitBreaker.requestVolumeThreshold,请求次数【它和失败率是挂钩的,就是在10次以内失败率达到60就熔断】
@HystrixProperty(name = “circuitBreaker.requestVolumeThreshold”,value = “10”),
//circuitBreaker.sleepWindowInMilliseconds,时间窗口期
@HystrixProperty(name = “circuitBreaker.sleepWindowInMilliseconds”,value = “10000”),
//circuitBreaker.errorThresholdPercentage,失败率达到多少后跳闸
@HystrixProperty(name = “circuitBreaker.errorThresholdPercentage”,value = “60”)
你配置了就按你的,没配置就是它默认的。 -
再修改controller
-
测试
- 正确测试
- 测试不正常情况【不正确使用会在过过一段时间后恢复正常】
当我们使劲点,超过很多次之后,输入正常的也不行
过一段时间测试又恢复正常
- 正确测试
(3)熔断小总结
-
断路器在上面情况起作用呢
-
断路器开启或关闭的流程
-
断路器打开之后
-
所有的配置
3)服务限流
这个是基本淘汰了,这个比较重要,在SpringCloudAlibaba进行详细讲解
5、Hystrix工作流程
- 工作流程图
6、Hystrix图形化Dashboard
- 就是服务监控HystrixDashboard
1)搭建环境
(1)建model
(2)写pom
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
(3)写yml
(4)主启动
这里多提一嘴,监控信息必须导入如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(5)启动测试
启动访问如下地址
2)监控实战
(1)配置8001
/**
*此配置是为了服务监控而配置,与服务容错本身无关,springcloud升级后的坑
*ServletRegistrationBean因为springboot的默认路径不是"/hystrix.stream",
*只要在自己的项目里配置上下面的servlet就可以了
*/
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
(2)启动测试
- 配置地址
多点几下这里进入正确的测试
多点几下错误测试
二、sentinel和resilience4j
这两个都在后续的笔记再总结