Spring Cloud Gateway 配置分析

自动配置类列表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<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

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

创建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过滤器

创建全局过滤器

  • 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Spring Cloud Gateway配置跨域,可以使用 Spring WebFlux 提供的 CorsConfigurationSource 类。具体步骤如下: 1. 创建一个 CorsConfiguration 对象,配置跨域的属性,比如允许的域名、允许的请求方法等。 ``` CorsConfiguration corsConfig = new CorsConfiguration(); corsConfig.addAllowedOrigin("*"); corsConfig.addAllowedMethod("*"); corsConfig.addAllowedHeader("*"); ``` 2. 创建一个 CorsConfigurationSource 对象,将 CorsConfiguration 对象传入其中。 ``` UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfig); ``` 3. 在 Spring Cloud Gateway配置类中将 CorsConfigurationSource 对象添加到路由过滤器中。 ``` @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route(r -> r.path("/api/**") .filters(f -> f.cors(corsConfigSource)) // 添加跨域过滤器 .uri("lb://service")) .build(); } @Bean public CorsConfigurationSource corsConfigSource() { CorsConfiguration corsConfig = new CorsConfiguration(); corsConfig.addAllowedOrigin("*"); corsConfig.addAllowedMethod("*"); corsConfig.addAllowedHeader("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfig); return source; } ``` 这样就可以在 Spring Cloud Gateway配置跨域了。需要注意的是,由于 Spring Cloud Gateway 是基于 Spring WebFlux 开发的,因此跨域的配置方式与传统的 Spring MVC 不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值