我们继续在前一章的基础上进行学习。
SpringCloud Alibaba入门5之使用OpenFegin调用服务_qinxun2008081的博客-CSDN博客
上一节我们已经使用OpenFeign完成了服务间的调用,如果现在存在大量的服务,每个服务有若干个节点,其中一个节点发生故障,加入的请求一直阻塞,大量堆积的请求会把服务打崩,可能导致级联式的失败,甚至整个链路失败,这就是所谓的服务雪崩,严重可能导致系统挂掉。为了避免这种情况的出现,我们需要采取必要的容错保护机制。
Hystrix是Netflix的一个重要组件,提供了断路器、资源隔离与自我修复功能。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);
}
我们启动商品模块,但是没有像往常一样启动库存模块,这个时候我们调用商品模块的添加商品功能,看看调用库存模块的添加库存功能是否会影响系统的运行。
我们继续调用添加商品的测试
发现添加商品的接口成功请求成功了,但是我们没有启动库存模块,控制台打印了库存服务的添加库存可不用的提示
我们刷新数据表,发现新增了商品数据
这样可以让我们的系统在某个服务没有启动或者出故障的时候,即使被调用也不会出现异常的情况,继续让系统正常运行下去。
好了,我们的Hystrix就实现了断路器的功能。