SpringCloud Alibaba入门5之Hystrix的使用

我们继续在前一章的基础上进行学习。

SpringCloud Alibaba入门5之使用OpenFegin调用服务_qinxun2008081的博客-CSDN博客

上一节我们已经使用OpenFeign完成了服务间的调用,如果现在存在大量的服务,每个服务有若干个节点,其中一个节点发生故障,加入的请求一直阻塞,大量堆积的请求会把服务打崩,可能导致级联式的失败,甚至整个链路失败,这就是所谓的服务雪崩,严重可能导致系统挂掉。为了避免这种情况的出现,我们需要采取必要的容错保护机制。

一、Hystrix简介

Hystrix是Netflix的一个重要组件,提供了断路器、资源隔离与自我修复功能。Hystrix作为断路器,可以阻止级联失败。

二、问题出现

我们只启动商品模块,没有启动库存服务,然后调用商品模块中添加商品的接口,看看是否会正常运行。

SpringCloud Alibaba入门5之Hystrix的使用_第1张图片

 我们调用添加商品的测试

SpringCloud Alibaba入门5之Hystrix的使用_第2张图片

 发现我们的库存服务没有启动,造成整个系统没有正常运行。

三、Hystrix使用

1.添加依赖

我们在商品模块中添加hystrix的依赖



    org.springframework.cloud
    spring-cloud-starter-netflix-hystrix

2.在商品模块的application.yml中开启hystrix

spring:
  application:
    name: goods-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
server:
  port: 8084

feign:
  hystrix:
    # 开启hystrix
    enabled: true

3.在商品模块启动类中添加@EnableHystrix注解,让系统支持hystrix功能

package com.example.myshop;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @author qx
 * @date 2023/06/23
 * @desc 商品模块启动类
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.example.myshop")
@EnableHystrix
public class MyShopGoodsApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyShopGoodsApplication.class, args);
    }
}

4.创建一个StockClientFallback类,实现StockClientFeign接口,这个类用来实现Feign客户端远程调用失败的回调处理

package com.example.myshop.feign;

import com.example.myshop.entity.Stock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @author qx
 * @date 2023/06/23
 * @desc 库存服务异常回调类
 */
@Component
@Slf4j
public class StockClientFallback implements StockClientFeign {
    @Override
    public Long addStock(Stock stock) {
        log.error("库存服务-添加库存功能不可用");
        return 0L;
    }

    @Override
    public Integer getInventoryByGoodsId(Long goodsId) {
        log.error("库存服务-获取库存的功能不可用");
        return 0;
    }
}

5.然后在之前配置的Feign客户端中添加回调的属性,在fallback中添加Feign调用自定义失败回调类

类似:@FeignClient(value="stock-service",fallback=StockClientFallback.class)

package com.example.myshop.feign;

import com.example.myshop.entity.Stock;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * 库存服务feign客户端
 */
@FeignClient(value = "stock-service",fallback = StockClientFallback.class)
public interface StockClientFeign {

    /**
     * 调用添加库存的接口
     */
    @PostMapping("/stock/add")
    Long addStock(@RequestBody Stock stock);


    /**
     * 调用根据商品ID获取库存量接口
     *
     * @param goodsId 商品ID
     * @return 库存数量
     */
    @GetMapping("/stock/getinventory/{goodsId}")
    Integer getInventoryByGoodsId(@PathVariable("goodsId") Long goodsId);

}

四、测试

我们启动商品模块,但是没有像往常一样启动库存模块,这个时候我们调用商品模块的添加商品功能,看看调用库存模块的添加库存功能是否会影响系统的运行。

我们继续调用添加商品的测试

SpringCloud Alibaba入门5之Hystrix的使用_第3张图片

发现添加商品的接口成功请求成功了,但是我们没有启动库存模块,控制台打印了库存服务的添加库存可不用的提示 

SpringCloud Alibaba入门5之Hystrix的使用_第4张图片

我们刷新数据表,发现新增了商品数据

SpringCloud Alibaba入门5之Hystrix的使用_第5张图片

 

这样可以让我们的系统在某个服务没有启动或者出故障的时候,即使被调用也不会出现异常的情况,继续让系统正常运行下去。 

好了,我们的Hystrix就实现了断路器的功能。

你可能感兴趣的:(SpringCloud,spring,cloud,hystrix,spring)