Spring-Cloud-Gateway-基礎篇(一)


目標

記錄

添加 Actuator 監控

Maven 依賴

<dependency>   
    <groupId>org.springframework.boot</groupId>   
    <artifactId>spring-boot-starter-actuator</artifactId> 
</dependency>

配置文件修改

management:
  endpoint:
    gateway:
      enabled: true
  endpoints:
    web:
      exposure:
        include: '*'

數據訪問

查看所有 routes: http://localhost:8080/actuator/gateway/routes

image-20210111133530226

查看所有 globalfilters: http://localhost:8080/actuator/gateway/globalfilters

image-20210111133541930

目錄結構分析

Spring Cloud Gateway Core

  • 工程代碼中顯示這個項目已經棄用

spring-cloud-gateway-dependencies

  • 都是一些依賴,沒有代碼

spring-cloud-gateway-mvc

  • 對於 Spring-MVC 的支持

spring-cloud-gateway-webflux

  • 對於 webflux 的支持

spring-cloud-gateway-server

  • 核心中的核心
  • 所有關鍵邏輯的地方

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.GatewayHystrixCircuitBreakerAutoConfiguration,\\
org.springframework.cloud.gateway.config.GatewayResilience4JCircuitBreakerAutoConfiguration,\\
org.springframework.cloud.gateway.config.GatewayLoadBalancerClientAutoConfiguration,\\
org.springframework.cloud.gateway.config.GatewayNoLoadBalancerClientAutoConfiguration,\\
org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration,\\
org.springframework.cloud.gateway.config.GatewayRedisAutoConfiguration,\\
org.springframework.cloud.gateway.discovery.GatewayDiscoveryClientAutoConfiguration,\\
org.springframework.cloud.gateway.config.SimpleUrlHandlerMappingGlobalCorsAutoConfiguration,\\
org.springframework.cloud.gateway.config.GatewayReactiveLoadBalancerClientAutoConfiguration

org.springframework.boot.env.EnvironmentPostProcessor=\\
org.springframework.cloud.gateway.config.GatewayEnvironmentPostProcessor

核心配置類(spring-cloud-gateway-server)

基礎配置

  • GatewayAutoConfiguration
  • 功能:加載網關基礎模塊
  • 基礎模塊包塊:
    • GatewayActuatorConfiguration
    • HystrixConfiguration
    • NettyConfiguration

響應式或非響應式模式配置

  • GatewayClassPathWarningAutoConfiguration
  • 功能:主要掃描確定是使用 Spring-MVC 的模式,還是 Webflux 的格式。
  • 要點:
    • 確保在 GatewayAutoConfiguration 加載前加載
    • 當存在 \(org.springframework.web.servlet.DispatcherServlet\) 這個類時,加載 \(SpringMvcFoundOnClasspathConfiguration\)
    • 當不存在 \(org.springframework.web.reactive.DispatcherHandler\) 加載 \(WebfluxMissingFromClasspathConfiguration\)

負載均衡配置

  • GatewayLoadBalancerClientAutoConfiguration
  • GatewayNoLoadBalancerClientAutoConfiguration
  • GatewayReactiveLoadBalancerClientAutoConfiguration

監控配置

  • GatewayMetricsAutoConfiguration

Redis 配置

  • GatewayRedisAutoConfiguration

限流相關配置

  • GatewayResilience4JCircuitBreakerAutoConfiguration
  • GatewayHystrixCircuitBreakerAutoConfiguration

URLMapping 配置

  • SimpleUrlHandlerMappingGlobalCorsAutoConfiguration

啟動加載流程

image-20210111133312255

  • 根據屬性加載,初始化 Netty HttpClient 以及對應的 Netty Bean,以及初始化了NettyRoutingFilter.
  • 初始化對應的 GlobalFilter
  • 初始化對應的 Filter
  • 初始化對應的 Predicate
  • 初始化 RouteDefinitionLocator ,收集所有的路由表 GatewayAutoConfiguration#routeDefinitionLocator,這個過程中包括初始化所有的 RoutePredicateFactory
  • 初始化 RouteLocator ,根據上一步得到的RouteDedinitionLocator
  • 初始化 GatewayControllerEndpoint
  • 初始化 FilteringWebHandler ,通過上面收集好的 GlobalFilter,在此過程中並對 GlobalFilter 排序
  • 初始化 GlobalCorsProperties
  • 初始化 routePredicateHandlerMapping 這個是整個核心入口

實際執行流程

getHandlerInternal 入口

我們可以根據官網的示意圖,可知程序的入口是通過 RoutePredicateHandlerMapping 核心處理,因此我們在 對應的 getHandlerInternal 方法打斷點,查看請求流程;

image-20210111133243864

根據堆棧我們可以清楚看到實際請求時,DispatcherHandler 到 AbstractHandlerMapping 然后 RoutePredicateHandlerMapping 最后執行到 getHandlerInternal;

exchange 理解

貫穿程序請求的上下文中,我們一直會看到 exchange 的變量,ServerWebExchange 默認實現是 DefaultServerWebExchange,我們從截圖中可以看出這個變量不僅包含請求的上下文,還包括 applicationContext,相當於用啥都不愁了。

image-20210111133229221


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM