Spring Cloud Gateway是Spring官方自己推出的网关组件,基于Spring5,Spring Boot 2.0 和 Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的API路由管理方式,作为Spring Cloud全家桶替代Zuul的产品。想一探它的神秘面容嘛?学习源码会收获哪些?想知道的话,就跟我走吧
前言
最近工作中,使用到了Spring Cloud Gateway,由于它相关的文档较少,工作中又需要用到一些高级特性,决定对它的源码进行学习,版本为v2.1.3.RELEASE。通过对源码的学习,不仅对Spring Cloud Gateway的原理,有了更深的了解,还对Spencer Gibb大师的编码深深吸引,本系列博文不仅带大家了解Spring Cloud Gateway的工作原理,还提炼出它所用到的技术、采用的设计模式、独具匠心的代码。本人水平有限,如有错误之处,请大家多多指出,感谢!
揭开SpringCloudGateway神秘面纱
Spring Cloud Gateway是Spring官方自己推出的网关组件,基于Spring5,Spring Boot 2.0 和 Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的API路由管理方式。至于Spring Cloud Gateway与 Zuul的比较,孰优孰劣的文章,网上有比较好的介绍,本文不再陈述。
基本概念
- Route(路由):路由是网关最基本的信息载体。它由id,目标URI,谓语列表,过滤器列表组成。如果断言为真,则路由匹配。
- Predicate(断言):断言是Java8中的Predicate。输入类型为ServerWebExchange。断言的职责是用于匹配HTTP请求,包括Header、Parameter等。Spring Cloud Gateway提供了很多断言规则,可以通过配置文件定义规则也可以通过fluent API定义。
- Filter(过滤器):过滤器负责富化请求(Request)或者响应(Response),分为全局过滤器(GlobalFilter)和普通过滤器(GatewayFilter),Spring Cloud Gateway提供了很多内置的过滤器,也可以自定义过滤器。配置文件和fluent API均可定义。
工作流程
客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
源码准备
克隆源码到本地:git clone https://github.com/spring-cloud/spring-cloud-gateway.git
切换到v2.1.3.RELEASE: git checkout tag_name ,验证是否切换成功,git branch,显示如下已切换成功。
1 | * (HEAD detached at v2.1.3.RELEASE) |
把代码导入到IDEA IDE。看到Spring Cloud Gateway的工程结构,spring-cloud-gateway-core就是接下来主要学习的网关核心模块,上一个章节讲到的所有内容,都在Core模块中,Core模块中最核心的包,就是
- config包:Gateway所有的配置,Bean的创建,是Gateway服务启动的必备条件。
- handler包:包含FilteringWebHandler类,RoutePredicateHandlerMapping类,和所有的内置断言类。这个包的功能是处理客户端请求并匹配出Route对象。
- filter包:包含了Gateway所有的过滤器实现。在Handler匹配到路由之后,ServerWebExchange对象就会流转到Filter集合中,最后经过层层过滤富化的Request对象会抵达Target URI。
- route包:定义了RouteDefinition、Route、RouteLocator,对Gateway的资源进行了描述。
在本地启动SpringCloudGateway也十分容易,在spring-cloud-gateway-sample包中,官方提供了org.springframework.cloud.gateway.sample.GatewaySampleApplication类,可以直接本地启动SpringCloudGateway应用,到此所有环节都已准备完毕。
Spring Cloud Gateway源码学习收益
Gateway的源码大多数是由Spencer Gibb 编写,他是Spring 技术布道师,Spring Cloud核心项目的联合创始人。Gateway的采用了先进的技术,运用的大量的设计模式,优雅的代码风格,阅读即是一种享受,抓住其中一点都可以反复推敲,渐入佳境。
源码中采用了如下的设计模式:
- 建造者模式(Builder Pattern)
- 工厂模式(Factory Pattern)
- 责任链模式(Chain of Responsibility Pattern)
- 观察者模式(Observer Pattern)
- 服务定位器模式(Service Locator Pattern)
Gateway依赖的技术
- SpringBoot
- Spring5.0
- WebFlux
- Reactor
- Java8
#参考文档
Reactive programming 一种技术 各自表述