Hystrix
系统容错工具
- 降级
- 调用远程服务失败(宕机、500错、超时),可以降级执行当前服务中的一段代码,向客户端返回结果
- 快速失败
- 熔断
- 当访问量过大,出现大量失败,可以做过热保护,断开远程服务不再调用
- 限流
- 防止故障传播、雪崩效应
降级
-
hystrix依赖
在pom文件中使用快捷键alt+insert,使用edit Starters插件添加
-
启动类添加注解 @EnableCircuitBreaker
-
添加降级代码
// 当调用远程服务失败,跳转到指定的方法,执行降级代码
@HystrixCommand(fallbackMethod="方法名")
远程调用方法() {
restTemplate.getForObject(url,......);
}
在controller层中远程调用方法上加上@HystrixCommand注解,并指定其远程访问出错时调用的方法
import cn.tedu.sp01.pojo.Item;
import cn.tedu.sp01.pojo.Order;
import cn.tedu.sp01.pojo.User;
import cn.tedu.sp01.util.JsonResult;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
@Slf4j
public class RibbonController {
@Autowired
private RestTemplate rt;
//当调用远程服务失败,跳转到指定的方法执行降级代码
@HystrixCommand(fallbackMethod = "getItemsFB")
@GetMapping("/item-service/{orderId}")
public JsonResult<List<Item>> getItems(@PathVariable String orderId){
//使用远程调用工具RestTemplate,远程调用商品服务
//http://localhost:8001/{orderId}
//{1}-RestTemplate定义的一种占位符格式
return rt.getForObject("http://item-service:8001/{1}", JsonResult.class,orderId);
}
@HystrixCommand(fallbackMethod = "decreaseNumberFB")
@PostMapping("/item-service/decreaseNumber")
public JsonResult<?> decreaseNumber(@RequestBody List<Item> items){
return rt.postForObject("http://item-service/decreaseNumber",
items, JsonResult.class);
}
@HystrixCommand(fallbackMethod = "getUserFB")
@GetMapping("/user-service/{userId}")
public JsonResult<User> getUser(@PathVariable Integer userId){
return rt.getForObject("http://user-service/{1}", JsonResult.class,userId);
}
@HystrixCommand(fallbackMethod = "addScoreFB")
@GetMapping("/user-service/{userId}/score")
public JsonResult<?> addScore(@PathVariable Integer userId,Integer score){
return rt.getForObject("http://user-service/{1}/sroce?score={2}", JsonResult.class,userId,score);
}
@HystrixCommand(fallbackMethod = "getOrderFB")
@GetMapping("/order-service/{orderId}")
public JsonResult<Order> getOrder(@PathVariable String orderId){
return rt.getForObject("http://order-service/{1}",JsonResult.class,orderId );
}
@HystrixCommand(fallbackMethod = "addOrderFB")
@GetMapping("/order-service/")
public JsonResult<?> addOrder(){
return rt.getForObject("http://order-service/", JsonResult.class);
}
public JsonResult<List<Item>> getItemsFB(String orderId){
return JsonResult.err().msg("获取订单商品列表失败");
}
public JsonResult<?> decreaseNumberFB(List<Item> items){
return JsonResult.err().msg("减少商品库存失败");
}
public JsonResult<User> getUserFB(Integer userId){
return JsonResult.err().msg("获取订单用户失败");
}
public JsonResult<?> addScoreFB(Integer userId,Integer score){
return JsonResult.err().msg("添加用户积分失败");
}
public JsonResult<Order> getOrderFB(String orderId){
return JsonResult.err().msg("获取订单失败");
}
public JsonResult<?> addOrderFB(){
return JsonResult.err().msg("添加订单失败");
}
}
4.测试
启动eureka服务器,启动测试服务器,不启动订单服务器
操作:通过测试服务器连接未启动的订单服务器
获取订单失败。测试成功!
Hystrix超时
Hystrix有默认的超时时间:1秒
hystrix超时时间配置:
在yml配置文件中配置(默认1秒)
#配置hystrix超时时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 500
Hystrix超时要大于ribbon总的重试时间,否则,ribbon重试可能无效
Hystrix 熔断
断路器打开的条件:
- 10秒内20次请求(必须首先满足)
- 50%失败,执行了降级代码
断路器打开后,所有请求直接执行降级代码
断路器打开几秒后,会进入半开状态,客户端调用会尝试向后台服务发送一次调用,
如果调用成功,断路器可以自动关闭,恢复正常
如果调用仍然失败,继续保持打开状态几秒钟
Hystrix 故障监控 - Hystrix Dashboard
Hystrix 利用 Actuator 工具,来暴露 Hystrix 的故障日志。
Actuator
springboot 提供的日志监控工具,可以暴露项目中多种监控信息
- 健康状态
- 系统环境变量
- spring容器中所有的对象
- spring mvc映射的所有路径
- …
添加 actuator
-
添加 actuator 依赖
在pom文件中使用快捷键alt+insert,使用edit Starters插件添加
-
yml 配置暴露监控数据
- m.e.w.e.i="*" :暴露所有的监控
- m.e.w.e.i=health :只暴露健康状态
- m.e.w.e.i=[“health”, “beans”, “mappings”] :暴露指定的多个监控
#配置故障监控,暴露的故障日志
management:
endpoints:
web:
exposure:
include: "*"
3.测试:
浏览器输入网址:localhost:3001/actuator 下面为暴露的各功能的信息
搭建 Hystrix Dashboard(仪表盘)
仪表盘项目可以是一个完全独立的项目,与其他项目都无关,也不用向注册表注册
-
hystrix dashboard 依赖
-
@EnableHystrixDashboard
-
yml - 允许对哪台服务器开启监控
hystrix:
dashboard:
proxy-stream-allow-list: localhost