文档章节

Spring Cloud Feign+Hystrix自定义异常处理

o
 osc_zoa3moe9
发布于 2019/12/08 02:27
字数 615
阅读 22
收藏 0

精选30+云产品,助力企业轻松上云!>>>

##开启Hystrix

spring-cloud-dependencies Dalston版本之后,默认Feign对Hystrix的支持默认是关闭的,需要手动开启。

feign.hystrix.enabled=true

开启hystrix,可以选择关闭熔断或超时。 关闭熔断:

# 全局关闭熔断:
hystrix.command.default.circuitBreaker.enabled: false
# 局部关闭熔断:
hystrix.command.<HystrixCommandKey>.circuitBreaker.enabled: false

设置超时:

# 全局设置超时:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 1000
# 局部设置超时:
hystrix.command.<HystrixCommandKey>.execution.isolation.thread.timeoutInMilliseconds: 1000

关闭超时:

# 全局关闭:
hystrix.command.default.execution.timeout.enabled: false
# 局部关闭:
hystrix.command.<HystrixCommandKey>.execution.timeout.enabled: false

##Fallback

fallback 是 Hystrix 命令执行失败时使用的后备方法,用来实现服务的降级处理逻辑。在 HystrixCommand 中可以通过重载 getFallback() 方法来实现服务降级逻辑,Hystrix 会在 run() 执行过程中出现错误、超时、线程池拒绝、短路熔断等情况时,执行 getFallback() 方法内的逻辑。

通常,当 HystrixCommand 的主方法(run()) 中抛出异常时,便会触发 getFallback()。除了一个例外 —— HystrixBadRequestException。当抛出 HystrixBadRequestException,不论当前 Command 是否定义了 getFallback(),都不会触发,而是向上抛出异常。

如果实现业务时有一些异常希望能够向上抛出,而不是触发 Fallback 策略,便可以封装到 HystrixBadRequestException 中。

getFallback() 的执行时间并不受 HystrixCommand 的超时时间的控制。

Feign对异常的封装

通过实现FallbackFactory,可以在create方法中获取到服务抛出的异常。但是请注意,这里的异常是被Feign封装过的异常,不能直接在异常信息中看出原始方法抛出的异常。

1.自定义error decoder,不进入熔断,保留原始报错信息,向上层抛出的方法。

package test.config;

import com.alibaba.fastjson.JSONObject;
import com.netflix.hystrix.exception.HystrixBadRequestException;
import feign.Response;
import feign.Util;
import feign.codec.ErrorDecoder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

public class NotBreakerConfiguration {
    @Bean
    public ErrorDecoder errorDecoder() {
        return new SpecialErrorDecoder();
    }
    /**
     * 自定义错误
     */
    public class SpecialErrorDecoder implements ErrorDecoder {
        private Logger logger = LoggerFactory.getLogger(getClass());
        @Override
        public Exception decode(String methodKey, Response response) {
            Exception exception = null;
            try {
                String json = Util.toString(response.body().asReader());
                exception = new RuntimeException(json);
                JsonResult result = JSONObject.parseObject(json, JsonResult.class);
                // 业务异常包装成 HystrixBadRequestException,不进入熔断逻辑
                if (!result.isSuccess()) {
                    exception = new HystrixBadRequestException(result.getMessage());
                }
            } catch (IOException ex) {
                logger.error(ex.getMessage(), ex);
            }
            return exception;
        }
    }
}

2.为FeignClient指定error decoder,二选一:

  1. 在client中指定
@FeignClient(name = "service-name", 
fallbackFactory = TestServiceFallback.class, 
configuration = {NotBreakerConfiguration.class})
public interface TestService {
    // 省略
}
  1. 在配置文件中指定
feign:
  client:
    config:
      servive-name:
        error-decoder: NotBreakerConfiguration

3.上层调用

package test;

import com.netflix.hystrix.exception.HystrixBadRequestException;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class TestServiceApi {

    public void withdraw() {
        try {
            // 省略feign client方法调用
        } catch (HystrixBadRequestException e) {
            // 原始错误信息
            log.info(e.getMessage());
        } catch (Exception e) {
            log.error("error", e);
        }
    }
}

参考: https://blog.csdn.net/lvyuan1234/article/details/77155919 https://juejin.im/post/5bae37ca5188255c652d4c6a https://my.oschina.net/xiaominmin/blog/2986631/print

o
粉丝 1
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
断路器Hystrix(Feign)

上一篇中我们讲了 断路器Hystrix(Ribbon) 本章讲解Feign+Hystrix已经Request请求传递,各种奇淫技巧…. - Hystrix Hystrix支持回退概念:当 打开或运行错误时,执行默认的代码,给定义一个...

osc_thcjzdd1
2019/04/16
2
0
spring cloud provider报“Error parsing HTTP request header”,feign端报“Read timed out“

这两天在调试spring cloud feign+hystrix报了如下错误: spring cloud provider报“Error parsing HTTP request header”,feign端报“Read timed out“ provider报错信息: 2018-06-20 18:......

osc_271igh42
2018/06/20
3
0
Java B2B2C o2o多用户商城 springcloud架构-docker-feign-hystrix(六)

简介 上一节我们讨论feign的配置,这节我们讨论一下,feign+hystrix调用生产者时,进行容错处理 一、创建模块(microservice-consumer-movie-feign-with-hystrix) 二、pom.xml文件 三、配置...

sccspuercode
2019/01/24
13
1
springcloud未完

1.spring案例开发,注册中心 <maven-jar-plugin.version>2.6</maven-jar-plugin.version> pom.xml 在主入口程序前加注解@EnableEurekaServer application.yml SpringCloud-HelloWorld案例开发......

architect刘源源
2019/07/15
11
0
集成源码深度剖析:Fescar x Spring Cloud

Fescar 简介 常见的分布式事务方式有基于 2PC 的 XA (e.g. atomikos),从业务层入手的 TCC( e.g. byteTCC)、事务消息 ( e.g. RocketMQ Half Message) 等等。XA 是需要本地数据库支持的分布式...

中间件小哥
2019/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mysql 通过binlog日志恢复数据

Binlog日志,即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即主节点维护一个binlog日志文件,从节点从binlog中同步数据,也可以通过binlog日志来恢复数据...

osc_lduvstkg
57分钟前
24
0
前端js日期时间格式转换

前端前后端接口处理时经常会遇到需要转换不同时间格式的情况,比如时间戳格式转换成正常日期显示来进行前端展示。 下面是分享一些不同格式的日期转换函数方法。 /** * 时间戳转时间 * @param...

osc_gccs85s0
59分钟前
9
0
微服务中如何设计一个权限授权服务

基于角色的访问控制 (RBAC)   是将系统访问限制为授权用户的一种方法,是围绕角色和特权定义的与策略无关的访问控制机制,RBAC的组件使执行用户分配变得很简单。   在组织内部,将为各种...

osc_ie20bwji
今天
12
0
前端js日期时间格式转换

前端前后端接口处理时经常会遇到需要转换不同时间格式的情况,比如时间戳格式转换成正常日期显示来进行前端展示。 下面是分享一些不同格式的日期转换函数方法。 /** * 时间戳转时间 * @param...

osc_sqfqhs81
今天
38
0
(转)【D3D11游戏编程】学习笔记三:XNAMath之XMMATRIX

(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在熟悉了XMVECTOR的风格及规则之后,再来了XNA数学库中的矩阵就容易...

osc_yumj26qz
今天
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部