Il y a quelques changements mineurs dans la mise en œuvre de diverses versions de Zuul, et l'idée de mise en œuvre globale n'a pas changé. Prenez Spring-Cloud-netflix-core-1.3.6.Release comme exemple.
1. Classes d'initialisation importantes de 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
Initialiser les règles de routage
Initialiser certains filtres importants tels que la prédécoration Filter, RibBonRoutingFilter
Initialiser Zuulfilterinitializer
Initialiser zuulhandlermapping
Le code est le suivant
// Règles de routage @Bean @conditionalonMissingBean (DiscoveryClientRoutelocator.class) public DiscoveryClientRoutelocator DiscoveryRouteLocator () {Return New DiscoveryClientRouteLocator (this.server.getServletPrefix (), this.discovery, this.zuulproperties, this.ServiceTermator); } // pré-filtres @Bean Public PredecorationFilter PredecorationFilter (Routelocator RouteLocator, Proxyrequesthelper ProxyRequesthelper) {return new PredecorationFilter (roullocator, this.server.getServletPrefix (), this.zuulproperties, proxyrequesthelper); } // Route Filters @Bean Public RibBonRoutingFilter RibBonRoutingFilter (proxyrequesthelper helper, rubbonCommandFactory <?> rubbonCommandFactory) {rubBbonRoutingFilter filter = new rubBonroutingFilter (Helper, rubBonCommandfactory, this.requestcustomalisers); filtre de retour; } @Configuration Protected Static Class ZuulFilterConfiguration {@Autowired Private Map <String, ZuulFilter> Filters; @Bean public zuulfilterinitializer zuulfilterinitializer (contrefactory contrefactory, TracerFactory TracerFactory) {filteroller filterLoader = filterloader.getInstance (); FilterRegistry FilterRegistry = filterRegistry.Instance (); Renvoie un nouveau zuulfilterinitializer (this.filters, contrefactive, tracerfactory, filterloader, filterRegistry); }} @Bean public zuulController zuulController () {return new ZuulController (); } @Bean public ZuulHandlermapping ZuulHandlerMapping (routes de route de motif) {ZuulHandlerMapping Mapping = new ZuulHandlerMapping (Routes, ZuulController ()); mapping.seterrorController (this.errorController); mappage de retour; }Zuulproxyautoconfiguration
Zuulproxautoconfiguration hérite de Zuulserverautoconfiguration et Zuulserverautoconfiguration
La fonction principale consiste à ajouter la configuration de RibBonCommandFactoryConfiguration et à initialiser toutes les méthodes pour implémenter le ruban tel qu'Apache, OKHTTP.
Zuulfilterinitializer
La fonction de cette classe consiste principalement à enregistrer le filtre initialisé au filtre de Zuul. FilterRegistry est un singleton utilisé pour initialiser les informations de routage et est utilisé dans Zuulrunner
RubanCommandFactoryConfiguration
La fonction principale est de configurer le transfert et l'implémentation comprend principalement Apache, OKHTTP
2. La mise en œuvre de la transmission de Zuul
Premièrement, la première étape consiste à accéder à la méthode de recherche de recherche dans Zuulhandlermapping, et de le transmettre au ZuulController
@Override Protected Object LookupHandler (String urlPath, httpServLetRequest request) lève une exception {if (this.errorController! = Null && urlPath.equals (this.errorcontroller.getherrorPath ())) {return null; } String [] ignoré = this.RouteLocator.GetIgnoredPaths (). ToArray (new String [0]); if (PatternMatchUtils.SimpleMatch (ignoré, urlPath)) {return null; } RequestContext ctx = requestContext.getCurrentContext (); if (ctx.containsKey ("Forward.to")) {return null; } if (this.dirty) {synchronisé (this) {if (this.dirty) {registerHandlers (); this.dirty = false; }}} return super.lookupHandler (urlPath, request); }Les règles de demande sont initialisées comme vraies lors de l'accès à la première fois.
private void RegisterHandlers () {Collection <Route> Routes = this.RouteLocator.GetRoutes (); if (rotes.isempty ()) {this.logger.warn ("pas de routes trouvées à partir de routelocator"); } else {for (Route Route: Routes) {registreHandler (route.getfullPath (), this.zuul); }}}La deuxième étape de ZuulController hérite de ServletwappingController transférera la demande à Zuulservlet comme suit
/ ** * @Author Spencer Gibb * / public class ZuulController étend servletWrapingController {public zuulController () {setServletClass (zuulservlet.class); setServletName ("Zuul"); setSupportedMethods ((String []) null); // Autoriser tous} @Override public ModelAndView handleRequest (HttpServLetRequest Request, HttpServletResponse Response) lève une exception {try {// nous ne nous soucions pas des autres fonctionnalités de la classe de base, je veux simplement gérer la demande return super.handlerequestintern (demande, réponse); } enfin {// @see com.netflix.zuul.context.contextlifecyclefilter.dofilter requestContext.getCurrentContext (). unset (); }}}La troisième étape est la méthode de service de Zuulservlet comme suit: PRE, Route et Postroute.
@Override public void Service (javax.servlet.servletRequest servletRequest, javax.servlet.servletResponse servletResponse) lance le servletException, ioException {try {init (httpservletRequest) servleTrequest, (httpservetResponse) servletResponse); // marque cette demande comme ayant traversé le "moteur Zuul", par opposition aux servlets // explicitement liés dans web.xml, pour lesquels les demandes n'auront pas les mêmes données jointe à requête Context = requestContext.getCurrentContext (); context.setzuulengineran (); essayez {prérout (); } catch (zuulexception e) {error (e); postroute (); retour; } essayez {Route (); } catch (zuulexception e) {error (e); postroute (); retour; } essayez {posToute (); } catch (zuulexception e) {error (e); retour; }} catch (Throwable E) {error (new Zuulexception (e, 500, "insuffisant_exception_" + e.getClass (). getName ())); } enfin {requestContext.getCurrentContext (). Unset (); }}4. Enfin, le SendResponseFilter exécute le résultat et le filtre est 1000. Par conséquent, il est préférable de ne pas dépasser 1000, sinon le résultat de retour sera affecté.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.