一文读懂Spring Cloud-Hystrix!
Hystrix概述
Hystrix:断路器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
hystrix可以实现降级和熔断:
- 降级
调用远程服务失败(宕机、500错、超时),可以降级执行当前服务中的一段代码,向客户端返回结果
快速失败
- 熔断
当访问量过大,出现大量失败,可以做过热保护,断开远程服务不再调用
限流
防止故障传播、雪崩效应
在微服务系统中,服务之间进行依赖,避免有调用其中服务失败,而引起其他服务大范围宕机,造成雪崩效应,hystrix熔断可在满足熔断条件(默认10秒20次以上请求,同时50%失败)后执行降级。快速断开故障服务,保护其他服务不受影响。
降级
第一步:sp06添加hystrix依赖
org.springframework.cloud spring-cloud-starter-netflix-hystrix
第二步:主程序添加@EnableCircuitBreaker启用hystrix断路器
packagecn.tedu.sp06;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
importorg.springframework.cloud.client.loadbalancer.LoadBalanced;
importorg.springframework.context.annotation.Bean;
importorg.springframework.http.client.SimpleClientHttpRequestFactory;
importorg.springframework.web.client.RestTemplate;
@EnableCircuitBreaker
@SpringBootApplication
publicclassSp06RibbonApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(Sp06RibbonApplication.class,args);
}
/**
*创建RestTemplate实例
*放入spring容器
*@LoadBalanced-对RestTemplate进行增强,封装RestTemplate,添加负载均衡功能
*/
@LoadBalanced
@BeanpublicRestTemplaterestTemplate(){
//设置调用超时时间,超时后认为调用失败
SimpleClientHttpRequestFactoryf=
newSimpleClientHttpRequestFactory();
f.setConnectTimeout(1000);//建立连接等待时间
f.setReadTimeout(1000);//连接建立后,发送请求后,等待接收响应的时间
returnnewRestTemplate(f);
}
}
第三步:RibbonController中添加降级方法
- 为每个方法添加降级方法,例如getItems()添加降级方法getItemsFB()
- 添加@HystrixCommand注解,指定降级方法名
packagecn.tedu.sp06.controller;
importcn.tedu.sp01.pojo.Item;
importcn.tedu.sp01.pojo.Order;
importcn.tedu.sp01.pojo.User;
importcn.tedu.web.util.JsonResult;
importcom.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.*;
importorg.springframework.web.client.RestTemplate;
importjava.util.List;
@RestController
@Slf4j
publicclassRibbonController{
@Autowired
privateRestTemplatert;
@GetMapping("/item-service/{orderId}")
@HystrixCommand(fallbackMethod="getItemsFB")//指定降级方法的方法名
publicJsonResult>getItems(@PathVariableStringorderId){
returnrt.getForObject("http://item-service/{1}",JsonResult.class,orderId);
}
@PostMapping("/item-service/decreaseNumber")
@HystrixCommand(fallbackMethod="decreaseNumberFB")//指定降级方法的方法名
publicJsonResult>decreaseNumber(@PathVariableList- items){
returnrt.postForObject("http://item-service/decreaseNumber",items,JsonResult.class);
}
@GetMapping("/user-service/{userId}")
@HystrixCommand(fallbackMethod="getUserFB")//指定降级方法的方法名
publicJsonResult
getUser(@PathVariableIntegeruserId){
returnrt.getForObject("http://user-service/{1}",JsonResult.class,userId);
}
@GetMapping("/user-service/{userId}/score")
@HystrixCommand(fallbackMethod="addScoreFB")//指定降级方法的方法名
publicJsonResultaddScore(
@PathVariableIntegeruserId,Integerscore){
returnrt.getForObject("http://user-service/{1}/score?score={2}",JsonResult.class,userId,score);
}
@GetMapping("/order-service/{orderId}")
@HystrixCommand(fallbackMethod="getOrderFB")//指定降级方法的方法名
publicJsonResultgetOrder(@PathVariableStringorderId){
returnrt.getForObject("http://order-service/{1}",JsonResult.class,orderId);
}
@GetMapping("/order-service")
@HystrixCommand(fallbackMethod="addOrderFB")//指定降级方法的方法名
publicJsonResultaddOrder(){
returnrt.getForObject("http://order-service/",JsonResult.class);
}
//降级方法的参数和返回值,需要和原始方法一致,方法名任意
publicJsonResult>getItemsFB(StringorderId){
returnJsonResult.err("获取订单商品列表失败");
}
publicJsonResultdecreaseNumberFB(List- items){
returnJsonResult.err("更新商品库存失败");
}
publicJsonResult
getUserFB(IntegeruserId){
returnJsonResult.err("获取用户信息失败");
}
publicJsonResultaddScoreFB(IntegeruserId,Integerscore){
returnJsonResult.err("增加用户积分失败");
}
publicJsonResultgetOrderFB(StringorderId){
returnJsonResult.err("获取订单失败");
}
publicJsonResultaddOrderFB(){
returnJsonResult.err("添加订单失败");
}
}
第四步:启动eureka、item和hystrix服务器进行测试
http://localhost:3001/item-service/35
hystrix超时设置:
超时时间设置应该超过ribbon重试时间,否则重试失效。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
hystrix等待超时后,会执行降级代码,快速向客户端返回降级结果,默认超时时间是1000毫秒。
可在yml中设置超时时间:
hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds:6000
熔断
主程序添加@EnableCircuitBreaker启用hystrix断路器,熔断自动打开。
Hystrix故障监控-HystrixDashboard断路器仪表盘
Hystrix使用springboot提供的actuator健康管理,监控各个端点。
actuator中的hystrix.stream可以监控hystrix断路器各端点日志。
第一步:sp06的pom中添加actuator依赖
org.springframework.boot spring-boot-starter-actuator 2.4.0
第二步:在yml中配置健康监控的内容
#"*"暴露所有监控端点 management: endpoints: web: exposure: include:"*"
第三步:测试actuator健康监控
http://localhost:3001/actuator/搭建HystrixDashboard仪表盘:
仪表盘项目是一个完全独立的项目。
第一步:创建springboot项目sp08-htstrix-dashboard
第二步:添加hystrixdashboard依赖
org.springframework.cloud spring-cloud-starter-netflix-hystrix-dashboard
第三步:主程序上添加@EnableHystrixDashboard注解
packagecn.tedu.sp08;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
@EnableHystrixDashboard
@SpringBootApplication
publicclassSp08HystrixDashboardApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(Sp08HystrixDashboardApplication.class,args);
}
}
第四步:配置允许给那些服务器开启权限
hystrix: dashboard: proxy-stream-allow-list:localhost
第五步:监控查看
http://localhost:4001/hystrix/
第六步:查看hystrixstream监控数据端点
输入hystrix监控地址
访问item/user/order服务器,查看仪表盘。
第六步:使用ab进行并发访问测试
使用apache的并发访问测试工具ab进行访问测试。
打开ab工具/bin文件目录--cmd--输入命令:
ab-n20000-c50http://localhost:3001/item-service/35
并发50,发送20000个请求,查看仪表盘。
到此这篇关于一文读懂SpringCloud-Hystrix的文章就介绍到这了,更多相关SpringCloudHystrix内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!