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

https://blog.51cto.com/u_13312531/6546544

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

一、简介

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

二、问题出现

继续使用上一章的开发环境,正常情况下两个服务都成功开启。

SpringCloud Alibaba入门5之Hystrix的使用_spring

现在我们把库存服务关闭后再请求商品服务的功能,由于商品服务中使用到了库存服务的请求,我们看看是否会报错。

1.我们先关闭库存服务。

SpringCloud Alibaba入门5之Hystrix的使用_maven_02

2.然后我们继续使用Postman进行测试。

SpringCloud Alibaba入门5之Hystrix的使用_maven_03

我们发现接口没有正常返回数据,返回了没有找到库存服务的异常信息。

三、如何处理

我们实现的效果就是即使服务被意外关闭了,即使这个服务继续被调用,仍可以让整个系统正常运行下去。

接下来我们使用Hystrix来解决这种问题,我们需要在商品模块进行如下处理:

1.添加依赖

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

完整的pom文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.example</groupId>
        <artifactId>mymall</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>mymall-goods</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>mymall-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--cloud相关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
        <!--OpenFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>
</project>

2.在application.yml中开启hystrix

feign:
  hystrix:
    # 开启hystrix
    enabled: true

完整的application.yml文件如下所示:

spring:
  application:
    # 服务名称
    name: goods-service
  cloud:
    nacos:
      discovery:
        # nacos server地址
        server-addr: 127.0.0.1:8848
server:
  port: 8084
feign:
  hystrix:
    # 开启hystrix
    enabled: true

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

package com.example.mymall;

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/25
 * @desc 商品模块启动类
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.example.mymall")
@EnableHystrix
public class MyMallGoodsApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyMallGoodsApplication.class, args);
    }
}

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

package com.example.mymall.feign;

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

/**
 * @author qx
 * @date 2023/06/26
 * @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中调用自定义异常回调类

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

package com.example.mymall.feign;

import com.example.mymall.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;

/**
 * @author qx
 * @date 2023/06/25
 * @desc 库存服务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);

}

四、测试

我们继续使用前面的服务环境,商品服务重新开启,库存服务关闭。

现在我们继续在Postman上进行添加商品的测试:

SpringCloud Alibaba入门5之Hystrix的使用_spring_04

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

Hibernate: insert into t_goods (create_time, description, goods_name, price, update_time) values (?, ?, ?, ?, ?)
2023-06-26 09:41:20.826  INFO 5848 --- [stock-service-1] c.netflix.config.ChainedDynamicProperty  : Flipping property: stock-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2023-06-26 09:41:20.870  INFO 5848 --- [stock-service-1] c.netflix.loadbalancer.BaseLoadBalancer  : Client: stock-service instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=stock-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2023-06-26 09:41:20.878  INFO 5848 --- [stock-service-1] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
2023-06-26 09:41:20.889  INFO 5848 --- [stock-service-1] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client stock-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=stock-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:org.springframework.cloud.alibaba.nacos.ribbon.NacosServerList@3e164f68
2023-06-26 09:41:20.954 ERROR 5848 --- [stock-service-1] c.e.mymall.feign.StockClientFallback     : 库存服务-添加库存功能不可用

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

SpringCloud Alibaba入门5之Hystrix的使用_spring_05

我们再刷新下库存数据表,没有新增库存数据。

SpringCloud Alibaba入门5之Hystrix的使用_maven_06

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

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring