• Spring Cloud Gateway学习


    1.概念

            Spring Cloud Gateway是Spring Cloud的一个开源API网关项目,用于替换原有的Zuul,基于Spring5.0+Spring Boot2.0+webFlux等技术开发,性能优于Zuul。

    2.为什么需要网关

            业务系统微服务改造后,如何在多个内外部系统之间实现跨系统、跨协议的服务能力开放和分享成为新的挑战:

    • 缺少应对突发流量手段   

            痛点描述:传统方式通过控制入口流量,无法解决个别服务在突发流量压力下不能正常响应的问题,导致异常快速传递到上游服务,最终导致整个系统雪崩。

            解决方案:通过 API 级流量控制、熔断、降级等服务治理功能,可以有效保障电商大促、突发事件等场景下关键服务正常运行,降低系统性风险发生概率。

    • 重复开发通用功能

            痛点描述:服务对外开放需要考虑用户认证、鉴权、限流、监控等一系列通用能力,多个服务需要重复开发相关功能,增加了开发成本,降低了开发效率。

            解决方案:通过统一认证鉴权机制、限流、监控、灰度发布等对外开放服务所需的通用功能,开发人员无需重复开发通用功能,只需专注于业务开发。

    • 非 RESTFUL 接口开放难

            痛点描述:传统基于 Web Service、gRPC 和 Dubbo RPC 等非 RESTFUL 接口标准开发的应用,无法直接对外暴露服务。

            解决方案:通过协议转化功能,支持将 Web Service、gRPC 和 Dubbo RPC 等接口以 RESTFUL 接口形式对外开放,用户无需适配开发新的接口标准。

    • 缺少API灰度发布机制

           痛点描述:随着业务发展不可避免多个版本同时在线的情况,存在多个版本管理、灰度测试等一系列问题,缺少 API 灰度发布机制,严重影响管理效率。

            解决方案:通过服务多个版本发布,支持配置各版本流量百分比、根据请求参数路由请求到不同版本,满足不同灰度版本要求。

    3.核心元素

    3.1路由

    3.1.1概念

            网关的基本组成,由路由id(唯一)以及一系列的断言与过滤器组成。

    3.1.2基本组成

    • id:路由的唯一标识
    • uri:请求最终被转发到的目标地址
    • order:路由优先级,数字越小优先级越高
    • predicates:断言数组,如果返回值为true,则转发请求到uri指定的服务
    • filters:过滤器数组,在请求传递过程中,对请求做一些修改

    3.2断言

    3.2.1概念

            Predicate是来自于Java8之后提供的接口,接受一个输入参数,返回一个布尔值结果,可通过使用“与或非”进行组合,是路由如何进行转发的判断条件。

    3.2.2内置的断言

    • The After Route Predicate Factory
    • The Before Route Predicate Factory
    • The Between Route Predicate Factory
    • The Cookie Route Predicate Factory
    • The Header Route Predicate Factory
    • The Host Route Predicate Factory
    • The Method Route Predicate Factory
    • The Path Route Predicate Factory
    • The Query Route Predicate Factory
    • The RemoteAddr Route Predicate Factory
    • The Weight Route Predicate Factory
    • The XForwarded Remote Addr Route Predicate Factory

    3.3过滤器

    3.3.1概念

            路由转发请求时所经过的一系列过滤逻辑。

    3.3.2生命周期

    • PRE:这种过滤器在请求被路由之前调用,一般可用来做身份验证、鉴权、流量监控、日志输出、协议转换等。
    • POST:这种过滤器在路由到微服务以后执行,一般用来为响应添加标准的HTTP Header,日志输出、流量监控、收集统计信息等

    3.3.3作用范围

    • 局部过滤器GatewayFilter:作用于单个路由或者一组路由。
    • 全局过滤器GlobalFilter:作用于所有的路由,多个GlobalFilter可以通过@Order或者getOrder()指定执行顺序,order值越小优先级越高。

    4.核心功能

    • API 全生命周期管理:支持 API 发布、API 下线、API 版本管理等生命周期管理功能。
    • 统一认证鉴权:支持 AK/SK、JWT 、OAuth2 等认证方式,提供网关、服务和 API 级鉴权管理功能。
    • 服务治理:支持多场景流控、静态/动态降级、超时重试、缓存和熔断等功能。
    • 服务路由:支持根据请求方法、Path、Host、Header、Query String 动态路由,以及负载均衡和版本分流。
    • 安全防护:支持 IP 黑白名单,支持 CORS 和 JSONP 跨域访问标准。
    • 协议转换:支持 Web Service 、gRPC 和 Dubbo RPC 接口转为 RESTFUL 接口对外开放。
    • 数据转换:支持请求 Header、 Query String 转换,以及请求 Path 重写。
    • 应用集成:支持以低代码可视化方式编排上百种协议类型的 API。
    • 运维监控:支持查看服务或接口调用记录和调用统计,支持自定义配置告警规则。

     5.工作流程

    • 1)客户端向Gateway发送请求,NettyWebServer接收到请求,其持有ReactorHttpHandlerAdapter,ReactorHttpHandlerAdapter#apply先将接收到的HttpServerRequest或者最终需要返回的HttpServerResponse包装转换为ReactorServerHttpRequest和ReactorServerHttpResponse,然后将它们传给HttpWebHandlerAdapter处理。
    • 2)HttpWebHandlerAdapter#handle犯法通过createExchange构造网关上下文ServerWebExchange,然后通过getDelegate方法通过委托的方式获取一些列需要处理的WebHandler。
    • 3)ExceptionHandlingWebHandler#handle处理全局异常,委托org.springframework.web.server.handler.FilteringWebHandler执行handle。
    • 4)org.springframework.web.server.handler.FilteringWebHandler执行handle。
    • 5)网关上下文被传递到DispatchHandler,DispatchHandler接收到请求,匹配HandlerMapping,此处会匹配到RoutePredicateHandlerMapping。
    • 6)RoutePredicateHandlerMapping遍历所有的route规则的predicate遍历一遍,看哪个predicate能够命中,返回org.springframework.cloud.gateway.handler.FilteringWebHandler。
    • 7)SimpleHandlerAdapter#handler执行FilteringWebHandler获取局部和全局过滤器,将两种过滤器放到一起组成过滤器链DefaultGatewayFilterChain,DefaultGatewayFilterChanin#filter然后执行过滤器链。
    • 8)HandlerResultHandler#handleResult处理结果并响应给客户端。

    6.典型应用场景

    • 对外能力开放:将企业内部服务能力以标准 API 的形式开放给外部合作伙伴或第三方,与外部用户可管可控地共享服务、能力和数据,达成深度合作,共建新生态。
    • 内部业务集成:规范系统间 API 接口,快速完成企业内部系统的解耦及前后端分离,实现可观可控的相互访问。
    • 交付标准化:实现软件交付的标准化,促进交付质量,并确保软件可迭代。

  • 相关阅读:
    Day08-尚品汇-放大镜操作上
    成都易佰特的坑——E103-W06
    【无标题】
    MATLAB if...else...end 语句
    【Seata源码学习 】篇三 seata客户端全局事务开启、提交与回滚
    研究 | CT图像迭代重建算法研究进展
    redis利用总结
    vivado 时序约束
    无代码基础?快来试试这款无需会代码也能轻松上手的数据可视化软件吧
    IDEA 打开项目后看不到项目结构怎么办?
  • 原文地址:https://blog.csdn.net/liulianglin/article/details/125891200