spring cloud gateway 配置分析

2019-01-05  本文已影响0人  阿亚2011

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

这个主要是检查:

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

GatewayLoadBalancerClientAutoConfiguration

依赖RibbonAutoConfiguration创建的LoadBalancerClient
使用LoadBalancerClient创建了LoadBalancerClientFilter

GatewayDiscoveryClientAutoConfiguration

创建List<PredicateDefinition>: lb://+serviceId
创建List<FilterDefinition> : RewritePath '/' + serviceId + '/(?<remaining>.*)' => '/${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
创建HiddenHttpMethodFilter
创建RouteLocatorBuilder
创建GatewayProperties

这里从属性文件中创建路由器配置和默认过滤器配置:
List<RouteDefinition> routes ;
List<FilterDefinition> defaultFilters ;
List<MediaType> 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过滤器
创建全局过滤器
创建predicate factory
创建内置过滤器
创建gatewayControllerEndpoint

总结

spring cloud gateway的创建是比较复杂的, 核心类是GatewayAutoConfiguration, 它做了以下几件事:

上一篇 下一篇

猜你喜欢

热点阅读