ZUUL源碼分析 <一

一,開啓ZUUL支持標識

加入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初始化配置

更多初始化具體的配置,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

 

1. ZuulServerAutoConfiguration

@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信息處理等

 

2, ZuulProxyAutoConfiguration

@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的請求

相關文章
相關標籤/搜索