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
這個主要是檢查:
- 如果有spring-boot-starter-web, 提示移除
- 如果沒有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