目標
- 了解 SGC 啟動加載流程,網關初始化;
- 分析核心組件構建原理;
- 主線(乃道的博客為抓手)
記錄
添加 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
查看所有 globalfilters: http://localhost:8080/actuator/gateway/globalfilters
目錄結構分析
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
啟動加載流程
- 根據屬性加載,初始化 Netty HttpClient 以及對應的 Netty Bean,以及初始化了NettyRoutingFilter.
- 初始化對應的 GlobalFilter
- 初始化對應的 Filter
- 初始化對應的 Predicate
- 初始化 RouteDefinitionLocator ,收集所有的路由表 GatewayAutoConfiguration#routeDefinitionLocator,這個過程中包括初始化所有的 RoutePredicateFactory
- 初始化 RouteLocator ,根據上一步得到的RouteDedinitionLocator
- 初始化 GatewayControllerEndpoint
- 初始化 FilteringWebHandler ,通過上面收集好的 GlobalFilter,在此過程中並對 GlobalFilter 排序
- 初始化 GlobalCorsProperties
- 初始化 routePredicateHandlerMapping 這個是整個核心入口
實際執行流程
getHandlerInternal 入口
我們可以根據官網的示意圖,可知程序的入口是通過 RoutePredicateHandlerMapping 核心處理,因此我們在 對應的 getHandlerInternal 方法打斷點,查看請求流程;
根據堆棧我們可以清楚看到實際請求時,DispatcherHandler 到 AbstractHandlerMapping 然后 RoutePredicateHandlerMapping 最后執行到 getHandlerInternal;
exchange 理解
貫穿程序請求的上下文中,我們一直會看到 exchange 的變量,ServerWebExchange 默認實現是 DefaultServerWebExchange,我們從截圖中可以看出這個變量不僅包含請求的上下文,還包括 applicationContext,相當於用啥都不愁了。