1.概念
Spring Cloud Gateway是Spring Cloud的一个开源API网关项目,用于替换原有的Zuul,基于Spring5.0+Spring Boot2.0+webFlux等技术开发,性能优于Zuul。
2.为什么需要网关
业务系统微服务改造后,如何在多个内外部系统之间实现跨系统、跨协议的服务能力开放和分享成为新的挑战:
痛点描述:传统方式通过控制入口流量,无法解决个别服务在突发流量压力下不能正常响应的问题,导致异常快速传递到上游服务,最终导致整个系统雪崩。
解决方案:通过 API 级流量控制、熔断、降级等服务治理功能,可以有效保障电商大促、突发事件等场景下关键服务正常运行,降低系统性风险发生概率。
痛点描述:服务对外开放需要考虑用户认证、鉴权、限流、监控等一系列通用能力,多个服务需要重复开发相关功能,增加了开发成本,降低了开发效率。
解决方案:通过统一认证鉴权机制、限流、监控、灰度发布等对外开放服务所需的通用功能,开发人员无需重复开发通用功能,只需专注于业务开发。
痛点描述:传统基于 Web Service、gRPC 和 Dubbo RPC 等非 RESTFUL 接口标准开发的应用,无法直接对外暴露服务。
解决方案:通过协议转化功能,支持将 Web Service、gRPC 和 Dubbo RPC 等接口以 RESTFUL 接口形式对外开放,用户无需适配开发新的接口标准。
痛点描述:随着业务发展不可避免多个版本同时在线的情况,存在多个版本管理、灰度测试等一系列问题,缺少 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 接口,快速完成企业内部系统的解耦及前后端分离,实现可观可控的相互访问。
- 交付标准化:实现软件交付的标准化,促进交付质量,并确保软件可迭代。