Zuulのさまざまなバージョンの実装にいくつかの小さな変更があり、全体的な実装のアイデアは変更されていません。例として、Spring-Cloud-Netflix-Core-1.3.6.Releaseを取ります。
1。ズールの重要な初期化クラス
org.springframework.cloud.netflix.zuul.zuulserverautoconfiguration
org.springframework.cloud.netflix.zuul.zuulproxyautoconfiguration
org.springframework.cloud.netflix.zuul.zulfilterinitializer
org.springframework.cloud.netflix.zuul.ribboncommandfactoryconfiguration
Zuulserverautoconfiguration
ルーティングルールを初期化します
PredcorationFilter、RibbonRoutingFilterなどのいくつかの重要なフィルターを初期化します
Zuulfilterinitializerを初期化します
ZuulhandLermappingを初期化します
コードは次のとおりです
//ルールのルーティング@bean @conditionalonmissingbean(discoveryclientRoutelocator.class)public discoveryclientRouteLocator discoveryRouteLocator(){return new discoveryClientRoutelocator(this.server.getServletprefix()、this.discovery、thiszuulproperties; } //プリフィルター@bean public predecorationfilter predecorationfilter(Routelocator RouteLocator、ProxyRequesthelper ProxyRequesthelper){return exe cerdocorationFilter(this.server.getServletprefix()、this.zuulproperties、penoxyrequesthelperperperties; } //ルートフィルター@bean public ribbonroutingfilter ribbonRoutingfilter(proxyRequesthelperヘルパー、RibbonCommandFactory <?> RibbonRoutingFilter Filter = new RibbonRoutingFilter(ヘルパー、RibbonCommandFactory、This.RequestCustomizersers);返品フィルター。 } @configuration Static class zulfilterconfiguration {@autowired private Map <String、Zulfilter>フィルター; @Bean public ZuulfilterInitializer ZuulfilterInitializer(CounterFactory CounterFactory、TracerFactory TracerFactory){filterloader filterloader = filterloader.getInstance(); filterregistry filterregistry = filterregistry.instance(); new Zuulfilterinitializer(this.filters、counterfactory、tracerfactory、filterloader、filterregistry)を返します。 }} @bean public zuulcontroller zuulcontroller(){return new ZuulController(); } @bean public zuulhandlermapping zuulhandlermapping(routeLocatorルート){ZuulhandLermappingマッピング= new ZuulhandLermapping(Routes、ZuulController()); mapping.setErrorController(this.ErrorController);マッピングを返す; }Zuulproxyautoconfiguration
Zuulproxautoconfiguration ZuulserverautoconfigurationとZuulserverautoconfigurationを継承します
主な機能は、RibbonCommandFactoryConfigurationの構成を追加し、すべてのメソッドを初期化してApache、Okhttpなどのリボンを実装することです。
Zuulfilterinitializer
このクラスの機能は、主に初期化されたフィルターをZuulのFilterRegistryに登録することです。 FilterRegistryはルーティング情報の初期化に使用されるシングルトンであり、Zuulrunnerで使用されています
RibbonCommandFactoryConfiguration
主な機能は転送を構成することであり、実装には主にApache、okhttpが含まれます
2。Zuulの転送実装
まず、最初のステップはZuulhandLermappingのLookuphandlerメソッドに移動し、ZuulControllerに転送することです
@Override Protected Object lookuphandler(String urlpath、httpservletrequest request)throws exception {if(this.errorcontroller!= null && urlpath.equals(this.errorcontroller.geterrorpath()){return null; } string []無視= this.routelocator.getignoredPaths()。toarray(new String [0]); if(patternmatchutils.simplematch(無視、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); }リクエストルールは、初めてアクセスするときにtrueとして初期化されます。
private void RegisterHandlers(){collection <route> routes = this.routelocator.getRoutes(); if(routes.isempty()){this.logger.warn( "Routelocatorからルートが見つかりません"); } else {for(route route:routes){registerhandler(route.getfullath()、this.zuul); }}}ZuulControllerの2番目のステップがサーブレットラッピングコントローラーを継承します。
/** * @Author Spencer gibb */public class zuulcontroller extends servletwrappingcontroller {public zuulcontroller(){setservletclass(zuulservlet.class); setServletName( "zuul"); SetSupportedMethods((string [])null); //すべてを許可} @OverrideパブリックモデルアンドビューHandLeReQuest(HTTPSERVLETREQUESTリクエスト、httpservletResponse応答)スロー例外{//ベースクラスの他の機能については気にしません。 }最後に{// @see com.netflix.zuul.context.contextlifecyclefilter.dofilter requestcontext.getCurrentContext()。unset(); }}}3番目のステップは、次のようにZuulservletのサービス方法です:Pre、Route、およびPostroute。
@Override public void Service(javax.servlet.servletrequest servletrequest、javax.servlet.servletResponse servletResponse)Servletexception、ioexception {try {init((httpservletrequest)servletrequest、(httpservletresponse)servletresponse); //このリクエストは、「Zuulエンジン」を通過したとマークします。これは、サーブレットとは対照的に// web.xmlで明示的にバインドされています。これは、リクエストに同じデータが添付されていません。 context.setzuulengineran(); try {preroute(); } catch(zuulexception e){error(e); postroute();戻る; } try {route(); } catch(zuulexception e){error(e); postroute();戻る; } try {postroute(); } catch(zuulexception e){error(e);戻る; }} catch(throwable e){error(new zuulexception(e、500、 "unhandled_exception_" + e.getclass()。getname())); }最後に{requestContext.getCurrentContext()。unset(); }}4.最後に、sendResponseFilterは結果を実行し、フィルターオーダーは1000です。したがって、フィルターを1000を超えないことを投稿するのが最適です。そうしないと、返品結果が影響を受けます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。