Существуют некоторые незначительные изменения в реализации различных версий Zuul, и общая идея реализации не изменилась. Возьмите Spring-Cloud-Netflix-Core-1.3.6.Serease В качестве примера.
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
Инициализировать правила маршрутизации
Инициализировать некоторые важные фильтры, такие как предшественник, ленточный
Инициализировать ZuulfilterInitializer
Инициализировать Zuulhandlermapp
Код выглядит следующим образом
// Правила маршрутизации @bean @conditionalonmissingbean (discoveryclientrouteLocator.class) public DiscoveryClientRouteLocator DiscoveryRouteLocator () {return neversiveClientRouteLocator (this.server.getServletPrefix (), это. } // Предварительные фильтры @Bean Public PrececorationFilter PrececorationFilter (RouteLocator RouteLocator, ProxyRequestHelper ProxyRequestper) {return New PrecorationFilter (RouteLocator, this.server.getServletprefix (), this.zuulproperties, proxyrequestper); } // Фильтры маршрута @bean public ленточная ленточка ленточная ленточная лента (Proxyrequesthelper, ribboncommandfactory <?> ribboncommandfactory) {ленточный фильтр = новый ribbonroutingfilter (helper, ribboncommandfactory, this.requestcustcustmizers); вернуть фильтр; } @Configuration Защищенный статический класс ZuulfilterConfiguration {@autowired Private Map <String, Zuulfilter> Filters; @Bean public ZuulfilterInitializer ZuulfilterInitializer (Counterfactory Counterfactory, TracerFactory TracerFactory) {FilterLoader FilterLoader = FilterLoader.getInstance (); FilterREGEREREREREGISTION = FilterRegistry.Instance (); вернуть новый ZuulfilterInitializer (this.filters, Counterfactory, TracerFactory, FilterLoader, FilterRegistry); }} @Bean public Zuulcontroller zuulcontroller () {return new zuulcontroller (); } @Bean public Zuulhandlermapping zuulhandlermapping (RateLocator Routes) {ZuulHandlerMapping Mapping = new ZuulHandlerMapp (Routes, ZuulController ()); mapping.seterrorcontroller (this.errorcontroller); отображение возврата; }Zuulproxyautoconfiguration
ZuulproxAutoConfiguration наследует ZuulserVerautoconfiguration и Zuulserverautoconfiguration
Основная функция состоит в том, чтобы добавить конфигурацию ленточной связи, и инициализировать все методы для реализации ленты, такой как Apache, OKTTP.
Zuulfilterinitializer
Функция этого класса состоит в том, чтобы зарегистрировать инициализированный фильтр для фильтрации Zuul. Filter Registry - это синглтон, используемый для инициализации информации о маршрутизации, и используется в Zuulrunner
RibbonCommandFactoryConfiguration
Основная функция заключается в настройке пересылки, и реализация в основном включает в себя Apache, OKTTP
2. Переадресация реализации Zuul
Во -первых, первый шаг - перейти к методу Lookupuphandler в Zuulhandlermapp и перенаправить его в Zuulcontroller
@Override защищенный объект LookupHandler (String urlpath, httpservlectrequest) бросает исключение {if (this.errorcontroller! = Null && urlpath.equals (this.errorcontroller.geterrorpath ())) {return null; } String [] игнорируется = this.routeLocator.getignoredPaths (). Toarray (new String [0]); if (pattermatchutils.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 <route> routes = this.routeLocator.getRoutes (); if (routes.isempty ()) {this.logger.warn ("Нет маршрутов из RateLocator"); } else {for (route route: routes) {RegisterHandler (route.getFullPath (), this.zuul); }}}Второй этап ZuulController наследует ServletRappingController, передав запрос Zuulservlet следующим образом
/** * @author spencer gibb */public class zuulcontroller extends servletwrappingController {public ZuulController () {setServletClass (zuulservlet.class); setServletName ("Zuul"); setSupportedMethods (((String []) null); // Разрешить All} @Override public modelandView handleRequest (httpservletrequest, httpservletresponse response) выбрасывает исключение {try {// Мы не заботимся о других функциях базового класса, просто хотим // обработать запрос return super.handlerequestintal (запрос, ответ); } наконец {// @see com.netflix.zuul.context.contextlifecyclefilter.dofilter requestContext.getCurrentContext (). unset (); }}}Третий шаг - метод обслуживания Zuulservlet следующим образом: Pre, Route и Postroute.
@Override public void service (javax.servlet.servletrequest servletrequest, javax.servlet.servletresponse servletresponse) throws servletexception, ioexception {try {init (httpservletrequest) servletrequest, (httpservelponse) servletresponse); // отмечает этот запрос как проходящий через «Zuul Engine», в отличие от сервлетов // явно связанных в web.xml, для которых запросы не будут иметь те же прилагаемые данные Context context = requestContext.getCurrentContext (); 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, "Unkandled_exception_" + e.getClass (). getName ())); } наконец {requestContext.getCurrentContext (). unset (); }}4. Наконец, SendResponseFilter выполняет результат, а фильтр составляет 1000. Следовательно, лучше всего публиковать фильтр не превышать 1000, в противном случае поврежден результат возврата.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.