1. 解决灾难性雪崩效应-服务熔断-服务熔断处理
(1) 熔断参数circuitBreaker.enabled的作用是什么?
是否开启熔断
(2) 熔断参数circuitBreaker.requestVolumeThreshold的作用是什么?
一个统计窗口内熔断触发的最小个数/10s,默认20个。
10s内请求数超过20个就触发熔断器,当请求满足熔断条件时将触发getFallBack()。
(3) 熔断参数circuitBreaker.sleepWindowInMiliseconds的作用是什么?
熔断多少秒后重新尝试请求。默认5000ms。
(4) 熔断参数circuitBreaker.errorThresholdPercentage的作用是什么?
失败率达到多少时触发熔断。默认采样时间为10s,失败率超过50%
(5) 熔断参数circuitBreaker.forceOpen的作用是什么?
是否强制开启熔断。默认为FALSE,不开启。
设置为true时,开启强制熔断,所有请求都被拒绝,直接到fallback
(6) 熔断参数circuitBreaker.forceClosed的作用是什么?
是否强制关闭熔断。默认为FALSE,不开启。
设置为true时,将忽略错误。
2. 解决灾难性雪崩效应-隔离机制-线程池隔离-创建项目
(1) 什么是线程池隔离?
为每一个服务接口单独开辟一个线程池,保持与其他服务接口线程的隔离,提高该服务接口的独立性和高可用。
(2) 线程池隔离的优点是什么?
(3) 线程池隔离的缺点是什么?
3. 解决灾难性雪崩效应-隔离机制-线程池隔离-线程池隔离处理
(1) @HystrixCommand注解中的threadPoolProperties属性的作用是什么?
指定线程池的一些属性集合
@Service
(2) @HystrixProperty注解的作用是什么?
指定线程池某个具体的属性的值
(3) 线程池隔离参数groupKey的作用是什么?
服务名,相同服务用同一个名称,如商品、用户等等。
默认值是getClass.getSimpleName()
在consumer里为每个provider服务设置group标识,一个group标识使用一个线程池。
(4) 线程池隔离参数commandKey的作用是什么?
接口,服务下面的接口,比如购买商品。
默认值:当前执行方法名。consumer的接口名称。
(5) 线程池隔离参数threadPoolkey的作用是什么?
线程池的名称:配置全局唯一标识线程池的名称,相同线程池名称的线程池是同一个。
默认是分组名groupKey。
(6) 线程池隔离参数coreSize的作用是什么?
线程池大小:这是最大的并发执行数量。
默认值是10
比如:每秒能处理1000个请求,99%请求的响应时间是60ms,那么应该设置为
1000*(0.06+0.012)
(7) 线程池隔离参数maxQueueSize的作用是什么?
最大队列长度:设置BlockQueue的最大长度。
默认值是-1,如果设置为正数,队列将从同步队列(SynchronousQueue)变为阻塞队列(LinkedBlockingQueue)。
(8) 线程池隔离参数queueSizeRejectionThreshold的作用是什么?
拒绝请求:设置拒绝请求的临界值。默认值为5.
此属性不适用于当maxQueueSize=-1时。
设置这个属性是因为maxQueueSize在运行时不能动态修改,我们通过修改这个值可以动态修改队列中允许排队的长度。
(9) 线程池隔离参数keepAliveTimeMinutes的作用是什么?
线程存活时间:设置存活时间,单位为分钟。默认值为1分钟。
控制一个线程从使用完成到被释放的时间。
4. 解决灾难性雪崩效应-隔离机制-信号量隔离-创建项目
(1) 什么是信号量隔离?
5. 解决灾难性雪崩效应-隔离机制-信号量隔离-信号量隔离处理
(1) 信号量隔离参数execution.isolation.strategy的作用是什么?
隔离策略设置类:THREAD或SEMAPHORE
默认值是THREAD
(2) 信号量隔离参数execution.isolation.thread.timeoutInMiliseconds的作用是什么?
超时时间,默认是1000ms。
在THREAD模式下,达到超时时间,自动中断。
在SEMAPHORE模式下,会等待执行完成后再去判断是否超时。
(3) 信号量隔离参数execution.isolation.thread.interruptOnTimeout的作用是什么?
是否打开超时线程中断。默认值为TRUE,仅在THREAD模式下有效。
(4) 信号量隔离参数execution.isolation.semaphore.maxConcurrentRequests的作用是什么?
信号量最大并发度,默认值为10.仅在SEMAPHORE模式下有效。
(5) 信号量隔离参数fallback.isolation.semaphore.maxConcurrentRequests的作用是什么?
fallback最大并发度,默认值为10.仅在SEMAPHORE模式下有效。
6. 线程池隔离和信号量隔离的区别
(1) 线程池隔离与信号量隔离有什么区别?
(2) 什么情况下使用线程池隔离?
(3) 什么情况下使用信号量隔离?
7. Feign的服务降级处理-创建项目
8. Feign的服务降级处理-服务降级处理
(1) 修改业务层代码,在Feign中配置服务降级。
修改配置文件开启对 hystrix 的支持
spring.application.name=ego-product-consumer-feign-fallback
server.port=9020
eureka.client.service-url.defaultZone=http://user:123@eureka1:8761/eureka/,http://user:123@eureka2:8761/eureka/
#Feign 默认是不开启 Hystrix 的。默认为:false
feign.hystrix.enabled=true
修改 ProductConsumerService
@Service
添加 ProductServiceFallback 类
@Component
修改 ProductController
@RestController
(2) 启动服务测试效果。
9. 服务降级后的异常记录
(1) 为什么要记录降级后的异常信息。
因为我们可以根据降级后出的异常信息来更好的优化程序来提升程序的性能和可用性。
添加 ProductServiceFallbackFactory 类
@Component
修改 ProductConsumerService
@FeignClient
10. 在项目中开启可视化的数据监控Hystrix-dashboard
(1) 什么是Hystrix-dashboard?
Hystrix-dashboard 是一款针对 Hystrix 进行实时监控的工具,通过 HystrixDashboard 我们可以在直观地看到各 Hystrix Command 的请求响应时间, 求成功率等数据。
(2) @EnableHystrix注解的作用是什么?
加在启动类上,表示项目开启对Hystrix的支持。可以使用@HystrixCommand注解。
(3) @EnableHystrixDashboard注解的作用是什么?
加在启动类上,表示项目开启对Dashboard的支持,项目启动后可以访问http://ip:port/actuator/hystrix.stream来查看该项目的监控数据。
11. 搭建Hystrix-dashboard数据监控中心
(1) 创建数据监控中心服务。
(2) 修改POM文件,添加actuator启动器,添加hystrix启动器、hystrix-dashboard启动器。
<?xml version="1.0" encoding="UTF-8"?>
(3) 需改启动类添加开启Hystrix与HystrixDashboard。
@EnableCircuitBreaker
(4) 访问HystrixDashboard服务,查看数据。
先启动服务,在启动监控中心
浏览器输入http://ip:port/hystrix来访问dashboard首页
12. 创建Turbine聚合服务器
(1) Turbine的作用是什么?
Turbine 是聚合服务器发送事件流数据的一个工具,hystrix 的过 监控中,只能监控单个节点,实际生产中都为集群,因此可以通过 turbine 来监控集群服务。
(2) @EnableTurbine注解的作用是什么?
加在启动类上,表示该项目启动对turbine的支持。是多个项目的集合监控工具项目。
13. 使用Turbine对多个服务进行监控
(1) Turbine默认监听端口是多少?
9988
(2) @EnableHystrixDashboard注解的作用是什么?
加在启动类上,表示该项目开启对dashboard的支持。可以是dashboard的视图项目或者是被监测的项目。
14. 使用Turbine监控集群
(1) 通过Turbine查看集群监控。
首先创建一个项目开启turbine,作为多个监测项目与dashboard视图项目的中间站。
Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
全局配置文件-Application.properties
spring.application.name=eureka-consumer-ribbon-turbine
server.port=1001
eureka.client.service-url.defaultZone=http://user:123@eureka1:8761/eureka/,http://user:123@eureka2:8761/eureka/
management.endpoint.env.enabled=true
management.endpoints.web.exposure.include=*
#---------------------------------------turbine--------------------------
#配置 Eureka 中的 serviceId 列表,表明监控哪些服务
turbine.appConfig=eureka-consumer-hystrix-dashboard,ego-product-consumer-feign-fallback
#指定聚合哪些集群,多个使用","分割,默认为 default。可使用http://.../turbine.stream?cluster={clusterConfig 之一}访问
turbine.aggregator.clusterConfig= default
# 1. clusterNameExpression 指定集群名称,默认表达式 appName;此时:turbine.aggregator.clusterConfig 需要配置想要监控的应用名称;
# 2. 当 clusterNameExpression: default 时,turbine.aggregator.clusterConfig 可以不写,因为默认就是 default;
# 3. 当 clusterNameExpression: metadata['cluster']时,假设想要监控的应用配置了 eureka.instance.metadata-map.cluster: ABC,
# 则需要配置,同时 turbine.aggregator.clusterConfig:ABC
turbine.clusterNameExpression="default"
启动类
@SpringBootApplication
然后properties文件中配置的被监听的项目依赖都要添加hystrix,hystrix-dashboard,actuator和turbine的依赖坐标
<dependency>
启动类都要添加@EnableCircuitBreaker,@EnableTurbine这两个注解。
@EnableFeignClients
配置文件都要将需要监测的端口暴露出来,建议设置为全部暴露
spring.application.name=ego-product-consumer-feign-fallback
server.port=9020
eureka.client.service-url.defaultZone=http://user:123@eureka1:8761/eureka/,http://user:123@eureka2:8761/eureka/
#Feign 默认是不开启 Hystrix 的。默认为:false
feign.hystrix.enabled=true
management.endpoint.env.enabled=true
management.endpoints.web.exposure.include=*
然后先启用被监测的consumer服务,再启用turbine项目,再启用dashboard-view的项目,在首页url一栏填入turbine的访问地址