首页 > 其他分享 >OpenFeign 降级

OpenFeign 降级

时间:2022-10-31 13:57:37浏览次数:72  
标签:降级 调用 服务 OpenFeign fallback 异常 public

一、场景

服务间相互调用时,分为服务调用方与服务提供方两个角色。今天我们所解决的问题就是在服务提供方发生超时或者异常(比如 400、500 Error Code)的时候,自动执行的一段业务逻辑,比如执行一段兜底逻辑将服务请求从失败状态中恢复,如何友好的将错误信息返回给调用方,如何将错误信息log输出,方便定位问题。

二、定义与分析

OpenFeign 对服务降级的支持是借助 Hystrix 组件实现的。 OpenFeign 支持两种不同的方式来指定降级逻辑,一种是定义 fallback 类,另一种是定义 fallback 工厂。这个的区别在于如果你想要在降级方法中获取到异常的具体原因,那么你就要借助 fallback 工厂的方式来指定降级逻辑了。   异常传递? 在找解决方案过程中要有demo 正常情况下当被调用服务返回response的status不等于200,就会进入到feign.codec.ErrorDecoder#decode方法中,这里会抛出一个RetryableException异常,自动进入fallback   而我们的系统都会把异常封装为200 首先对inner方法出现异常情况进行特殊处理,不再走全局gloable而是返回应该有的httpStatus状态

三、解决方案

轻量级方案: 1、服务提供方 (1)由于 Hystrix 已经从 Spring Cloud 组件库中被移除,所以我们需要在 pom 文件中手动添加 hystrix 项目的依赖。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.10.RELEASE</version>
    <exclusions>
        <!-- 移除Ribbon负载均衡器,避免冲突 -->
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>

 

(2)定义降级为开启状态: (3)抽象工厂 create 方法的入参是一个 Throwable 对象。这样一来,我们在降级方法中就可以获取到原始请求的具体报错异常信息了。
@FeignClient(value = "coupon-template-serv", path = "/template",
        // 通过抽象工厂来定义降级逻辑
        fallbackFactory = TemplateServiceFallbackFactory.class)
public interface TemplateService {
        // ... 省略方法定义
}
@Slf4j
@Component
public class TemplateServiceFallbackFactory implements FallbackFactory<TemplateService> {

    @Override
    public TemplateService create(Throwable cause) {
        // 使用这种方法你可以捕捉到具体的异常cause
        return new TemplateService() {

            @Override
            public CouponTemplateInfo getTemplate(Long id) {
                log.info("fallback factory method test");
                return null;
            }

            @Override
            public Map<Long, CouponTemplateInfo> getTemplateInBatch(Collection<Long> ids) {
                log.info("fallback factory method test");
                return Maps.newHashMap();
            }
        };
    }
}
2、服务调用方 (1)要指定降级服务所在位置@Component加载范围 在SpringBootApplication注解内有ComponentScan注解可以设定加载范围 重量级方案: 通过 Spring Cloud Alibaba 的组件 Sentinel 搭建中心化的服务容错控制逻辑,这是一种重量级的服务容错手段。 我们做技术选型的时候也要考虑开发成本和维护成本。 比如像 Sentinel 这类中心化的服务容错控制台,它的功能固然强大,各种花式玩法它都考虑到了。但相对应地,如果在项目中引入 Sentinel,在运维层面你要多维护一个 Sentinel 服务集群,并且在代码中接入 Sentinel 也是一个成本项。如果只需要一些简单的降级功能,那 OpenFeign+Hystrix 的 Client 端降级方案就完全可以满足要求,我认为没必要拿大炮打苍蝇,过于追求一步到位的高大上方案。

四、验证

1、验证方式 (1)模拟被调用方抛出异常(模拟一个空指针(500)) (2)模拟被调用方抛出异常(模拟一个feign无法找到服务(404)) (3)模拟被调用方抛出异常(模拟一个业务异常) (4)模拟被调用方超时场景 2、验证结果 (1)(3)(4)处理完毕

五、参考资料(链接、截图、文字引用)

极客时间课程:https://time.geekbang.org/column/article/477297 https://cloud.tencent.com/developer/article/1600700 https://blog.csdn.net/qq_34357199/article/details/103485171  

标签:降级,调用,服务,OpenFeign,fallback,异常,public
From: https://www.cnblogs.com/xcgShare/p/16843988.html

相关文章

  • SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控
    文章目录​​一、概念:服务雪崩​​​​二、什么是Hystrix​​​​三、服务熔断​​​​概述​​​​实验​​​​第一步:创建服务提供者springcloud-provider-dept-hystrix-8......
  • OpenFeign和Ribbon的过期时间
    在openfeign之前的版本中集成了ribbon,并且openfeign和ribbon都有超时时间,那在项目中具体以哪个超时时间为准,我们一探究竟首先是依赖的版本:<dependency><groupId>com.......
  • 【分布式】-- 基于Nacos、OpenFeign搭建的微服务抽奖系统后台小案例
    1.项目介绍最近入项目之前要求熟悉一下SpringCloudNacos微服务基于Feign接口调用并整合Swagger2进行接口文档展示给前端,所以自己按照要求来编写并整合了一套基于SpringClou......
  • sentinel中如何使用@SentinelResource和openFeign来进行服务熔断和降级的操作
    今天我们就来好好说一下,sentinel中如何使用@SentinelResource和openFeign来进行服务熔断和降级的操作SentinelResource在上一节中,我们也使用到过这个注解,我们需要了解的......
  • spring cloud Alibaba 集成openfeign 和 loadbalancer
    springcloudAlibaba集成openfeign和loadbalancer1.1引入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring......
  • Sentinel(三)--熔断降级
    熔断是一种系统保护措施,就是当系统的某些阈值触发到设定的临界点时,所触发的行为方式,熔断的概念在很多地方都有听到。股市熔断,比如美股在7%、13%、20%的时候会分别触发熔......
  • OpenFeign 使用
    一、调用方Client1. 创建Springboot项目,并注册到服务注册中心2. 应用OpenFeign依赖3. 启动类添加注解@EnableFeignClients4. 创建接口+@F......
  • SpringBoot引入OpenFeign,不使用注册中心
    转自:https://blog.csdn.net/wind_chasing_boy/article/details/123822427(做了部分修改)【前言】最近接到一个需求,需要对接第三方平台的api,在设计方案通过之后,打算将对接服......
  • yum downgrade降级安装包
    问题安装gccgcc-c++make等编译包,提示glibc错误依赖-->FinishedDependencyResolutionError:Package:glibc-headers-2.17-317.el7.x86_64(centos7)R......
  • openfeign替换httpclient
    openfein是springcloud的一个服务间调用组件,这边文档介绍使用openfeign代替HttpClient调用远程服务1.创建一个springboot服务RemoteServiceapplication.propertiesse......