Spring-Cloud-Gateway初始化

Spring-Cloud項目使用EnableAutoConfiguration注解自動
初始化配置信息,Spring-Cloud-Gateway同樣,Spring-Cloud-Gateway下的spring.factories(在包spring-cloud-gateway-core)如下:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
//依賴包的校驗配置
org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration,\
//網(wǎng)關(guān)的核心配置
org.springframework.cloud.gateway.config.GatewayAutoConfiguration,\
//負(fù)載均衡相關(guān)依賴配置信息
org.springframework.cloud.gateway.config.GatewayLoadBalancerClientAutoConfiguration,\
//流控的依賴配置信息
org.springframework.cloud.gateway.config.GatewayRedisAutoConfiguration,\
//注冊中心相關(guān)的依賴配置
org.springframework.cloud.gateway.discovery.GatewayDiscoveryClientAutoConfiguration

配置功能

分析配置功能前先了解下springboot常用的注解的含義

執(zhí)行順序
@AutoConfigureAfter:在指定的配置類初始化后再加載
@AutoConfigureBefore:在指定的配置類初始化前加載
@AutoConfigureOrder:數(shù)越小越先初始化

條件配置
@ConditionalOnClass : classpath中存在該類時起效
@ConditionalOnMissingClass : classpath中不存在該類時起效
@ConditionalOnBean : DI容器中存在該類型Bean時起效
@ConditionalOnMissingBean : DI容器中不存在該類型Bean時起效
@ConditionalOnSingleCandidate : DI容器中該類型Bean只有一個或@Primary的只有一個時起效
@ConditionalOnExpression : SpEL表達(dá)式結(jié)果為true時
@ConditionalOnProperty : 參數(shù)設(shè)置或者值一致時起效
@ConditionalOnResource : 指定的文件存在時起效
@ConditionalOnJndi : 指定的JNDI存在時起效
@ConditionalOnJava : 指定的Java版本存在時起效
@ConditionalOnWebApplication : Web應(yīng)用環(huán)境下起效
@ConditionalOnNotWebApplication : 非Web應(yīng)用環(huán)境下起效

  1. GatewayClassPathWarningAutoConfiguration配置

GatewayClassPathWarningAutoConfiguration配置用于檢查項目是否正確導(dǎo)入 spring-boot-starter-webflux 依賴,而不是錯誤導(dǎo)入 spring-boot-starter-web 依賴,同時 GatewayClassPathWarningAutoConfiguration配置在EnableAutoConfiguration配置加載前加載
接下來我看代碼如何實現(xiàn)

@Configuration
//執(zhí)行順序注解
//當(dāng)前注解標(biāo)識需要在GatewayAutoConfiguration前加載此配置
@AutoConfigureBefore(GatewayAutoConfiguration.class)
public class GatewayClassPathWarningAutoConfiguration {
    @Configuration
    //條件判斷注解
    //classpath中存在org.springframework.web.servlet.DispatcherServlet時起效,標(biāo)識項目導(dǎo)入了spring-boot-starter-web包
    @ConditionalOnClass(name = "org.springframework.web.servlet.DispatcherServlet")
    protected static class SpringMvcFoundOnClasspathConfiguration {

        public SpringMvcFoundOnClasspathConfiguration() {
           //當(dāng)前項目導(dǎo)入了spring-boot-starter-web依賴時,打印警告日志
            log.warn(BORDER+"Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. "+
                    "Please remove spring-boot-starter-web dependency."+BORDER);
        }

    }
    @Configuration
    //條件判斷注解
    //classpath中不存在org.springframework.web.reactive.DispatcherHandler時起效,標(biāo)識項目未導(dǎo)入了spring-boot-starter-webflux包
    @ConditionalOnMissingClass("org.springframework.web.reactive.DispatcherHandler")
    protected static class WebfluxMissingFromClasspathConfiguration {
        public WebfluxMissingFromClasspathConfiguration() {
      //當(dāng)前項目未導(dǎo)入了boot-starter-webflux依賴時,打印警告日志
            log.warn(BORDER+"Spring Webflux is missing from the classpath, which is required for Spring Cloud Gateway at this time. "+
                    "Please add spring-boot-starter-webflux dependency."+BORDER);
        }

    }
}
  1. GatewayLoadBalancerClientAutoConfiguration

GatewayLoadBalancerClientAutoConfiguration配置作用是初始化 LoadBalancerClientFilter 路由的負(fù)載均衡攔截器

@Configuration
//條件判斷注解
//classpath中存在LoadBalancerClient和RibbonAutoConfiguration和DispatcherHandler時此配置起效
@ConditionalOnClass({LoadBalancerClient.class, RibbonAutoConfiguration.class, DispatcherHandler.class})
//執(zhí)行順序注解
@AutoConfigureAfter(RibbonAutoConfiguration.class)
public class GatewayLoadBalancerClientAutoConfiguration {
    // GlobalFilter beans
    @Bean
    //條件判斷注解
    //DI容器中存在LoadBalancerClient類型Bean時起效
    @ConditionalOnBean(LoadBalancerClient.class)
    public LoadBalancerClientFilter loadBalancerClientFilter(LoadBalancerClient client) {
        return new LoadBalancerClientFilter(client);
    }
}
  1. GatewayRedisAutoConfiguration

GatewayRedisAutoConfiguration 配置作用是初始化初始化 RedisRateLimiter 限流功能的RequestRateLimiterGatewayFilterFactory 基于 RedisRateLimiter 實現(xiàn)網(wǎng)關(guān)的限流功能,代碼略

  1. GatewayAutoConfiguration

GatewayAutoConfiguration配置是Spring Cloud Gateway 核心配置類,初始化如下 :

  • NettyConfiguration 底層通信netty配置
  • GlobalFilter (AdaptCachedBodyGlobalFilter,RouteToRequestUrlFilter,F(xiàn)orwardRoutingFilter,F(xiàn)orwardPathFilter,WebsocketRoutingFilter,WeightCalculatorWebFilter等)
  • FilteringWebHandler
  • GatewayProperties
  • PrefixPathGatewayFilterFactory
  • RoutePredicateFactory
  • RouteDefinitionLocator
  • RouteLocator
  • RoutePredicateHandlerMapping 查找匹配到 Route并進(jìn)行處理
  • GatewayWebfluxEndpoint 管理網(wǎng)關(guān)的 HTTP API
@Configuration
//條件注解
//通過 spring.cloud.gateway.enabled配置網(wǎng)關(guān)的開啟與關(guān)閉
//matchIfMissing = true => 網(wǎng)關(guān)默認(rèn)開啟。
@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMissing = true)
@EnableConfigurationProperties
@AutoConfigureBefore(HttpHandlerAutoConfiguration.class)
@AutoConfigureAfter({GatewayLoadBalancerClientAutoConfiguration.class, GatewayClassPathWarningAutoConfiguration.class})
@ConditionalOnClass(DispatcherHandler.class)
public class GatewayAutoConfiguration {
    @Configuration
    //當(dāng)classpath中存在HttpClient起效
    @ConditionalOnClass(HttpClient.class)
    protected static class NettyConfiguration {
        .....略
    }
    
    //加載配置beans
    // ConfigurationProperty beans
    @Bean
    public GatewayProperties gatewayProperties() {
        return new GatewayProperties();
    }
    @Bean
    public SecureHeadersProperties secureHeadersProperties() {
        return new SecureHeadersProperties();
    }
    
    // GlobalFilter beans
    //加載全局的攔截器
    @Bean
    public AdaptCachedBodyGlobalFilter adaptCachedBodyGlobalFilter() {
        return new AdaptCachedBodyGlobalFilter();
    }

    @Bean
    public RouteToRequestUrlFilter routeToRequestUrlFilter() {
        return new RouteToRequestUrlFilter();
    }

    @Bean
    @ConditionalOnBean(DispatcherHandler.class)
    public ForwardRoutingFilter forwardRoutingFilter(DispatcherHandler dispatcherHandler) {
        return new ForwardRoutingFilter(dispatcherHandler);
    }

    @Bean
    public ForwardPathFilter forwardPathFilter() {
        return new ForwardPathFilter();
    }

    @Bean
    public WebSocketService webSocketService() {
        return new HandshakeWebSocketService();
    }
    @Bean
    public WebsocketRoutingFilter websocketRoutingFilter(WebSocketClient webSocketClient,
        return new WebsocketRoutingFilter(webSocketClient, webSocketService, headersFilters);
    }
    @Bean
    public WeightCalculatorWebFilter weightCalculatorWebFilter(Validator validator) {
        return new WeightCalculatorWebFilter(validator);
    }
}
  1. GatewayDiscoveryClientAutoConfiguration

GatewayDiscoveryClientAutoConfiguration配置的作用是初始化配置路由中的注冊發(fā)現(xiàn)服務(wù)信息

@Configuration
//同4
@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMissing = true)
@AutoConfigureBefore(GatewayAutoConfiguration.class)
@ConditionalOnClass({DispatcherHandler.class, DiscoveryClient.class})
@EnableConfigurationProperties
public class GatewayDiscoveryClientAutoConfiguration {

    @Bean
    //當(dāng)classpath中存在DiscoveryClient起效
    @ConditionalOnBean(DiscoveryClient.class)
    //通過spring.cloud.gateway.discovery.locator.enabled配置注冊中心查找的開啟與關(guān)閉
    @ConditionalOnProperty(name = "spring.cloud.gateway.discovery.locator.enabled")
    public DiscoveryClientRouteDefinitionLocator discoveryClientRouteDefinitionLocator(
            DiscoveryClient discoveryClient, DiscoveryLocatorProperties properties) {
        return new DiscoveryClientRouteDefinitionLocator(discoveryClient, properties);
    }
}

通過自動加載初始化上述五個配置實例Spring-Cloud-Gateway就完成自身的信息加載和初始化工作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容