Zuul menyediakan fungsi filer dan router dalam sistem layanan mikro Springcloud, yang merupakan bagian yang sangat diperlukan dari layanan microser. Selain implementasi default dari Filer, ia juga dapat menyesuaikan otorisasi, pembatasan saat ini, verifikasi keamanan, dll., Dan router dapat sepenuhnya menggantikan proxy terbalik nginx. Zuul Exception Handling dilakukan oleh SendErrorFilter.
Selama proses aplikasi kami, kami menemukan bahwa ada dua masalah yang tidak terlalu ramah untuk menggunakan filter pengecualian default:
1. Tidak mungkin untuk dengan cepat mengidentifikasi apakah rute yang meminta layanan diatur waktunya atau tidak ada node yang tersedia. Jika terjadi kesalahan, Anda hanya dapat melihat log dan menemukannya melalui tumpukan;
2. Tidak dapat kompatibel dengan format paket respons khusus seperti {code:500,msg:”xx error”} format.
Selanjutnya kita membahas cara menyesuaikan penanganan pengecualian, menyesuaikan informasi prompt pengecualian, dll.
Pertama -tama, kita harus menonaktifkan senderrorfilter default. Pejabat telah memberikan konfigurasi sakelar, sehingga Anda dapat mengonfigurasinya secara langsung.
zuul.senderrorfilter.post.disable = true
Kustom errorfilter, saya tidak akan banyak bicara di sini, cukup posting kode
Public Class ErrorFilter memperluas zuulfilter {private static final string error_status_code_key = "error.status_code"; Log logger pribadi = loggerFactory.getLogger (errorFilter.class); Public Static Final String default_err_msg = "Sistem ini sibuk, coba lagi nanti"; @Override public string filtertype () {return "post"; } @Override public int filterorder () {return 0; } @Override public boolean seharusnya filter () {requestContext ctx = requestContext.getCurrentContext (); return ctx.containskey (error_status_code_key); } @Override Public Object Run () {RequestContext ctx = requestContext.getCurrentContext (); coba {httpservletRequest request = ctx.getRequest (); int statuscode = (integer) ctx.get (error_status_code_key); String message = (string) ctx.get ("error.message"); if (ctx.containskey ("error.exception")) {throwable e = (pengecualian) ctx.get ("error.exception"); Throwable re = getoriginexception (e); if (re instanceof java.net.connectException) {message = "koneksi layanan nyata ditolak"; log.warn ("uri: {}, error: {}", request.getRequesturi (), re.getMessage ()); } else if (re instanceof java.net.socketTimeOutException) {message = "timeout layanan nyata"; 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 ("Kesalahan selama penyaringan", e); }} if (stringutils.isBlank (pesan)) pesan = default_err_msg; request.setAttribute ("javax.servlet.error.status_code", statuscode); request.setAttribute ("javax.servlet.error.message", pesan); Webutils.responseoutjson (ctx.getResponse (), jsonutils.tojson (wrapperresponse baru <> (statuscode, pesan))); } catch (exception e) {string error = "error selama penyaringan [errorFilter]"; log.error (error, e); Webutils.responseoutjson (ctx.getResponse (), jsonutils.toJson (wrapperresponse baru <> (500, error))); } return null; } private throwable getoriginexception (Throwable e) {e = e.getCause (); while (e.getCause ()! = null) {e = e.getCause (); } return e; }}Akhirnya Daftarkan Kustom Errorfilter kami
@Bean public errorFilter errorFilter () {return new errorFilter ();}Meringkaskan
Di atas adalah metode implementasi penanganan pengecualian bersatu Spring Cloud Zuul yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!