文章目录

  • 1. 概述
  • 2. 使用
  • 2.1 服务熔断 - 控制器发生异常触发熔断
  • 2.2 服务降级 - 服务提供商依赖的服务岩机触发


1. 概述

Hystrix

  1. 作用:具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大功能。

雪崩效应

因为一个服务处理缓慢,而导致依赖的服务一同缓慢 - 所谓牵一发而动全身

服务熔断 - Controller层 - 服务故障( 服务提供者异常 )

  1. 当某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路 - 应对雪崩效应。
  2. Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制
  3. 满足条件的时候,会返回预先设置的数据,而不是无限期的等待 - 最外层做保护
  4. 例子:某个窗口因为电脑坏了,导致不能进行登记工作。但是该窗口的业务并没有关掉。每当有人过来该窗口进行办理业务的时候。窗口负责人都会说:“电脑发生了故障,今天不能办理业务,明天在来吧!”


服务降级 - 消费者端调用点进行处理( Feign发送请求处进行处理 )- 某些接口不提供,减少服务器负荷(服务消费者 需要消费的 服务提供者岩机)

  1. 服务内部出错,返回预先准备的数据
  2. 例子:某个窗口无人访问。但另一个窗口一直有人访问忙不过来。则公司暂时关掉无人访问的窗口。负责该窗口的人去帮助其他忙不过来的窗口
  3. 例子:订单服务 需要向 产品服务请求获取数据,产品服务关掉服务器导致不能获取数据,以致于订单服务需要使用到降级的数据

2. 使用

2.1 服务熔断 - 控制器发生异常触发熔断

步骤1 - 添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

步骤2 - 配置文件

eureka:
  client:
    #将可用区映射到与eureka服务器通信的完全限定URL列表
    service-url:
      defaultZone: http://127.0.0.1:1111/eureka/

  instance:
    #获取要注册到eureka的该实例的唯一ID(在appName范围内) -- 默认为服务名+端口号。
    instance-id: orderService
    # 表示在猜测主机名时,服务器的IP地址应用于参考操作系统报告的主机名的标志。 -eureka中介存储Ip地址
    prefer-ip-address: true

#    register-with-eureka: false
#    fetch-registry: false

server:
  port: 3030
spring:
  application:
    name: orderService

  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/springcloud?serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver


mybatis:
  type-aliases-package: top.linruchang.order_service.domain
  configuration:
    cache-enabled: true
    lazy-loading-enabled: true
  mapper-locations: classpath:/mapper/*Mapper.xml


# 订单服务 请求 产品服务数据的超时时间设置 - 则可能会触发SpringCLoud自身的熔断处理,如果你有自己设置熔断机制的数据,则会返回熔断机制的数据
productService:
  ribbon:
    # 服务与服务之间的连接、读取时间
    ConnectTimeout: 10000
    ReadTimeout: 10000


# 设置请求服务提供者等待几秒后触发熔断机制,优先级比上面超时时间高,建议跟Ribbon设置的时间一致
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 6000


# 服务降级启动 - 关键
feign:
  hystrix:
    enabled: true

步骤3 - 服务提供者启动类添加注解@EnableCircuitBreaker

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker
public class OrderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }

}

步骤4 - 准备熔断的数据,控制器添加注解@HystrixCommand(fallbackMethod=“熔断数据方法”)

@Controller
@RequestMapping("books")
public class BookController {    
    
    // 形参、返回值必须与控制器一致
    public JsonModel addFallbackMethod(@PathVariable("id") Integer id) {

        JsonModel jsonModel = new JsonModel();
        jsonModel.setMsg("发生错误,熔断开启:请求地址含有" + id);
        return  jsonModel;
    }



    @PostMapping("{id}")
    @ResponseBody
    @HystrixCommand(fallbackMethod="addFallbackMethod")
    public JsonModel add(@PathVariable("id") Integer id) {

//        用来测试Hystrix熔断机制 - 如果运行到这里发生异常,没有熔断机制的话。服务异常,浏览器访问到的是错误页面。但有熔断机制,服务异常,则有返回addFallbackMethod这个方法的数据
        int a = 1/id;

        JsonModel jsonModel = new JsonModel();

        jsonModel.setSuccess(bookService.add(book) == 1);
        jsonModel.setMsg(jsonModel.getSuccess() ? "下单成功":"下单失败");


        return jsonModel;

    }
}


浏览器访问:books/0 时,则返回addFallbackMethod的数据

springcloud熔断和降级的区别_SpringCloud

2.2 服务降级 - 服务提供商依赖的服务岩机触发

步骤1 - 添加依赖,跟服务熔断一样


步骤2 - 配置文件抄上面的即可,关键是启动服务 降级feign.hystrix.enabled=true


步骤3 - 启动类添加@EnableCircuitBreaker注解


步骤4 - 准备降级数据

springcloud熔断和降级的区别_SpringCloud_02


订单服务控制器 - 需要获取产品服务的数据

@Controller
@RequestMapping("books")
public class BookController {   
    @GetMapping("testDemotion")
    @ResponseBody
    public Product testDemotion() {
        return productServiceClient.queryById(1);
    }
}


产品服务的接口

// 该注解不但指定产品服务名、而且还要指定产品服务的降级类ProductServiceClientFallback
@FeignClient(name="productService", fallback = ProductServiceClientFallback.class)
public interface ProductServiceClient {

    @GetMapping(value = "products/{id}")
    @ResponseBody
    public Product queryById(@PathVariable("id") Integer id);

    @RequestMapping(value = "products/", method = RequestMethod.GET)
    @ResponseBody
    public List<Product> listUI();

}


服务降级的数据 - 即产品数据岩机或关机后则返回这里的数据

@Component
public class ProductServiceClientFallback implements ProductServiceClient {

    @Override
    public Product queryById(Integer id) {

        Product product = new Product();
        product.setName("服务降级成功");
        return product;
    }

    @Override
    public List<Product> listUI() {
        return null;
    }

}


步骤5 - 测试 - 注册测试时需要关闭产品服务才能触发服务降级

springcloud熔断和降级的区别_Hystrix_03