Es gibt einige geringfügige Änderungen in der Umsetzung verschiedener Versionen von Zuul, und die Gesamtumsetzungsidee hat sich nicht geändert. Nehmen Sie als Beispiel für den Frühlings-Cloud-Netflix-Core-1.3.6.READE.
1. Wichtige Initialisierungsklassen von 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
Zuulserverautokonfiguration
Initialisieren Sie Routing -Regeln
Initialisieren Sie einige wichtige Filter wie PreadcorationFilter, RibbonroutingFilter
Initialisieren Sie Zuulfilterinitializer
Initialisieren Sie Zuulhandlermaping
Der Code ist wie folgt
// Routing -Regeln @Bean @Conditionalonmissingbean (DiscoveryClientRoutelocator.Class) publicCoveryClientRoutelocator DiscoveryRoutelocator () {Neue DiscoveryClientRoutelocator (this.server.getServletprefix (), this.discovery, this.zuluLproperties, This } // pre filters @Bean public PreporationFilter PrepecorationFilter (Routelocator Routelocator, ProxyRequesthelper ProxyRequesthelper) {Neue PreporyRorationfilter (Routelocator, this.server.getServletprefix (), This.zuaProperties, Proxyrequethelper); } // Routenfilter @Bean public RibbonroutingFilter RibbonroutingFilter (ProxyRequesthelper -Helfer, RibbonCommandfactory <?> RibbonCommandfactory) {Ribbonroutingfilter filter = new RibbonroutingFilter (Helper, Ribboncommandfactory, This.Requestcustory), dieses. Rückgabefilter; } @Configuration Protected Static Class ZuulFilterConfiguration {@autowired Private Map <String, Zuulfilter> Filter; @Bean public zuulFilterinitializer Zuulfilterinitializer (kontrafaktorische kontrafaktorische, tracerfactory tacerfactory) {Filterloader filterloader = filterloader.getInstance (); Filterregistry filterregistry = filterregistry.instance (); Return neu zu neu zulefilterinitializer (filterregulierende, filterregistry); }} @Bean public ZuulController Zuulcontroller () {return neu ZuulController (); } @Bean public ZuulHandlermaping ZuulHandlermaping (Routelocator -Routen) {ZuulHandlermaping mapping = neu ZuulHandlermaping (Routen, Zuulcontroller ()); maping.setErrorController (this.ErrorController); Return Mapping; }Zuulproxyautokonfiguration
Zuulproxautokonfiguration Erbt
Die Hauptfunktion besteht darin, die Konfiguration der RibbonCommandFactoryConfiguration hinzuzufügen und alle Methoden zur Implementierung von Ribbon wie Apache, OKHTTP zu initialisieren.
Zuulfilterinitializer
Die Funktion dieser Klasse dient hauptsächlich darin, den initialisierten Filter an Zuuls Filterregistrierung zu registrieren. Filterregistry ist ein Singleton, das zur Initialisierung von Routing -Informationen verwendet wird und in Zuulrunner verwendet wird
RibbonCommandFactoryConfiguration
Die Hauptfunktion besteht darin, die Weiterleitung zu konfigurieren, und die Implementierung enthält hauptsächlich Apache, OKHTTP
2. Die Weiterleitungsumsetzung von Zuul
Erstens besteht der erste Schritt darin, zur LookupHandler -Methode in Zuulhandlermaping zu gehen und sie an den Zuulcontroller weiterzuleiten
@Override Protected Object LookupHandler (String urlPath, httpServletRequest -Anforderung) löst Ausnahme aus {if (this.RrorController! } String [] ignored = this.Routelocator.getignoredPaths (). TOArray (neue String [0]); if (mustermatchUtils.Simplematch (ignoriert, urlPath)) {return null; } RequestContext ctx = requestContext.getCurrentContext (); if (ctx.containsKey ("Forward.to")) {return null; } if (this.dirty) {synchronized (this) {if (this.dirty) {RegisterHandlers (); this.dirty = false; }}} return super.lookupHandler (urlPath, request); }Die Anforderungsregeln werden beim ersten Zugriff als wahr initialisiert.
private void RegisterHandlers () {Sammlung <route> routes = this.routelocator.getRoutes (); if (Routes.isempty ()) {this.logger.warn ("keine Routen aus Routelocator gefunden"); } else {for (Route Route: Routen) {RegisterHandler (Route.getFullPath (), this.zuuul); }}}Der zweite Schritt von Zuulcontroller erbt servletwrappingController wird die Anfrage wie folgt auf Zuulservlet übertragen
/** * @author spencer gibb */public class ZuulController erweitert ServletWrappingController {public zuulcontroller () {setServletClass (Zuulserservlet.Class); setServletName ("Zuul"); setSupportedMethods ((String []) null); // ALLE} @Override public modelAndView Handlreequest (httpServletRequest -Anforderung, HttpServletResponse -Antwort) ausreihen {try {// Wir kümmern uns nicht um die anderen Funktionen der Basisklasse, nur die Anfrage, die die Anfrage return.handLerequestinternal (Anfrage, Reaktion, Reaktion, Reaktion, Reaktion, Reaktion); } endlich {// @see com.netflix.zuul.context.contextlifecycleFilter.dofilter RequestContext.getCurrentContext (). UnSet (); }}}Der dritte Schritt ist die Service -Methode von Zuulservlet wie folgt: Pre, Route und Postroute.
@Override public void Service (javax.servlet.servletRequest servletRequest, javax.servlet.servletResponse servletResponse) löst ServletException aus, ioException {try {init ((htttpServletreque ") servletRequest, (httpservletRetResponte). // markiert diese Anfrage als die "Zuul -Engine" im Gegensatz zu Servlets // explizit in web.xml gebunden, für die Anfragen nicht die gleichen Daten angehängt haben, die RequestContext Context = RequestContext.getCurrentContext () angehängt haben; context.setzuulengineran (); versuche {preroute (); } catch (ZuUlexception e) {error (e); poTroute (); zurückkehren; } try {Route (); } catch (ZuUlexception e) {error (e); poTroute (); zurückkehren; } try {poTroute (); } catch (ZuUlexception e) {error (e); zurückkehren; }} catch (throwable e) {error (neu zulexception (e, 500, "unhandled_exception_" + e.getClass (). getName ()); } endlich {RequestContext.getCurrentContext (). UnSet (); }}4. Schließlich führt der SendResponseFilter das Ergebnis aus und der Filterorder beträgt 1000. Daher ist es am besten, den Filter nicht mehr als 1000 zu veröffentlichen, andernfalls wird das Rückgabeergebnis betroffen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.