SpringCloud(三):Hystrix的降级和熔断机制

SpringCloud(三):Hystrix的降级和熔断机制_第1张图片

Hystrix

系统容错工具

  • 降级
    • 调用远程服务失败(宕机、500错、超时),可以降级执行当前服务中的一段代码,向客户端返回结果
    • 快速失败
  • 熔断
    • 当访问量过大,出现大量失败,可以做过热保护,断开远程服务不再调用
    • 限流
    • 防止故障传播、雪崩效应

降级

  1. hystrix依赖
    在pom文件中使用快捷键alt+insert,使用edit Starters插件添加
    SpringCloud(三):Hystrix的降级和熔断机制_第2张图片
    SpringCloud(三):Hystrix的降级和熔断机制_第3张图片

  2. 启动类添加注解 @EnableCircuitBreaker
    SpringCloud(三):Hystrix的降级和熔断机制_第4张图片

  3. 添加降级代码

// 当调用远程服务失败,跳转到指定的方法,执行降级代码
@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服务器,启动测试服务器,不启动订单服务器
操作:通过测试服务器连接未启动的订单服务器
SpringCloud(三):Hystrix的降级和熔断机制_第5张图片
获取订单失败。测试成功!

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 的故障日志。
SpringCloud(三):Hystrix的降级和熔断机制_第6张图片

Actuator

springboot 提供的日志监控工具,可以暴露项目中多种监控信息

  • 健康状态
  • 系统环境变量
  • spring容器中所有的对象
  • spring mvc映射的所有路径

添加 actuator

  1. 添加 actuator 依赖
    在pom文件中使用快捷键alt+insert,使用edit Starters插件添加
    SpringCloud(三):Hystrix的降级和熔断机制_第7张图片

  2. 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 下面为暴露的各功能的信息
SpringCloud(三):Hystrix的降级和熔断机制_第8张图片

搭建 Hystrix Dashboard(仪表盘)

仪表盘项目可以是一个完全独立的项目,与其他项目都无关,也不用向注册表注册

  1. hystrix dashboard 依赖

  2. @EnableHystrixDashboard
    SpringCloud(三):Hystrix的降级和熔断机制_第9张图片

  3. yml - 允许对哪台服务器开启监控

hystrix:
  dashboard:
    proxy-stream-allow-list: localhost

你可能感兴趣的:(spring,cloud,分布式,spring,spring,cloud,java,spring,boot)