• 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

  • 相关阅读:
    IP掩码的作用
    linux shell 笔记
    ubuntu apt-get Failed to fetch Temporary failure resolving 'security.ubuntu.com'
    ubuntu 16.04 & 18.04 远程桌面使用
    取消Ubuntu开机硬盘自检
    linux shell 脚本输入参数解析
    Ubuntu 16.04 + python3 源码 安装+使用labelImg最新版
    用tinyxml2读写xml文件_C++实现
    常用工具问题及解决方案
    可视化调试工具
  • 原文地址:https://www.cnblogs.com/holddie/p/springcloudgatewayji-chu-pian-yi.html
Copyright © 2020-2023  润新知