二、Hystrix实现微服务的容错处理
1.容错简介
为何需要容错?
- 网络请求超时
- 微服务不可用
- 微服务高负载
如何容错?
- 超时重试
- 熔断器
- 限流
而通常我们说的限流指代的是限制到达系统的并发请求数,使得系统能够正常的处理部分用户的请求,来保证系统的稳定性。
限流不可避免的会造成用户的请求变慢或者被拒的情况,从而会影响用户体验。因此限流是需要在用户体验和系统稳定性之间做平衡的,即我们常说的 trade off。
对了,限流也称流控(流量控制)。
说明:熔断器打开 服务降级 不请求provider了,就限流了。
服务降级就是降到了fallback。
简单理解:
如上图,当Service A调用Service B,失败多次达到一定阀值,Service A不会再去调Service B,而会去执行本地的降级方法!
对于这么一套机制:在Spring cloud中结合Hystrix,将其称为熔断降级。
更多详细讲解请参考: https://blog.csdn.net/JinXYan/article/details/90598216
2.容错模拟演示
启动server,启动consumer,不启动provider。访问consumer链接,请求出现报错。
3.Hystrix简介
容错管理工具
熔断器机制
Feign已经整合了Hystrix
4.使用Hystrix处理容错
4.1 consumer创建fallback类
熔断器打开 服务降级 不请求provider了,就限流了。
服务降级就是降到了fallback
4.2 配置熔断器hystrix,开启容错
feign:
hystrix:
enabled: true
注意:如上所说,feign组件的依赖已经包含了hystrix容错,所以不需要再次导包。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
4.3 编写fallback类,注入到spring容器,实现client接口。如下:
@Component
public class UserFallBack implements UserClient {
@Override
public String login() {
return "超时请重试";
}
}
4.4 在Client接口通过@FeignClient注解的fallback属性反射FallBack类:fallback = UserFallBack.class)
@FeignClient(name = "eureka-provider-demo",fallback = UserFallBack.class)
public interface UserClient {
@RequestMapping(value = "/login")
public String login();
}
4.5 启动类添加注解@EnableDiscoveryClient、@EnableFeignClients
4.6 测试
启动server,启动consumer,不启动provider。访问consumer链接。出现fallback类要return的内容,成功。
5.Feign项目的监控
5.1 consumer项目,添加容错可视化依赖 actuator执行器 和 hystrix熔断器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
5.2 启动类添加容错监控注解:@EnableCircuitBreaker
5.3 重启consumer,访问IP+端口+hystrix.stream ,出现ping
访问IP+端口+接口URL:http://localhost:8082/login后,再次查看http://localhost:8082/hystrix.stream,出现数据:
6.Hystrix Dashboard可视化监控
(容错监控可视化界面)
问题描述:Hystrix的监控是以文字形式展现的,一堆json字符串,乱七八糟,不方便分析
解决方案:Hystrix Dashboard可视化监控
6.1 新建项目hystrix-dashboard,pom降版本为1.5.9,导依赖:springcloud、actuator执行器、hystrix熔断器、dashboard仪表盘
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
6.2 不需要编写配置文件,启动类不需要再添加其他注解。直接启动项目,访问访问Hystrix Dashboard主页地址 localhost:8080/hystrix (端口默认为8080,若冲突,可在配置文件自行添加端口配置)
6.3 在Hystrix Dashboard主页输入监控服务地址,点击Monitor Stream查看,再次请求consumer项目的URL http://localhost:8082/login,然后再次点击Monitor Stream查看可视化仪表盘界面。
7.Turbine聚合监控
问题描述:Hystrix的监控每次只能查看单个微服务的监控数据
解决方案:Turbine聚合监控
7.1 创建多套Consumer-Provider项目
复制写好的一套Consumer-Provider项目到不同的路径,然后打开。
更换Consumer-Provider项目的端口和spring-application-name,更换provider项目中Controller类的接口请求链接,和consumer项目中client类的接口请求链接。(这俩链接保持一致)
2套Consumer-Provider项目都启动起来。
7.2 创建hystrix-turbinet项目,pom降版本为1.5.9,导依赖:springcloud、actuator执行器、Eureka client、turbine
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
7.3 启动类添加注解:@EnableDiscoveryClient、@EnableTurbine
7.4 编写配置文件
#从provider拿过来的配置
server:
port: 8085
eureka:
client:
service-url:
defaultZone: http://root:root@localhost:7776/eureka
instance:
lease-expiration-duration-in-seconds: 2
lease-renewal-interval-in-seconds: 2
instance-id: ${spring.cloud.client.ipAddress}:${server.port}
spring:
application:
name: hystrix-turbine
#服务都注册在了eureka中,通过turbine配置app-config都拿过来,整合到一个可视化界面中,进行了聚合监控。
turbine:
cluster-name-expression: " 'default' "
combine-host-port: true
app-config: eureka-consumer-demo,eureka-consumertest-demo
7.5 启动hystrix-turbine项目
访问hystrix-turbine项目的IP+端口,2个consumer的数据都有
直接将hystrix-turbine的链接作为监控服务地址 放入刚才的Hystrix Dashboard主页,单击monitor,可见2个consumer都被成功监控到:
注意:如只显示了一个,检查client的的URL不能一致,检查fallback类中@FeignClient注解的name属性是否匹配。然后检查2个consumer是否可以成功访问到,若可以,再次查看hystrix-turbine可视化界面就不会有问题了。
8.关于容错的其他配置(properties文件)
#时间窗口内达到20个就进行服务降级 :设置了这个之后,是consumer要请求失败20次以上才能进入降级页面。
#(当在配置时间窗口内达到此数量的失败后,进行短路,默认20个)
hystrix.command.default.circuitBreaker.rquestVolumeThreshold=20
#时间窗口 服务降级后5s开始重试 (短路多久以后开始尝试是否恢复,默认5秒)
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5
#出错百分比阈值: 错误率达到百分之50 就服务降级(开始短路)
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50%
内容太多了 我做了模块内容分离,springcloud的5个组件:feign、hystrix、ribbon、zuul、config都有博文分别介绍,如有需要请查看:
springcloud组件之一:feign(client)
springcloud组件之二:hystrix(容错&Hystrix处理容错&Feign项目的监控&Hystrix Dashboard可视化监控&Turbine聚合监控)
springcloud组件之三:Ribbon(轮询和随机负载)