هناك بعض التغييرات الطفيفة في تنفيذ إصدارات مختلفة من Zuul ، ولم تتغير فكرة التنفيذ الشاملة. خذ spring-cloud-netflix-core-1.3.6.release كمثال.
1. فئات التهيئة المهمة من 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
تهيئة قواعد التوجيه
تهيئة بعض المرشحات المهمة مثل SpectorationFilter و RibbonRoutingFilter
تهيئة zuulfilterinitializer
تهيئة zuulhandlermapping
الرمز كما يلي
// قواعد التوجيه bean @conditionalonmissingbean (DiscoveryClientRoutElocator.class) discoveryclientrouteLocator discoveryRouteLocator () {return new DiscoveryClientRoutElocator (this.server.getServletprefix () ، this.discovery ، this.zuulperties ، this.SevIceries ؛ }. }. مرشح الإرجاع } configuration محمية فئة ثابتة ZuulfilterConfiguration {autowired map <string ، zuulfilter> filters ؛ 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 Routes) {ZuulHandLermapping Mapping = new ZuulHandlerMapping (Routes ، ZuulController ()) ؛ mapping.seterRorController (this.errorController) ؛ رسم الخرائط }zuulproxyautoconfiguration
Zuulproxautoconfiguration يرث Zuulserverautoconfiguration و zuulserverautoconfiguration
تتمثل الوظيفة الرئيسية في إضافة تكوين التشكيل RIBBONCOMMANDFACTORYCONTING ، وتهيئة جميع الطرق لتنفيذ الشريط مثل Apache و OKHTTP.
Zuulfilterinitializer
تتمثل وظيفة هذه الفئة بشكل أساسي في تسجيل المرشح المهيئ في مرشح Zuul. Filterregistry عبارة عن مفردة تستخدم لتهيئة معلومات التوجيه وتستخدم في Zuulrunner
ribboncommandfactoryconfiguration
الوظيفة الرئيسية هي تكوين إعادة التوجيه ، والتنفيذ يتضمن بشكل أساسي Apache ، OKHTTP
2. تنفيذ إعادة توجيه Zuul
أولاً ، الخطوة الأولى هي الانتقال إلى طريقة LookupHandler في Zuulhandlermapping ، وإعادة توجيهها إلى ZuulController
Override محمي الكائن LookupHandler (سلسلة urlpath ، httpservletrequest) يلقي الاستثناء {if (this.errorController! = null && urlpath.equals (this.errorController.geterRorpath ())) {return null ؛ } string [] تجاهل = this.routElocator.getIgnoredPaths (). tararray (سلسلة جديدة [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) ؛ }تتم تهيئة قواعد الطلب على أنها صحيحة عند الوصول إلى المرة الأولى.
private void registerHandlers () {collection <Troute> Routes = this.RoutElocator.getRoutes () ؛ if (routes.isempty ()) {this.logger.warn ("لا توجد طرق موجودة من RoutElocator") ؛ } آخر {for (Route Route: Routes) {registerHandler (route.getfullPath () ، this.zuul) ؛ }}}ستنقل الخطوة الثانية من ZuulController servletWrappingController طلب إلى Zuulservlet على النحو التالي
/** * Author Spencer gibb */public class ZuulController يمتد ServleTWrappingController {public ZuulController () {setServletClass (zuulservlet.class) ؛ setServletName ("Zuul") ؛ setSupportedMethods ((سلسلة []) فارغة) ؛ // السماح لجميع} Override PublicandView HandleRequest (HttPservletRequest request ، httpservletresponse) يلقي الاستثناء {try {// نحن لا نهتم بالميزات الأخرى للفئة الأساسية ، فقط نريد // } أخيرًا {//see com.netflix.zuul.context.contextLifecyClefilter.dofilter requestContext.getCurrentContext (). unset () ؛ }}}والخطوة الثالثة هي طريقة خدمة Zuulservlet على النحو التالي: ما قبل ، المسار ، و Postroute.
Override Public Void Service (javax.servlet.servletrequest servletrequest ، javax.servlet.servletresponse servletResponse) يلقي servletexception ، ioException {try {init ((httpservlevletrequest) servletRequest ، (httpletresponseponse) ؛ // يصادف هذا الطلب على أنه تم تمريره عبر "Zuul Engine" ، بدلاً من servlets // مرتبط بشكل صريح في web.xml ، والتي لن يكون لها الطلبات نفس البيانات المرفقة Context Context = requestContext.getCurrentContext () ؛ context.setzuulengineran () ؛ حاول {preroute () ؛ } catch (zuulexception e) {error (e) ؛ postroute () ؛ يعود؛ } جرب {route () ؛ } catch (zuulexception e) {error (e) ؛ postroute () ؛ يعود؛ } جرب {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 أكثر.