spring cloud gateway 配置分析

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】
免费领取 2000+ 道 Java 面试题

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

来源:http://ddrv.cn/a/88268

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » spring cloud gateway 配置分析

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏