【OpenFeign】 集成 Hystrix 基础

Metadata

title: 【OpenFeign】 集成 Hystrix 基础
date: 2023-01-02 19:15
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/OpenFeign/生态/Hystrix
categories:
  - OpenFeign
keywords:
  - OpenFeign
description: 【OpenFeign】 集成 Hystrix 基础

【OpenFeign】 集成 Hystrix 基础

服务雪崩效应及容错方案

可以看下文档,了解下熔断降级的相关概念和重要性。

github

Hystrix 状态

Hystrix 不再处于积极开发阶段,目前处于维护模式。

Hystrix(版本 1.5.18)足够稳定,可以满足 Netflix 对我们现有应用程序的需求。

可以从版本发布看到,自从 2018 年来,已经停止更新了,但是目前还是可用,而且 Spring Cloud Open Feign 也是从 2020.X 版本才移除这些组件,其他类似 Sentinel 限流组件的使用方式也差不多,所以这里还是看下 Hystrix 怎么使用的。

Hystrix 有什么用?

Hystrix 旨在执行以下操作:

  • 通过第三方客户端库访问(通常通过网络)的依赖项,提供对延迟和故障的保护和控制。
  • 解决复杂分布式系统中的级联故障。
  • 快速失败并快速恢复。
  • 在可能的情况下回退并优雅地降级。
  • 实现近乎实时的监控、警报和操作控制。

低版本的 Open Feign默认引入了Hystrix包,主需要配置就可以开启了:

feign:
  hystrix:
    enabled: true

在配置 Feign 客户端配置Hystrix时,可以指定fallback或者fallbackFactory

方式 1 直接实现 Feign 客户端接口

直接写一个类实现 Feign 客户端接口,重写方法,这些方法在发生熔断时,会返回方法中的返回值给客户端。

直接直接返回了 Null ,实际开发中,应该封装统一的熔断结果集。

@Component
public class HystrixOrderFeign implements OrderFeign {

    @Override
    public List<Order> insertOrder(Long accountId, String commodityCode, Long count, Long money) {
        return null;
    }

    @Override
    public Order post(Order order) {
        return null;
    }
}

然后在@FeignClient中指定fallback属性为上面的类即可。

@FeignClient(name = "order-service", fallback = HystrixOrderFeign.class)

方式 2 实现 FallbackFactory 接口

还通过实现FallbackFactory接口,指定泛型为 Fegn 接口,然后实现其方法。使用工厂类,可以获取到当前发生的异常信息。

@Component
public class OrderFeignFallbackFactory implements FallbackFactory<OrderFeign> {
    @Override
    public OrderFeign create(Throwable throwable) {
        return new OrderFeign() {
            @Override
            public List<Order> insertOrder(Long accountId, String commodityCode, Long count, Long money) {
                return null;
            }
            @Override
            public Order post(Order order) {
                return null;

            }
        };
    }
}

然后配置下fallbackFactory属性就可以了。

@FeignClient(name = "order-service", configuration = {BBB.class}, fallbackFactory = OrderFeignFallbackFactory.class)