加入zuul通常以下java
@EnableZuulProxy @SpringCloudApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
其中@EnableZuulProxy是開啓zuul的功能支持。web
跟蹤進EnableZuulProxy,源碼以下spring
@EnableCircuitBreaker @EnableDiscoveryClient @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(ZuulProxyMarkerConfiguration.class) public @interface EnableZuulProxy { }
除了引入discoveryClient註冊eureka外,主要就作了一件事,引入了ZuulProxyMarkerConfiguration,@Import(ZuulProxyMarkerConfiguration.class), ZuulProxyMarkerConfiguration新建了個Marker的bean返回。app
以下:ui
@Configuration public class ZuulProxyMarkerConfiguration { @Bean public Marker zuulProxyMarkerBean() { return new Marker(); } class Marker { } }
後面的zuul配置會根據是否有這個maker對象而使配置生效spa
@ConditionalOnBean(ZuulServerMarkerConfiguration.Marker.class).net
更多初始化具體的配置,zuul是用的SPI方式進行debug
SPI入口日誌
用SPI管理全部註冊,spring.factories以下:code
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration,\ org.springframework.cloud.netflix.feign.ribbon.FeignRibbonClientAutoConfiguration,\ org.springframework.cloud.netflix.feign.FeignAutoConfiguration,\ org.springframework.cloud.netflix.feign.encoding.FeignAcceptGzipEncodingAutoConfiguration,\ org.springframework.cloud.netflix.feign.encoding.FeignContentGzipEncodingAutoConfiguration,\ org.springframework.cloud.netflix.hystrix.HystrixAutoConfiguration,\ org.springframework.cloud.netflix.hystrix.security.HystrixSecurityAutoConfiguration,\ org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration,\ org.springframework.cloud.netflix.rx.RxJavaAutoConfiguration,\ org.springframework.cloud.netflix.metrics.servo.ServoMetricsAutoConfiguration,\ org.springframework.cloud.netflix.zuul.ZuulServerAutoConfiguration,\ org.springframework.cloud.netflix.zuul.ZuulProxyAutoConfiguration org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker=\ org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration org.springframework.boot.env.EnvironmentPostProcessor=\ org.springframework.cloud.netflix.metrics.ServoEnvironmentPostProcessor
其中和zuul相關初始化的主要是
org.springframework.cloud.netflix.zuul.ZuulServerAutoConfiguration
和
org.springframework.cloud.netflix.zuul.ZuulProxyAutoConfiguration
@Configuration @EnableConfigurationProperties({ ZuulProperties.class }) @ConditionalOnClass(ZuulServlet.class) @ConditionalOnBean(ZuulServerMarkerConfiguration.Marker.class) //這裏用到上面的@EnableZuulProxy的引入作判斷 // Make sure to get the ServerProperties from the same place as a normal web app would @Import(ServerPropertiesAutoConfiguration.class) public class ZuulServerAutoConfiguration { @Autowired protected ZuulProperties zuulProperties; @Autowired protected ServerProperties server; @Autowired(required = false) private ErrorController errorController; ... ...
屬性相關
ZuulProperties zuulProperties; // yml裏的配置,zuul開頭相關配置在這注入
ServerProperties server; // yml裏的配置,zuul開頭相關配置在這注入
ErrorController errorController; //處理錯誤的controller,自定義實現
幾個重要bean:
ZuulController 接管全部的請求,把全部請求交給zuulServlet去處理,全部請求會先到zuulcontroler再轉到zuulServlet
ZuulRefreshListener 經過監聽spring Context發佈機制事件,監聽心跳消息
幾個重要Filter:
按ORDER的從小到大排列
ServletDetectionFilter -- PRE -3. 判斷是不是走spring MVC仍是直接走zuulservlet的, 並賦值 IS_DISPATCHER_SERVLET_REQUEST_KEY
Servlet30RequestWrapper -PRE -2. 把RequestServlet轉換Servlet30RequestWrapper
FormBodyWrapperFilter -PRE -1. 封裝成FormBodyRequestWrapper
DebugFilter -PRE 1. 用於動態開啓debug日誌,zuul.debug.request=true 開啓debug模式
還幾個核心flter註冊在 org.springframework.cloud.netflix.zuul.ZuulProxyAutoConfiguration
PreDecorationFilter PRE 5, PreDecorationFilter 添加頭,serviceId信息處理等
@Configuration @Import({ RibbonCommandFactoryConfiguration.RestClientRibbonConfiguration.class, RibbonCommandFactoryConfiguration.OkHttpRibbonConfiguration.class, RibbonCommandFactoryConfiguration.HttpClientRibbonConfiguration.class }) @ConditionalOnBean(ZuulProxyMarkerConfiguration.Marker.class) public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { @SuppressWarnings("rawtypes") @Autowired(required = false) private List<RibbonRequestCustomizer> requestCustomizers = Collections.emptyList(); @Autowired private DiscoveryClient discovery; @Autowired private ServiceRouteMapper serviceRouteMapper;
導入Ribbon相關的類
屬性相關
DiscoveryClient discovery; // eureka客戶端, eureka相關操做,如:根據serviceId獲取實例全部機器列表
重要的Filter
PreDecorationFilter // 處理請求頭,serviceId等信息的地方
RibbonRoutingFilter. //真正作轉發的Filter,封裝了nitfilx 全家桶的地方
SimpleHostRoutingFilter // 轉發不走eureka的請求