天天看點

spring cloud gateway 配置分析自動配置類清單spring.factoriesGatewayClassPathWarningAutoConfigurationGatewayLoadBalancerClientAutoConfigurationGatewayDiscoveryClientAutoConfigurationGatewayMetricsAutoConfigurationRedisAutoConfigurationGatewayAutoConfiguration總結

srping cloud gateway 版本: 2.0.2

自動配置類清單spring.factories

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration,\
org.springframework.cloud.gateway.config.GatewayAutoConfiguration,\
org.springframework.cloud.gateway.config.GatewayLoadBalancerClientAutoConfiguration,\
org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration,\
org.springframework.cloud.gateway.config.GatewayRedisAutoConfiguration,\
org.springframework.cloud.gateway.discovery.GatewayDiscoveryClientAutoConfiguration
           
  • GatewayClassPathWarningAutoConfiguration

    依賴檢查類

  • GatewayAutoConfiguration

    主配置類

  • GatewayLoadBalancerClientAutoConfiguration

    負載均衡用戶端配置

  • GatewayMetricsAutoConfiguration

    度量配置

  • GatewayRedisAutoConfiguration

    redis配置

  • GatewayDiscoveryClientAutoConfiguration

    自動發現用戶端配置

GatewayClassPathWarningAutoConfiguration

這個主要是檢查:

  1. 如果有spring-boot-starter-web, 提示移除
  2. 如果沒有spring-boot-starter-webflux 提示添加

GatewayLoadBalancerClientAutoConfiguration

依賴RibbonAutoConfiguration建立的LoadBalancerClient

使用LoadBalancerClient建立了LoadBalancerClientFilter

GatewayDiscoveryClientAutoConfiguration

建立List: lb://+serviceId

建立List : RewritePath ‘/’ + serviceId + ‘/(?.*)’ => ‘/${remaining}’

建立DiscoveryLocatorProperties

建立DiscoveryClientRouteDefinitionLocator

GatewayMetricsAutoConfiguration

建立GatewayMetricsFilter過濾器

RedisAutoConfiguration

建立redisTemplate

GatewayAutoConfiguration

@Configuration
//spring.cloud.gateway.enabled 決定是否打開網關, 預設打開
@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMissing = true)
@EnableConfigurationProperties
@AutoConfigureBefore(HttpHandlerAutoConfiguration.class)
@AutoConfigureAfter({ GatewayLoadBalancerClientAutoConfiguration.class,
		GatewayClassPathWarningAutoConfiguration.class })
@ConditionalOnClass(DispatcherHandler.class)
           

建立NettyConfiguration

  • 建立HttpClientProperties
  • 建立nettyClientOptions: connectTimeout, ssl, pool, proxy
  • 建立HttpClient
  • 建立NettyRoutingFilter
  • 建立NettyWriteResponseFilter
  • 建立ReactorNettyWebSocketClient

建立HiddenHttpMethodFilter

建立RouteLocatorBuilder

建立GatewayProperties

這裡從屬性檔案中建立路由器配置和預設過濾器配置:

List routes ;

List defaultFilters ;

List streamingMediaTypes ;

建立 PropertiesRouteDefinitionLocator

PropertiesRouteDefinitionLocator實作了RouteDefinitionLocator, 儲存了從GatewayProperties擷取的RouteDefinition

建立 InMemoryRouteDefinitionRepository

InMemoryRouteDefinitionRepository 實作了RouteDefinitionLocator, 儲存了運作時建立的RouteDefinition

建立CompositeRouteDefinitionLocator(Primary RouteDefinitionLocator)

合并InMemoryRouteDefinitionRepository,PropertiesRouteDefinitionLocator,

DiscoveryClientRouteDefinitionLocator 及任何自定義的RouteDefinitionLocator

建立RouteLocator

@Bean
	public RouteLocator routeDefinitionRouteLocator(GatewayProperties properties,
												   List<GatewayFilterFactory> GatewayFilters,
												   List<RoutePredicateFactory> predicates,
												   RouteDefinitionLocator routeDefinitionLocator) {
		return new RouteDefinitionRouteLocator(routeDefinitionLocator, predicates, GatewayFilters, properties);
	}
           

使用GatewayProperties+所有的GatewayFilterFactory+所有的RoutePredicateFactory + 上面建立的CompositeRouteDefinitionLocator

建立路由器清單RouteDefinitionRouteLocator

建立CachingRouteLocator (Primary RouteLocator)

使用CachingRouteLocator包裝RouteDefinitionRouteLocator

建立RouteRefreshListener

監聽上下文事件, 必要時重新整理CachingRouteLocator的緩存

建立GlobalCorsProperties

全局跨域通路配置

建立FilteringWebHandler

過濾器處理核心類, 在這裡組裝過濾器鍊.

建立RoutePredicateHandlerMapping

請求處理核心類, 使用FilteringWebHandler+RouteLocator+GlobalCorsProperties+Environment 建立, 所有的請求處理都在這裡組裝.

建立SecureHeadersProperties

http頭部和安全相關的配置

建立ForwardedHeadersFilter 過濾器

建立RemoveHopByHopHeadersFilter過濾器

建立XForwardedHeadersFilter過濾器

建立全局過濾器

  • AdaptCachedBodyGlobalFilter
  • RouteToRequestUrlFilter
  • ForwardRoutingFilter
  • ForwardPathFilter
  • WebsocketRoutingFilter
  • WeightCalculatorWebFilter

建立predicate factory

  • AfterRoutePredicateFactory
  • BeforeRoutePredicateFactory
  • BetweenRoutePredicateFactory
  • CookieRoutePredicateFactory
  • HeaderRoutePredicateFactory
  • HostRoutePredicateFactory
  • MethodRoutePredicateFactory
  • PathRoutePredicateFactory
  • QueryRoutePredicateFactory
  • ReadBodyPredicateFactory
  • RemoteAddrRoutePredicateFactory
  • WeightRoutePredicateFactory
  • CloudFoundryRouteServiceRoutePredicateFactory

建立内置過濾器

  • AddRequestHeaderGatewayFilterFactory
  • AddRequestParameterGatewayFilterFactory
  • AddResponseHeaderGatewayFilterFactory
  • HystrixGatewayFilterFactory
  • ModifyRequestBodyGatewayFilterFactory
  • ModifyResponseBodyGatewayFilterFactory
  • PrefixPathGatewayFilterFactory
  • PreserveHostHeaderGatewayFilterFactory
  • RedirectToGatewayFilterFactory
  • RemoveRequestHeaderGatewayFilterFactory
  • RemoveResponseHeaderGatewayFilterFactory
  • RequestRateLimiterGatewayFilterFactory
  • RewritePathGatewayFilterFactory
  • RetryGatewayFilterFactory
  • SetPathGatewayFilterFactory
  • SecureHeadersGatewayFilterFactory
  • SetRequestHeaderGatewayFilterFactory
  • SetResponseHeaderGatewayFilterFactory
  • SetStatusGatewayFilterFactory
  • SaveSessionGatewayFilterFactory
  • StripPrefixGatewayFilterFactory
  • RequestHeaderToRequestUriGatewayFilterFactory

建立gatewayControllerEndpoint

總結

spring cloud gateway的建立是比較複雜的, 核心類是GatewayAutoConfiguration, 它做了以下幾件事:

  • 配置了Netty
  • 建立GatewayProperties, 這裡從屬性檔案中擷取了路由器定義和預設過濾器定義
  • 建立了屬性RouteDefinitionLocator, 記憶體RouteDefinitionLocator和自動發現服務RouteDefinitionLocator, 并且将這三者合并為CompositeRouteDefinitionLocator
  • 使用GatewayProperties+所有的GatewayFilterFactory,RoutePredicateFactory+CompositeRouteDefinitionLocator建立路由器清單RouteLocator, 這個東西包含所有.
  • 建立了一批全局過濾器
  • 建立過濾器處理類 FilteringWebHandler
  • 建立請求處理類 RoutePredicateHandlerMapping

繼續閱讀