我们继续在前一章的基础上进行学习。
https://blog.51cto.com/u_13312531/6546544
使用目的:上一章我们已经使用OpenFeign完成了服务间的调用,如果现在存在大量的服务,每个服务有若干个节点,其中一个节点发生故障,加入的请求一直阻塞,大量堆积的请求会把服务打崩,可能导致级联式的失败,甚至整个链路失败,这就是所谓的服务雪崩,严重可能导致系统挂掉。为了避免这种情况的出现,我们需要采取必要的容错保护机制。
一、简介
Hystrix是Netflix的一个重要组件,提供了断路器、资源隔离与自我修复功能。Hystrix作为断路器,可以阻止级联失败。
二、问题出现
继续使用上一章的开发环境,正常情况下两个服务都成功开启。
现在我们把库存服务关闭后再请求商品服务的功能,由于商品服务中使用到了库存服务的请求,我们看看是否会报错。
1.我们先关闭库存服务。
2.然后我们继续使用Postman进行测试。
我们发现接口没有正常返回数据,返回了没有找到库存服务的异常信息。
三、如何处理
我们实现的效果就是即使服务被意外关闭了,即使这个服务继续被调用,仍可以让整个系统正常运行下去。
接下来我们使用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上进行添加商品的测试:
发现添加商品的接口成功请求成功了,但是我们没有启动库存模块,控制台打印了库存服务的添加库存可不用的提示
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 : 库存服务-添加库存功能不可用
我们刷新数据表,发现新增了商品数据。
我们再刷新下库存数据表,没有新增库存数据。
,这样可以让我们的系统在某个服务没有启动或者出故障的时候,即使被调用也不会出现异常的情况,继续让系统正常运行下去。
好了,我们的Hystrix就实现了断路器的功能。
标签:service,Hystrix,SpringCloud,springframework,Alibaba,import,org,cloud,stock From: https://blog.51cto.com/u_13312531/6551729