SpringCloudFeign 전역 이상 처리

갱 1: 서버 에서 전역 차단 이상 통일 처 리 를 사용 하여 클 라 이언 트 가 이상 을 포착 하지 못 했 습 니 다.
서버 에서 전역 차단 이상 통일 처리 (@ RestController Advice) 를 사용 하여 통 일 된 형식 정 보 를 되 돌려 feign 클 라 이언 트 가 서버 를 호출 할 때 서버 에 이상 이 발생 하면 클 라 이언 트 가 이상 을 포착 하지 못 하고 녹 아내 림, 강등 에 들 어가 지 못 합 니 다.
@Slf4j
@RestControllerAdvice
public class ExceptionHandle {

    @ExceptionHandler(Exception.class)
    private Result handle(Exception exception) {
        return null;
    }
}

해결 방법: @ RestController Advice 주석 에서 이상 패 키 지 를 통일 적 으로 차단 해 야 하 며, feign 호출 패 키 지 는 포함 되 지 않 습 니 다.

@Slf4j
@RestControllerAdvice({"com.test.controller"})
//@RestControllerAdvice
public class ExceptionHandle {
}

구덩이 2: feign 이 녹 아내 린 후 서비스 제공 자가 던 진 원본 이상 정 보 를 얻 지 못 합 니 다.
이상 정보 예:
WxServiceApi#getTokenByAppId(String) failed and no fallback available.

예상 목표: 원본 이상 정 보 를 가 져 와 해결 방법 1: 닫 기
feign:
  hystrix:
    enabled: false

해결 방법 2: ErrorDecoder 를 실현 합 니 다. 사용자 정의 ErrorDecoder ErrorDecoder 를 사용 하면 전역 을 설정 할 수도 있 고 @ FeignClient 에서 전역 을 지정 할 수도 있 습 니 다. 녹 아내 리 지 않 습 니 다.
@Slf4j
@Configuration
public class ExceptionErrorDecoder implements ErrorDecoder {
    @Override
    public Exception decode(String var1, Response response) {
        try {
            if (response.body() != null) {
                String body = Util.toString(response.body().asReader());
                log.error(body);
                ExceptionInfo exceptionInfo = JSON.parseObject(body, new TypeReference<ExceptionInfo>() {
                });
               // Class clazz = Class.forName(exceptionInfo.getException());
                //Exception  exception = (Exception) clazz.getDeclaredConstructor(String.class).newInstance(exceptionInfo.getMessage());
                return new HystrixBadRequestException(exceptionInfo.getMessage());
                //return exception;
            }
        } catch (Exception var4) {
            log.error(var4.getMessage());
            return new InternalException(var4.getMessage());
        }
        return new InternalException("system error");
    }
}

ExceptionInfo 클래스
@Data
public class ExceptionInfo {

    private Long timestamp;

    private Integer status;

    private String exception;

    private String message;

    private String path;

    private String error;
}

단일 @ FeignClient 에서 지정 한 녹 아내 림:
public class KeepErrMsgConfiguration {

    @Bean
    public ErrorDecoder errorDecoder() {
        return new UserErrorDecoder();
    }
    /**
     *      
     */
    public class UserErrorDecoder 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);
                //           Result,            
                Result result = JSONObject.parseObject(json, Result.class);
                //           RuntimeException,        
                if (!ResultUtil.isSuccess(result)) {
                    exception = new RuntimeException(result.getObj().toString());
                }
            } catch (IOException ex) {
                logger.error(ex.getMessage(), ex);
            }
            return exception;
        }
    }
}

녹 아내 림 에 들 어가 지 않 음:

public class NotBreakerConfiguration {

    @Bean
    public ErrorDecoder errorDecoder() {
        return new UserErrorDecoder();
    }
    /**
     *      
     */
    public class UserErrorDecoder 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);
                //           Result,            
                Result result = JSONObject.parseObject(json, Result.class);
                //           RuntimeException,        
                if (!ResultUtil.isSuccess(result)) {
                    exception = new HystrixBadRequestException(result.getObj().toString());
                }
            } catch (IOException ex) {
                logger.error(ex.getMessage(), ex);
            }
            return exception;
        }
    }

}

@ FeignClient 주석 설정
 @FeignClient(name = "wx-service",url ="http://localhost:8082", fallbackFactory = WxHystrixClientFallbackFactory.class, configuration = NotBreakerConfiguration.class)
    @Component
    interface WxServiceApi {

 
    }

자신의 프로젝트 에 따라 필요 한 errorDecoder 설정 을 실현 하고 유연 하 게 사용 합 니 다.
참고:
https://blog.csdn.net/hnhygkx/article/details/89492031

좋은 웹페이지 즐겨찾기