Zuul은 SpringCloud MicroService 시스템에서 파일러 및 라우터 기능을 제공하며, 이는 마이크로 서비스에 없어서는 안될 부분입니다. Filer의 기본 구현 외에도 인증, 현재 제한, 보안 검증 등을 사용자 정의 할 수 있으며 라우터는 Nginx 리버스 프록시를 완전히 대체 할 수 있습니다. Zuul Exception 처리는 SenderRorFilter에서 수행합니다.
신청 과정에서 기본 예외 필터를 사용하기에 매우 친숙하지 않은 두 가지 문제가 있음을 발견했습니다.
1. 서비스 요청 경로가 시간이 초과되었는지 또는 사용 가능한 노드가 없는지 신속하게 식별하는 것은 불가능합니다. 오류가 발생하면 로그를보고 스택을 통해서만 찾을 수 있습니다.
2. {code:500,msg:”xx error”} 형식과 같은 사용자 정의 응답 패키지 형식과 호환되지 않습니다.
다음으로 예외 처리를 사용자 정의하고 예외 프롬프트 정보를 사용자 정의하는 방법에 대해 논의하고 있습니다.
우선, 기본 SendErrorFilter를 비활성화해야합니다. 공무원은 스위치 구성을 제공하여 직접 구성 할 수 있습니다.
zuul.senderrorfilter.post.disable = true
Custom ErrorFilter, 여기에별로 말하지 않고 코드를 게시합니다.
public class errorfilter는 zuulfilter {private static final string error_status_code_key = "error.status_code"; 개인 로거 로그 = loggerfactory.getLogger (ErrorFilter.class); public static final String default_err_msg = "시스템이 바쁘다. 나중에 다시 시도하십시오"; @override public String filtertype () {return "post"; } @override public int filterorder () {return 0; } @override public boolean rittfilter () {requestContext ctx = requestContext.GetCurrentContext (); CTX.Containskey를 반환합니다 (ERROR_STATUS_CODE_KEY); } @override public 객체 run () {requestContext ctx = requestContext.getCurrentContext (); {httpservletrequest request = ctx.getRequest (); int statusCode = (정수) ctx.get (error_status_code_key); 문자열 메시지 = (문자열) ctx.get ( "error.message"); if (ctx.containskey ( "error.exception")) {strowable e = (예외) ctx.get ( "error.xception"); 던질 수있는 re = getoriginexception (e); if (java.net.connectexception의 인스턴스) {message = "실제 서비스 연결 거부"; log.warn ( "uri : {}, error : {}", request.getRequesturi (), re.getMessage ()); } else if (re instance of java.net.sockettimeoutException) {message = "실제 서비스 시간 초과"; log.warn ( "uri : {}, error : {}", request.getRequesturi (), re.getMessage ()); } else if (re instanceof com.netflix.client.clientException) {message = re.getMessage (); log.warn ( "uri : {}, error : {}", request.getRequesturi (), re.getMessage ()); } else {log.warn ( "필터링 중 오류", e); }} if (stringUtils.isblank (메시지)) 메시지 = default_err_msg; request.setattribute ( "javax.servlet.error.status_code", statusCode); request.setattribute ( "javax.servlet.error.message", message); webutils.responseoutjson (ctx.getResponse (), jsonutils.tojson (New WrapperResponse <> (StatusCode, Message))); } catch (예외 e) {문자열 error = "필터링 중 오류 [ERRERFILTER]"; log.error (오류, e); webutils.responseoutjson (ctx.getResponse (), jsonutils.tojson (new WrapperResponse <> (500, error))); } return null; } 개인 던지기 가능한 getoriginexception (Throwable e) {e = e.getCause (); while (e.getCause ()! = null) {e = e.getCause (); } 반환 e; }}마지막으로 사용자 정의 ErrorFilter를 등록하십시오
@bean public errorfilter errorfilter () {return new ErrorFilter ();}요약
위의 것은 Spring Cloud Zuul Custom Unified Exception Handling 구현 방법입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!