Existem algumas pequenas mudanças na implementação de várias versões do Zuul, e a ideia geral de implementação não mudou. Pegue a mola-nucle-netflix-core-1.3.6.Release como exemplo.
1. Classes importantes de inicialização de zuul
org.springframework.cloud.netflix.zuul.zuullerverautoconfiguration
org.springframework.cloud.netflix.zuul.zuulproxyautoconfiguration
org.springframework.cloud.netflix.zuul.zuulfilterinitializer
org.springframework.cloud.netflix.zuul.ribbonCommandFactoryConfiguration
Zuulserverautoconfiguration
Inicialize as regras de roteamento
Inicialize alguns filtros importantes, como filtro de predecoration, RibbonRoutingFilter
Inicialize o zuulfilterinitializer
Inicialize o ZuulHandlerMapping
O código é o seguinte
// REGRAS DE ROTAMENTO @Bean @conditionalonMissingBean (DiscoveryclientRoutelocator.class) public DiscoveryclientRoutelocator DiscoveryRoutelocator () {return DiscoveryclientRoutelocator (this.server.getServletPrefix, this.discoverem, thisSer.zuulProPRIRIES; } // pré -filtros @Bean public PredecorationFilter PredecorationFilter (Routelocator Routelocator, ProxyRequestHelper ProxyRequestHelper) {return New PredecorationFilter (Routelocator, this.server.getSlevPrefix (), this.ZuLocReRies, } // Filtros de rota @Bean public RibbonRoutingFilter RibbonRoutingFilter (ProxyRequestHelper Helper, RibbonCommandFactory <?> RibBonCommandFactory) {RibbonRoutingFilter filtro = RibBonRoutingFilter (RibbonComProndFactory, thispurs.Test. retorno filtro; } @Configuration Classe estática protegida ZuulfilterConfiguration {@AUTOWIRED PRIVADO MAP <String, Zuulfilter> filtros; @Bean public zuulfilterinitializer zuulfilterinitializer (contracporptório contracteractorial, tracerfactory tracerFacer) {filtroLloaderLloader = FilterLoader.getInstance (); FiltraRregistry filterregistry = filterregistry.instance (); retornar o novo zuulfilterinitializer (this.filters, contrafactory, tracerFactory, FilterLoader, FilterRegistry); }} @Bean public zuulController zuulController () {return new zuulController (); } @Bean Public ZuulHandlerMapping ZuulHandlerMapping (rotas Routelocator) {ZuulHandlerMapping Mapping = New ZuulHandlerMapping (rotas, zuulController ()); Mapping.setErrorController (this.errorController); retornar mapeamento; }Zuulproxyautoconfiguration
ZuulproxAutoconfiguration herda a zuulsserverautoconfiguração e o zuullerverautoconfiguração
A principal função é adicionar a configuração do RibBonCommandFactoryConfiguration e inicializar todos os métodos para implementar a faixa de opções, como Apache, Okhttp.
Zuulfilterinitializer
A função desta classe é principalmente registrar o filtro inicializado no filtro de Zuul. O FilterRegistry é um singleton usado para inicializar informações de roteamento e é usado em zuulrunner
RibbonCommandFactoryConfiguration
A principal função é configurar o encaminhamento, e a implementação inclui principalmente Apache, Okhttp
2. A implementação de encaminhamento de Zuul
Primeiro, o primeiro passo é ir para o método LookupHandler em ZuulHandlerMapping e encaminhá -lo para o ZuulController
@Override Protected Object LookupHandler (String urlpath, httpServletRequest request) lança a exceção {if (this.errorController! = Null && urlpath.equals (this.errorController.geterrorpor ()) {return null; } String [] ignorada = this.Routelocator.getInoredPaths (). ToArray (new String [0]); if (PatternMatchutils.simplematch (ignorado, 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; }}} retornar super.lookupHandler (urlpath, solicitação); }As regras de solicitação são inicializadas como verdadeiras ao acessar a primeira vez.
private void RegisterHandlers () {coleção <ToTer> rotas = this.Routelocator.getRoutes (); if (rotas.isEmpty ()) {this.logger.warn ("Nenhuma rotas encontradas do Routelocator"); } else {for (rota de rota: rotas) {registerHandler (route.getfullpath (), this.zuul); }}}A segunda etapa do ZuulController Herits ServletWrappingController transferirá a solicitação para o Zuulservlet da seguinte maneira
/** * @author spencer gibb */public class zuulController estende servletwrappingcontroller {public zuulController () {setServletClass (zulerServlet.class); SetServletName ("Zuul"); SetSupportDMethods ((String []) NULL); // Permitir tudo} @Override Public ModelAndView HandleReQuest (solicitação httpServletRequest, httpServletResponse resposta) lança exceção {tente {// não nos importamos com os outros recursos da classe base, apenas queremos // lidar com a solicitação Retornar Super.HandleReQuestinternal (solicitação, resposta); } finalmente {// @see com.netflix.zuul.context.contextlifecyclefilter.dofilter requestcontext.getCurrentContext (). unset (); }}}O terceiro passo é o método de serviço da Zuulservlet da seguinte forma: PRE, ROTA e POSTROUTE.
@Override public void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws ServletException, IOException { try { init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse); // marca essa solicitação como tendo passado pelo "Zuul Engine", em oposição aos servlets // explicitamente vinculado no web.xml, para o qual as solicitações não terão os mesmos dados conectados contextContext = requestcontext.getCurrentContext (); context.setzuulengineRan (); tente {prerote (); } catch (zuulException e) {error (e); postroute (); retornar; } tente {rota (); } catch (zuulException e) {error (e); postroute (); retornar; } tente {postroute (); } catch (zuulException e) {error (e); retornar; }} catch (throwable e) {Error (new ZuuLexception (e, 500, "uncamled_exception_" + e.getclass (). getName ())); } finalmente {requestcontext.getCurrentContext (). Unset (); }}4. Finalmente, o SendResponseFilter executa o resultado e o FilterOrder é 1000. Portanto, é melhor postar filtro não exceder 1000, caso contrário, o resultado do retorno será afetado.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.