Ada beberapa perubahan kecil dalam implementasi berbagai versi Zuul, dan ide implementasi keseluruhan tidak berubah. Ambil Spring-Cloud-Netflix-Core-1.3.6.release sebagai contoh.
1. Kelas inisialisasi penting Zuul
org.springframework.cloud.netflix.zuul.zuulserverautoconfiguration
org.springframework.cloud.netflix.zuul.zuulproxyautoconfiguration
org.springframework.cloud.netflix.zuul.zuulfilterinitializer
org.springframework.cloud.netflix.zuul.ribbonCommandfactoryConfiguration
Zuulserverautoconfiguration
Inisialisasi aturan perutean
Inisialisasi beberapa filter penting seperti PredecorationFilter, RibbonRoutingFilter
Inisialisasi zuulfilterinitializer
Inisialisasi Zuulhandlermapping
Kodenya adalah sebagai berikut
// aturan perutean @bean @conditionAlonmissingbean (DiscoveryClientRouteLocator.class) DiscoveryclientRoutelocator Public Discoveryroutelocator () {return New DiscoveryclientRouteLocator (this.server.getservletprefix (), this.discovery, this.zuulerproperTer, this.seplappers (), this.discovery, this.zuUlproperTer, this. } // Pre filter @Bean Public PrearrecorationFilter PrearrecorFilter (RouteLocator routeLocator, proxyRequestHelper proxyRequestHelper) {return baru predecorationFilter (routelocator, this.server.getServletPrefix (), this.zuulpropertion, this.server.getServletPrefix (), this.zuulpropertion, this.server.getServletPrefix (), this.zuulpropertion, this.zuulpropertion, this.server.getServletPrefix (), this.zuulpropertion, this.zuulproperi } // route filters @Bean public RibbonRoutingFilter ribbonRoutingFilter(ProxyRequestHelper helper, RibbonCommandFactory<?> ribbonCommandFactory) { RibbonRoutingFilter filter = new RibbonRoutingFilter(helper, ribbonCommandFactory, this.requestCustomizers); filter pengembalian; } @Configuration dilindungi kelas statis zuulfilterconfiguration {@autowired private Map <string, zuulfilter> filter; @Bean Public ZuulfilterInitializer ZuulfilterInitializer (Counterfactory CounterFactory, TracerFactory TracerFactory) {filterloader filterloader = filterloader.getInstance (); Filterregistry filterregistry = filterregistry.instance (); Return New ZuulfilterInitializer (this.filters, counterfactory, tracerfactory, filterloader, filterregistry); }} @Bean Public ZuulController ZuulController () {return new ZuulController (); } @Bean Publik ZuulHandlermapping ZuulHandlermapping (rute routeLocator) {zuulhandlermapping pemetaan = new Zuulhandlermapping (rute, zuulcontroller ()); pemetaan.setErrorController (this.errorController); pemetaan kembali; }Zuulproxyautoconfiguration
Zuulproxautoconfiguration mewarisi zuulserverautoconfiguration dan zuulserverautoconfiguration
Fungsi utama adalah menambahkan konfigurasi RibbonCommandFactoryCoryChiguration, dan menginisialisasi semua metode untuk mengimplementasikan pita seperti Apache, OKHTTP.
Zuulfilterinitializer
Fungsi kelas ini terutama untuk mendaftarkan filter yang diinisialisasi ke filterregistrasi Zuul. FilterRegistry adalah singleton yang digunakan untuk menginisialisasi informasi perutean dan digunakan dalam Zuulrunner
RibbonCommandFactoryConfiguration
Fungsi utamanya adalah untuk mengkonfigurasi penerusan, dan implementasinya terutama mencakup Apache, okhttp
2. Penerusan implementasi Zuul
Pertama, langkah pertama adalah pergi ke metode Lookuphandler di Zuulhandlermapping, dan meneruskannya ke ZuulController
@Override Protected Object LookupHandler (String urlpath, httpservletrequest permintaan) melempar Exception {if (this.errorController! = Null && urlpath.equals (this.errorController.getErrorPath ())) {return null; } String [] diabaikan = this.routeLocator.getIggetoredPaths (). ToArray (string baru [0]); if (polaMatchutils.simplematch (diabaikan, urlpath)) {return null; } RequestContext ctx = requestContext.getCurrentContext (); if (ctx.containskey ("forward.to")) {return null; } if (this.dirty) {disinkronkan (this) {if (this.dirty) {registerHandlers (); this.dirty = false; }}} return super.lookuphandler (urlpath, request); }Aturan permintaan diinisialisasi sebagai benar saat mengakses pertama kali.
private void registerHandlers () {collection <Route> routes = this.routeLocator.getRoutes (); if (routes.isempty ()) {this.logger.warn ("Tidak ada rute yang ditemukan dari routelocator"); } else {untuk (rute rute: rute) {registerhandler (route.getFullPath (), this.zuul); }}}Langkah kedua Zuulcontroller mewarisi servletwrapping controller akan mentransfer permintaan ke Zuulservlet sebagai berikut
/** * @Author Spencer Gibb */kelas publik Zuulcontroller memperluas servletwrappingController {public zuulcontroller () {setSerVletClass (zuulservlet.class); setServerName ("Zuul"); setSupportedMethods ((String []) null); // Izinkan semua} @Override Public ModelAndView HandLeRequest (HTTPServletRequest Request, httpservletResponse response) melempar Exception {try {// Kami tidak peduli dengan fitur lain dari kelas dasar, hanya ingin // menangani permintaan pengembalian super.handlerequestinnal (permintaan, respons); } akhirnya {// @see com.netflix.zuul.context.contextLifeCycleFilter.dofilter requestContext.getCurrentContext (). unset (); }}}Langkah ketiga adalah metode layanan Zuulservlet sebagai berikut: Pra, Rute, dan Postroute.
@Override public void service (javax.servlet.servletrequest servletRequest, javax.servlet.servletresponse servletResponse) melempar servletexception, ioException {try {init ((httpservletRequest) servletRequest, (httpserveVesserponse) servletRequest, (httpservetserponse) servletRequest, (httpservetsePonse) servletRequest, (httpservePonSEPONSE) servletRequest, (httpservePonSe) servletRequest, (httpservetsePonSe) servletReQuest, (httpservetse; // menandai permintaan ini telah melewati "mesin Zuul", sebagai lawan dari servlets // secara eksplisit terikat di web.xml, yang permintaannya tidak akan memiliki data yang sama terlampir kontekscontext context = requestContext.getCurrentContext (); context.setzuulengineran (); coba {preroute (); } catch (ZuulException e) {error (e); postroute (); kembali; } coba {route (); } catch (ZuulException e) {error (e); postroute (); kembali; } coba {postroute (); } catch (ZuulException e) {error (e); kembali; }} catch (throwable e) {error (new ZuulException (e, 500, "unhandled_exception_" + e.getClass (). getName ())); } akhirnya {requestContext.getCurrentContext (). unset (); }}4. Akhirnya, SendResponsefilter menjalankan hasilnya dan filterorder adalah 1000. Oleh karena itu, yang terbaik adalah memposting filter tidak melebihi 1000, jika tidak hasil pengembalian akan terpengaruh.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.