SpringCloud笔记四:互联网架构服务降级熔断Hystrix
SpringCloud笔记四:互联网架构服务降级熔断Hystrix
文章目录
分布式核心知识,熔断降级
系统负载过高,突发流量或者网络等各种异常情况介绍,常用解决方案
- 熔断
调用某个服务,如果多次出现调用失败情况,就会触发熔断机制,不允许再调用该服务。
仍能保证该操作能够执行。比如下单,调用用户服务,如果用户服务出现异常,就会触发熔断,但是下单功能可以继续实现。
- 降级
降级就是:当出现网络等问题时,可以抛弃一些非核心的服务。只返回核心服务数据。例如查询某个商品时,如果网络很差,只需要返回该商品的价格,和库存就可以了。
- 熔断和降级
相同点:
1、从可用性和可靠性触发,为了防止系统崩溃。
2、最终让用户体验到的是某些功能暂时不能用。
不同点:
1、服务熔断一般是由下游服务故障导致的,而服务降级一般是从整体系统负荷考虑,由调用方控制。
Netflix开源组件断路器Hystrix
- Hystrix
Hystrix:汉语豪猪的意思,防护,保护的意义。
Hystrix的作用:
在一个分布式系统里,一个服务依赖多个服务,可能存在某个服务调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,通过Hystrix就可以解决
- Hystrix提供了熔断,隔离,Fallback,cache、监控等功能。
- 熔断如何处理
出现错误之后可以,fallback 错误的信息,兜底数据。
Feign结合Hystrix熔断开发
- 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 添加注解,启动类里面添加@EnableCircuitBreaker
如果添加的注解过多,可以用@SpringCloudApplication替代一些
- 熔断降级等处理
最外层api使用,好比异常处理(网络异常,参数或者内部调用问题
api方法上增加 @HystrixCommand(fallbackMethod=“saveOrderFail”)
编写fallBack方法实现,方法签名一定要和api方法签名一致。即:参数一定要一致。
Feign结合Hystrix断路器开发
- Feign接口里面有包含Hystrix的接口方法。但是需要进行配置。
1、在配置文件里面添加配置,开启Feign的hystrix的熔断器
#修改feign请求的超时时间
feign:
#开启Hystrix熔断机制
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 2000
readTimeout: 2000
2、创建一个类,用于实现FeignClient,并实现里面的方法。并被Spring扫描,
该实现类可以写一些电话通知等功能,用于监控。
@Component
public class ProductClientFallback implements ProductClient {
@Override
public String findById(int id) {
System.out.println("feign 调用product-service findByid异常");
return null;
}
}
3、FeignClient类需要指定失败后进入的类,fallback=xxx.class
@FeignClient(name = "product-service",fallback = ProductClientFallback.class)
public interface ProductClient {
@GetMapping("api/v1/product/find")
String findById(@RequestParam(value = "id") int id);
}
熔断降级服务异常报警通知实战
- 服务异常报警
- 安装redis
- 导入redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置redis
#服务的名称
spring:
application:
name: order-service
redis:
database: 0
host: 127.0.0.1
port: 6379
timeout: 2000
- 开发报警信息
注意:报警信息一定要new一个线程或者从线程池中获取一个线程,否则会阻塞下面的代码。并设置过期时间。注意:api里面写一些fallback方法,目的是返回前端一定的没有调通接口的数据。service里面的fallback方法,可以没有任何操作,也可以在控制台打印一下。
//方法签名一定要和api中的方法一致
private Object saveOrderFail(int userId,int productId,HttpServletRequest request){
//监控报警
String saveOrderKey="save-order";
String saveValue = redisTemplate.opsForValue().get(saveOrderKey);
final String ip=request.getRemoteAddr();
//可以换成线程池,另外如果是并发的情况下可能会发送多次,可以通过添加锁的方式解决。
new Thread(()->{
if(StringUtils.isEmpty(saveValue)){
System.out.println("紧急短信,用户下单失败,请离开查找原因,ip地址="+ip);
//发送一个http请求,调用短信服务
redisTemplate.opsForValue().set(saveOrderKey,"save-order-fail",20, TimeUnit.SECONDS);
}else{
System.out.println("已经发送过短信,20秒内不重复发送");
}
}).start();
Map<String,Object> msg=new HashMap<>();
msg.put("code",-1);
msg.put("msg","抢购人数太多,您被挤出来了,稍后请重试");
return msg;
}
}
深入源码剖析Hystrix降级策略和调整
- Hystrix降级策略和调整
查看默认的策略在HystrixCommandProperties中。
1、execution.isolation.strategy 隔离策略
THREAD 线程池隔离
SEMAPHORE 信号量
信号量适用于接口并发量高的情况,如每秒数千次调用情况,导致线程开销过高,通常只适用于非网络调用,执行速度快。
2、execution.isolation.thread.timeoutInMilliseconds 超时时间
默认 1000毫秒。
3、execution.timeout.enabled 是否开启超时限制
4、execution.isolation.semaphore.maxConcurrentRequests 隔离策略为信号量时,如果达到最大并发数时,后续请求会被拒绝。默认是10
- 调整策略
服务调用存在的时间超时问题:
一个http连接时间超时
一个是请求响应响应时间超时
还有一个请求不响应熔断超时
如果熔断超时时间过短,会造成http还未响应就已经进入熔断机制了。这样是不可行的,必须让熔断时间长一点。
#把hystrix超时时间关闭,默认开启
hystrix:
command:
default:
execution:
timeout:
enabled: false
一般不允许进行熔断超时关闭,否则熔断也就没有意义了。
配置线程熔断时间
#设置超时时间为4s
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 4000
断路器Dashboard监控仪表盘
- 加入依赖
<!--断路器监控仪表盘1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<!--断路器监控仪表盘2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 启动类增加注解
@EnableHystrixDashboard
- 配置文件增加endpoind
#暴露全部的监控信息
management:
endpoints:
web:
exposure:
include: "*"
- 访问接口
http://localhost:8781/hystrix
Hystrix Dashboard输入: http://localhost:8781/actuator/hystrix.stream
断路器监控仪表参数讲解和模拟熔断
- 监控仪器表详解
- 使用jmeter获取postmen进行测试
上一篇: 酸豆角可以冷冻保存吗,能保存多久?
下一篇: springcloud初级