首页 > 其他分享 >SpringCloud Alibaba入门5之Hystrix的使用

SpringCloud Alibaba入门5之Hystrix的使用

时间:2023-06-26 10:02:16浏览次数:54  
标签:service Hystrix SpringCloud springframework Alibaba import org cloud stock

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

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

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

一、简介

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

二、问题出现

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

SpringCloud Alibaba入门5之Hystrix的使用_spring

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

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

SpringCloud Alibaba入门5之Hystrix的使用_xml_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的使用_xml_06

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

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

标签:service,Hystrix,SpringCloud,springframework,Alibaba,import,org,cloud,stock
From: https://blog.51cto.com/u_13312531/6551729

相关文章

  • 【SpringCloud】Hystrix
    目录1.前言1.1什么是服务雪崩?1.2怎么解决服务雪崩2.Hystrix快速入门2.1Hystrix+OpenFeign2.1.1服务提供者2.1.2服务消费者2.1.3测试2.2Hystrix+Ribbon3.Hystrix的常用配置......
  • SpringCloud学习(三)
    微服务应用参考:https://blog.csdn.net/qq_25928447/article/details/124198071?spm=1001.2014.3001.5501分布式权限校验回顾之前进行权限校验的原理,服务器是如何判定一个请求是来自哪个用户的:首先浏览器会向服务端发送请求,访问网站。服务端收到请求后,会创建一个SESSION......
  • SpringCloud Alibaba入门3之nacos服务搭建
    我们继续在上一章的基础上学习。https://blog.51cto.com/u_13312531/6539601一、下载nacos-server从https://github.com/alibaba/nacos/releasesopeninnewwindow 下载nacos-server发行版。我们使用1.4.2版本二、启动nacos进入%path%\nacos\bin文件夹,执行cmd命令startup.cmd-m......
  • springcloud项目启动后立即停止
    刚学完springcloud,只看了一遍课没有动手实践,现在第一次自己动手操作的时候不知道该选哪些依赖该怎么配置。依赖全选上后因为各自配置问题运行不起来,只能先从最简单的开始慢慢加依赖。这次只选了nacos和feign,成功运行,项目也没有报错,但是运行后项目立马停止。 百度了一下原因......
  • SpringCloud Alibaba入门2-common模块和user模块的基本开发
    我们使用上一章节的项目环境进行开发。https://blog.51cto.com/u_13312531/6536187一、父项目引入SpringBoot我们在父项目pom文件中统一管理引入的jar包的版本。我们采用父项目中以depencyMangement方式引入spring-boot,子项目依赖parent父配置即可。<?xmlversion="1.0"encoding="......
  • 【2】springCloud 2021 中间件基本使用方法
    RabbitMQBroker异步调用好处:吞吐量提升:无需等待订阅者处理完成,响应更快速故障隔离:服务没有直接调用,不存在级联失败问题调用间没有阻塞,不会造成无效的资源占用耦合度极低,每个服务都可以灵活插拔,可替换流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自......
  • SpringCloud Alibaba入门1-创建多模块工程
    一、创建父项目创建一个Maven的父项目,命名为mymall用于管理子项目。项目创建完成后,删除src目录和在pom.xml文件里面设置packing的方式为pom,管理其他子模块的依赖。删除之后的项目结构为:二、创建子module在父项目上右键,新建module,命令为mymall-common,然后创建子模块创建子模块成......
  • SpringCloud依赖问题:spring-cloud-starter-eureka-server 和 spring-cloud-starter-ne
    学习SpringCloud微服务时,很多资料上都写的是spring-cloud-starter-eureka-server,结果问题无法正常启动,这是因为与当前的SpringBoot版本不匹配。其实较新的版本应该使用spring-cloud-starter-netflix-eureka-server依赖。PS:SpringCloud的版本不兼容好坑。......
  • 七、Spring Cloud Alibaba Sentinel简介
    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。一、特性丰富......
  • SpringCloud WebUploader 分块上传
    ​ 第一点:Java代码实现文件上传FormFilefile=manform.getFile();StringnewfileName= null;Stringnewpathname= null;StringfileAddre= "/numUp";try{    InputStreamstream=file.getInputStream();// 把文件读入    StringfilePath=request.......