يوفر Zuul وظائف Filer and Trouter في نظام الخدمات المجهرية SpringCloud ، وهو جزء لا غنى عنه من الخدمات الصغيرة. بالإضافة إلى التنفيذ الافتراضي لـ FILER ، يمكنه أيضًا تخصيص التفويض ، والتحديد الحالي ، والتحقق من الأمان ، وما إلى ذلك ، ويمكن أن يحل جهاز التوجيه استبدال الوكيل العكسي Nginx تمامًا. يتم التعامل مع استثناء Zuul بواسطة SenderRorFilter.
أثناء عملية التقديم الخاصة بنا ، وجدنا أن هناك مشكلتان غير ودودين للغاية لاستخدام مرشح الاستثناء الافتراضي:
1. من المستحيل تحديد ما إذا كانت المسار الذي يطلب الخدمة قد تم توقيته أو لا توجد عقد متوفرة. في حالة حدوث خطأ ، يمكنك فقط عرض السجل وتحديد موقعه من خلال المكدس ؛
2. غير قادر على التوافق مع تنسيقات حزمة الاستجابة المخصصة مثل {code:500,msg:”xx error”} .
بعد ذلك نناقش كيفية تخصيص معالجة الاستثناءات ، وتخصيص معلومات موجه الاستثناء ، إلخ.
بادئ ذي بدء ، يجب علينا تعطيل الافتراضي senderrorfilter. قدم المسؤول تكوين التبديل ، حتى تتمكن من تكوينه مباشرة.
Zuul.SenderRorfilter.post.disable = صحيح
خطأ مخصص ، لن أقول الكثير هنا ، ما عليك سوى نشر الرمز
error errorfilter العام يمتد zuulfilter {private static final string error_status_code_key = "error.status_code" ؛ سجل المسجل الخاص = loggerfactory.getLogger (errorfilter.class) ؛ السلسلة النهائية الثابتة العامة default_err_msg = "النظام مشغول ، يرجى المحاولة مرة أخرى لاحقًا" ؛ Override public string filterType () {return "post" ؛ } Override public int filterorder () {return 0 ؛ } Override public boolean shouldfilter () {requestContext ctx = requestContext.getCurrentContext () ؛ return ctx.containskey (error_status_code_key) ؛ } Override Public Object Run () {requestContext ctx = requestContext.getCurrentContext () ؛ حاول {httpservletrequest request = ctx.getRequest () ؛ int statusCode = (integer) ctx.get (error_status_code_key) ؛ رسالة سلسلة = (سلسلة) ctx.get ("error.message") ؛ if (ctx.containskey ("error.exception")) {throwable e = (استثناء) ctx.get ("error.exception") ؛ rewable re = getoriginexception (e) ؛ if (re eastyof java.net.connectException) {message = "Real Service Connection refused" ؛ log.warn ("uri: {} ، error: {}" ، request.getRequesturi () ، re.getMessage ()) ؛ } آخر إذا (re eastyof java.net.sockettimeOutException) {message = "real service timeout" ؛ log.warn ("uri: {} ، error: {}" ، request.getRequesturi () ، re.getMessage ()) ؛ } if if (re stietyof com.netflix.client.clientException) {message = re.getMessage () ؛ log.warn ("uri: {} ، error: {}" ، request.getRequesturi () ، re.getMessage ()) ؛ } آخر {log.warn ("خطأ أثناء التصفية" ، e) ؛ }} if (stringUtils.isblank (message)) message = default_err_msg ؛ request.setattribute ("javax.servlet.error.status_code" ، statusCode) ؛ request.setattribute ("javax.servlet.error.message" ، message) ؛ WebUtils.ResponseOutJson (ctx.getResponse () ، jsonutils.tojson (closperResponse <> (statusCode ، message))) ؛ } catch (استثناء e) {string error = "خطأ أثناء التصفية [errorfilter]" ؛ log.error (خطأ ، e) ؛ WebUtils.ResponseOutJson (ctx.getResponse () ، jsonutils.tojson (closperResponse <> (500 ، خطأ))) ؛ } إرجاع فارغ ؛ } getoriginexception القابلة للتسمية الخاصة (رمي e) {e = e.getCause () ؛ بينما (e.getCause ()! = null) {e = e.getCause () ؛ } إرجاع e ؛ }}أخيرًا ، قم بتسجيل Errorfilter المخصص
bean public errorfilter errorfilter () {return new errorfilter () ؛}لخص
ما ورد أعلاه هو طريقة تنفيذ الاستثناء الموحد Cloud Zuul Zuul Custom Customed الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!