Hay algunos cambios menores en la implementación de varias versiones de Zuul, y la idea general de implementación no ha cambiado. Tome Spring-Cloud-Netflix-Core-1.3.6.Erelease como ejemplo.
1. Clases importantes de inicialización 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
Zuulserverautoconfiguración
Inicializar las reglas de enrutamiento
Inicializar algunos filtros importantes, como PredecorationFilter, RibbonroutingFilter
Inicializar zuulfilterinitializer
Inicializar zuulhandlermapping
El código es el siguiente
// Reglas de enrutamiento @Bean @ConditionAlonMissingBean (DiscoveryClientRoutElocator.class) public DiscoveryClientRoutElocator DiscoveryRoutElocator () {return New DiscoveryClientRoutElocator (this.server.getServletPrefix (), this.discovery, this.zuulPerties, this. } // pre filtros @Bean Publicfilter PredecorationFilter (Routelocator Routelocator, proxyRequestHelper proxyRequesthelper) {return New PredecorationFilter (Routelocator, this.server.getServletPrefix (), this.zuulProperties, proxyReStHelper); } // Los filtros de ruta @Bean Public RibbonroutingFilter RibbonRoutingFilter (proxyRequestHelper Helper, RibbonCommandFactory <?> RibbonCommandFactory) {RibbonRoutingFilter Filter = New RibbonRoutingFilter (Helper, RibbonCommandFactory, this.RequestCustomizers); Filtro de retorno; } @Configuration Class estática protegida ZuulfilterConfiguration {@aUtowired Map private <String, Zuulfilter> Filtros; @Bean Public ZuulFilterInitializer ZuulfilterInitializer (contrafactory contrafactory, tracerFactory tracerFactory) {FilterLoader FilterLoader = FilterLoader.getInstance (); FilterRegistry FilterRegistry = FilterRegistry.Instance (); devolver nuevo zuulfilterinitializer (this.filters, contrafactory, tracerFactory, filtreLoader, filterregistry); }} @Bean public ZuulController ZuulController () {return new ZuulController (); } @Bean public zuulhandlermapping zuulhandlermapping (rutas de rutelocator) {Zuulhandlermapping mapping = new Zuulhandlermapping (rutas, zuulcontroller ()); mapping.setErrorController (this.errorController); Mapeo de retorno; }Zuulproxyautoconfiguración
La zuulproxautoconfiguración hereda la zuulserverautoconfiguración y el zuulserverautoconfiguración
La función principal es agregar la configuración de RibbonCommandFactoryConfiguration e inicializar todos los métodos para implementar la cinta como Apache, OKHTTP.
Zuulfilterinitializador
La función de esta clase es principalmente para registrar el filtro inicializado en el FilterRegistry de Zuul. FilterRegistry es un singleton utilizado para inicializar la información de enrutamiento y se utiliza en Zuulrunner
RibbonCommandFactoryConfiguration
La función principal es configurar el reenvío, y la implementación incluye principalmente Apache, OKHTTP
2. La implementación de reenvío de Zuul
Primero, el primer paso es ir al método BeartuPHandler en Zuulhandlermapping, y reenviarlo al ZuulController
@Override Protected Object LookupHandler (String urlPath, httpservletRequest solicitud) lanza la excepción {if (this.errorController! = Null && urlpath.equals (this.errorController.getErrorPath ())) {return null; } String [] ignored = this.routelocator.getignoredPaths (). ToArray (nueva cadena [0]); if (patrónMatchUtils.simplematch (ignored, urlpath)) {return null; } RequestContext ctx = requestContext.getCurrentContext (); if (ctx.containskey ("hacia adelante.to")) {return null; } if (this.Dirty) {SynChronized (this) {if (this.Dirty) {RegisterHandlers (); this.dirty = false; }}} return super.lookupHandler (urlpath, solicitud); }Las reglas de solicitud se inicializan como verdaderas al acceder a la primera vez.
Private void RegisterHandlers () {colección <rute> rutas = this.routelocator.getRoutes (); if (rutas.isEmpty ()) {this.logger.warn ("no se encuentran rutas en rutelocator"); } else {para (ruta ruta: rutas) {registreHandler (ruta.getFullPath (), this.zuul); }}}El segundo paso de ZuulController hereda ServletwrappingController transferirá la solicitud a Zuulservlet de la siguiente manera
/** * @author Spencer Gibb */public class ZuulController extiende ServletwrappingController {public ZuulController () {setServletClass (zuulservlet.class); setServletName ("Zuul"); setSupportedMethods ((cadena []) nulo); // Permitir todos} @Override public ModelAndView HandLerequest (HTTPServletRequest solicitud, respuesta httpServletResponse) lanza la excepción {try {// No nos importan las otras características de la clase base, solo queremos // manejar la solicitud súper.handlerequestinternal (solicitud, respuesta); } Finalmente {// @see com.netflix.zuul.context.contextlifecycleFilter.dofilter requestContext.getCurrentContext (). Unset (); }}}El tercer paso es el método de servicio de Zuulservlet de la siguiente manera: pre, ruta y postroute.
@Override public void Service (javax.servlet.servletRequest ServletRequest, javax.servlet.servletResponse ServletResponse) lanza ServletException, ioexception {try {init ((httpservletRequest) ServletRequest, (httpservletRetRetResponse); // marca esta solicitud como haber pasado a través del "motor Zuul", a diferencia de los servlets // explícitamente unidos en Web.xml, para el cual las solicitudes no tendrán los mismos datos adjuntos requestedContext context = requestContext.getCurrentContext (); context.setzuulengineran (); intente {preroute (); } catch (ZuulException e) {error (e); postroute (); devolver; } try {ruta (); } catch (ZuulException e) {error (e); postroute (); devolver; } try {postroute (); } catch (ZuulException e) {error (e); devolver; }} catch (showable e) {error (nueva zuulexception (e, 500, "unhandled_exception_" + e.getClass (). getName ())); } Finalmente {requestContext.getCurrentContext (). Unset (); }}4. Finalmente, el SendResponseFilter ejecuta el resultado y el FilterOrge es 1000. Por lo tanto, es mejor publicar Filter no exceder 1000, de lo contrario el resultado de retorno se verá afectado.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.