Zuul ให้ฟังก์ชั่น Filer และเราเตอร์ในระบบ Microservice SpringCloud ซึ่งเป็นส่วนที่ขาดไม่ได้ของ Microservices นอกเหนือจากการใช้งานเริ่มต้นของ Filer แล้วยังสามารถปรับแต่งการอนุญาตการ จำกัด ปัจจุบันการตรวจสอบความปลอดภัย ฯลฯ และเราเตอร์สามารถแทนที่ Nginx Reverse Proxy ได้อย่างสมบูรณ์ การจัดการข้อยกเว้นของ Zuul ทำได้โดย SenderRorfilter
ในระหว่างขั้นตอนการสมัครของเราเราพบว่ามีสองปัญหาที่ไม่เป็นมิตรมากในการใช้ตัวกรองข้อยกเว้นเริ่มต้น:
1. เป็นไปไม่ได้ที่จะระบุได้อย่างรวดเร็วว่าเส้นทางการร้องขอเส้นทางหมดเวลาหรือไม่มีโหนดที่มีอยู่ หากเกิดข้อผิดพลาดคุณสามารถดูบันทึกและค้นหาผ่านสแต็กเท่านั้น
2. ไม่สามารถเข้ากันได้กับรูปแบบแพ็คเกจการตอบสนองที่กำหนดเองเช่นรูปแบบ {code:500,msg:”xx error”}
ต่อไปเรากำลังหารือเกี่ยวกับวิธีการปรับแต่งการจัดการข้อยกเว้นปรับแต่งข้อมูลพรอมต์ข้อยกเว้น ฯลฯ
ก่อนอื่นเราต้องปิดการใช้งาน SenderRorFilter เริ่มต้น อย่างเป็นทางการได้ให้การกำหนดค่าสวิตช์เพื่อให้คุณสามารถกำหนดค่าได้โดยตรง
zuul.senderRorfilter.post.disable = true
ข้อผิดพลาดที่กำหนดเองฉันจะไม่พูดมากที่นี่เพียงโพสต์รหัส
Public Class Errorfilter ขยาย ZuulFilter {สตริงคงสุดท้ายแบบคงที่ error_status_code_key = "error.status_code"; logger ส่วนตัว log = loggerFactory.getLogger (errorfilter.class); สตริงสุดท้ายคงที่สาธารณะ default_err_msg = "ระบบไม่ว่างโปรดลองอีกครั้งในภายหลัง"; @Override Public String FilterType () {return "post"; } @Override public int filterOrder () {return 0; } @Override บูลีนสาธารณะควร filter () {requestcontext ctx = requestcontext.getCurrentContext (); ส่งคืน ctx.containskey (ERROR_STATUS_CODE_KEY); } @Override วัตถุสาธารณะรัน () {requestcontext ctx = requestcontext.getCurrentContext (); ลอง {httpservletRequest request = ctx.getRequest (); int statusCode = (จำนวนเต็ม) ctx.get (error_status_code_key); String message = (string) ctx.get ("error.message"); if (ctx.containskey ("error.exception")) {throwable e = (exception) ctx.get ("error.exception"); throwable re = getoriginexception (e); if (re อินสแตนซ์ของ java.net.connectException) {message = "การเชื่อมต่อบริการจริงปฏิเสธ"; log.warn ("uri: {}, ข้อผิดพลาด: {}", request.getRequesturi (), re.getMessage ()); } อื่นถ้า (อินสแตนซ์ของ java.net.sockettimeoutException) {message = "หมดเวลาการบริการจริง"; log.warn ("uri: {}, ข้อผิดพลาด: {}", request.getRequesturi (), re.getMessage ()); } อื่นถ้า (re instanceof com.netflix.client.clientException) {message = re.getMessage (); log.warn ("uri: {}, ข้อผิดพลาด: {}", 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", ข้อความ); WebUtils.responseOutjson (ctx.getResponse (), jsonutils.tojson (wrapperresponse ใหม่ <> (statuscode, ข้อความ))); } catch (exception e) {string error = "ข้อผิดพลาดระหว่างการกรอง [errorfilter]"; log.error (ข้อผิดพลาด, e); WebUtils.responseOutjson (ctx.getResponse (), jsonutils.tojson (wrapperresponse ใหม่ <> (500, ข้อผิดพลาด))); } return null; } private throwable getoriginexception (throwable e) {e = e.getCause (); ในขณะที่ (e.getCause ()! = null) {e = e.getCause (); } return e; -ในที่สุดก็ลงทะเบียนข้อผิดพลาดที่กำหนดเองของเรา
@Bean Public Errorfilter ErrorFilter () {ส่งคืนข้อผิดพลาดใหม่ ();};สรุป
ข้างต้นคือ Spring Cloud Zuul Custom Unified Exception Handling วิธีการใช้งานที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!