当前位置: 首页 > 图灵资讯 > 技术篇> SpringCloud Alibaba入门5之Hystrix的使用

SpringCloud Alibaba入门5之Hystrix的使用

来源:图灵教育
时间:2023-06-26 15:48:56

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

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的使用_spring_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.开启hystrixxyml

feign:  hystrix:    # 打开hystrix    enabled: true

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

spring:  application:    # 服务名称    name: goods-service  cloud:    nacos:      discovery:        # nacos server地址        server-addr: 127.0.0.1:848.erver:  port: 8084feign:  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")@EnableHystrixpublic 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@Slf4jpublic 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 = 21474836472023-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:null2023-06-26 09:41:20.878  INFO 5848 --- [stock-service-1] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater polingSerlistupdater2023-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@3e164f682023-06-26 09:41:20.954 ERROR 5848 --- [stock-service-1] c.e.mymall.feign.StockClientFallback     : 库存服务-库存功能的添加不可用

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

SpringCloud Alibaba入门5之Hystrix的使用_xml_05

在没有新库存数据的情况下,我们将更新库存数据表。

SpringCloud HystrixAlibaba入门5的使用_spring_06

,这可以使我们的系统在服务没有启动或故障的情况下继续正常运行,即使它被调用。

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